diff --git a/_data/authors.yml b/_data/authors.yml index d7b4e47..46a843a 100755 --- a/_data/authors.yml +++ b/_data/authors.yml @@ -1178,3 +1178,8 @@ Rohanrao02: github: Rohanrao02 author_image: 'blog-author.jpg' email: "rohanrao.jh@gmail.com" +Tejas000: + name: Tejas Sankpal + github: Tejas000 + author_image: 'blog-author.jpg' + email: "sankpaltejas343@gmail.com" diff --git a/_posts/2022-04-11-consensus-mechanism-in-blockchain.md b/_posts/2022-04-11-consensus-mechanism-in-blockchain.md new file mode 100644 index 0000000..ca62336 --- /dev/null +++ b/_posts/2022-04-11-consensus-mechanism-in-blockchain.md @@ -0,0 +1,71 @@ +--- +layout: post +title: "Consensus Mechanism in Blockchain" +author_github: Tejas000 +date: 2022-04-11 00:00:00 +image: '/assets/img/' +description: 'A Brief description of two important consensus mechanisms; proof-of-work and proof-of-stake' +tags: +- IEEE NITK +- CompSoc +- Blockchain +categories: +- compsoc +github_username: 'Tejas000' +use_math: true +--- +# CONSENSUS MECHANISM + +The Blockchain is an undeniably ingenious invention, By definition,**_ Blockchain_** is a continuously growing list of records, called blocks, which are linked and secured using cryptography. Each block typically contains a cryptographic hash of the previous block, a timestamp, and transaction data. By design, a blockchain is inherently resistant to modification of the data. It is “an open, distributed ledger that can record transactions between two parties efficiently and in a verifiable and permanent way”. This technology has led to various new inventions in the cryptocurrency marketplace such as Bitcoin, Ethereum, Ripple, and many others, all of these technologies use DLT (Distributed Ledger Technology) as their core foundation, For use as a distributed ledger, a blockchain is typically managed by a peer-to-peer network collectively adhering to a protocol for validating new blocks. + +Thus, Blockchains in essence are distributed databases, the network's nodes must reach an agreement on the network's current state. This agreement is achieved using consensus mechanisms. + + +## NEED FOR CONSENSUS MECHANISM + +In a centralized organization, all the decisions are taken by the leader or a board of decision-makers. This isn’t possible in a blockchain because a blockchain has no “leader”. For the blockchain to make decisions, they need to come to a consensus using “**consensus mechanisms**”. Consensus algorithms check the integrity of new blocks and past blocks + +Distributed systems rely on large numbers of autonomous authorities to cooperate in the maintenance of a single network. These distinct nodes must have a computational mechanism by which to arrive at an agreement on what the most recent and accurate record of data is. + +Over the years different kinds of consensus mechanisms were devised based on different principles, let’s take a look at 2 of the most important mechanisms; + + +## PROOF OF WORK: + + The Blockchain network is shared by numerous users who do transactions. These transactions need to be further validated to add them to the block and then to the chain. This task is carried out by miners (The validators), The miners validate a set of transactions from the transaction pool, verify them, bundle them together in a block, and add this block to the current blockchain. But in order to prevent any forgery and double-spending and to agree upon the correct sequence of the blocks, we need a consensus mechanism. That’s where proof of work comes into the picture. + +In proof of work, miners compete to add the next block (a set of transactions) in the chain by racing to solve an extremely difficult cryptographic puzzle. The miners calculate a complex mathematical puzzle, called the NONCE. + +transactions are processed into blocks. Each block has a: + +block difficulty – for example: 3,324,092,183,262,715 + +mixHash – for example: 0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29 + +nonce – for example: 0xd3ee432b4fb3d26b + +The proof-of-work protocol requires miners to go through an intense race of trial and error to find the nonce for a block. Only blocks with a valid nonce can be added to the chain. The miner that gets the valid nonce first gets to add the next block in the blockchain. + +The proof-of-work protocol follows the longest chain rule. + +_“ The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. — [Satoshi Nakamoto](https://nakamotoinstitute.org/bitcoin/)”_ + +All the nodes trust the longest chain in a blockchain without trusting each other directly. The objective of proof-of-work is to extend the chain. The longest chain is most believable as the valid one because it's had the most computational work done. It's nearly impossible to create new blocks that erase transactions, create fake ones, or maintain a second chain. That's because a malicious miner would need to always solve the block nonce faster than everyone else. + +To consistently create malicious yet valid blocks, you'd need over 51% of the network mining power to beat everyone else. You'd need a lot of computing power to be able to do this amount of "work". And the energy spent might even outweigh the gains you'd make in an attack. + + +## PROOF OF STAKE + +POS uses a different approach compared to POW. The miner commits the currency ( stake) he has to the blockchain network to get an opportunity to mine. A chosen random miner with a stake validates the block transaction. If a miner cannot commit to the stake, the miner can join a stake pool to participate in the mining. + +Unlike proof-of-work, validators don't need to use significant amounts of computational power because they're selected at random and aren't competing. They don't need to mine blocks; they just need to create blocks when chosen and validate proposed blocks when they're not. This validation is known as attesting. Validators get rewards for proposing new blocks and for attesting to ones they've seen. + +If you attest to malicious blocks, you lose your stake. + + +## A COMPARISON + +Energy consumption is one major difference between the two consensus mechanisms. Because proof-of-stake blockchains don’t require miners to spend electricity on duplicative processes (competing to solve the same puzzle), proof of stake allows networks to operate with substantially lower resource consumption. + +Both consensus mechanisms have economic consequences that penalize network disruptions and malicious actors. In proof of work, the penalty for miners submitting invalid information, or blocks, is the sunk cost of computing power, energy, and time. In proof of stake, the validators’ staked crypto funds serve as an economic incentive to act in the network’s best interests. In the case that a validator accepts a bad block, a portion of their staked funds will be “slashed” as a penalty. The amount that a validator can be slashed depends on the network diff --git a/assets/img/authors/tejas sankpal.jpg b/assets/img/authors/tejas sankpal.jpg new file mode 100644 index 0000000..0ef4655 Binary files /dev/null and b/assets/img/authors/tejas sankpal.jpg differ diff --git a/blog/3d-printing/index.html b/blog/3d-printing/index.html new file mode 100644 index 0000000..c3b042e --- /dev/null +++ b/blog/3d-printing/index.html @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

3-D Printing-A world beyond 2D

+ +

The emerging world of 3D printing

+ +

3D Printing is something all of us have come across in today’s world. It +may seem like a new technology but history points out that it is no +recent development.[ In fact, 3D printing has its roots in the 1980s. In +1984, Chuck Hull, invented a process called “stereolithography” which +used UV lasers to solidify photopolymer that created 3D parts layer by +layer. A technology which initially began with the aim of prototyping +has today secured its place in the manufacturing industry. Today its use +is far more widespread than we can possibly imagine. Did you know 3D +printing techniques have been featured in movies such as IronMan, The +Hobbit, Jurassic Park, Avatar, The Muppets, Terminator Salvation, Real +Steel, Paranorman, The Avengers and Paranorman to design some props. +These are some lesser known facts about 3D printing. To know more about +this very popular technology read on. :)

+ +

3D Printer

+ +

How does 3D printing work?

+ +

3D printing is the process of making a three-dimensional object from a +3D model or other electronic data source.

+ +

Every 3D print starts as a digital 3D design file – like a blueprint – +for a physical object. Trying to print without a design file is like +trying to print a document on a sheet of paper without a text file. This +design file is sliced into thin layers which are then sent to the 3D +printer.

+ +

3D printable models can be created with a computer-aided design package +or a 3D scanner. The printing can take hours to complete depending on +the size, and the printed objects are often post-processed to reach the +desired finish.

+ +

Successive layers of a given material (in liquid, powder, paper or sheet +form) are applied under computer control using a 3D printer. Since +layers are added, it is often also referred to as additive +manufacturing.  

+ +

Materials used +vary by printer type, ranging from plastics to rubber, sandstone, metals +and alloys - with more and more materials appearing on the market every +year. Of late, 3D printing has also been used to make human body parts, +using human tissue !!

+ +

The applications of 3-D printing are widespread. From industrial +applications in manufacturing, prototyping and customization to +Biomedical devices like dental implants and prototypes of body ,3D +printing seems to be the new kid on the block ……

+ +

Recent Developments in 3D printing

+ +
    +
  • There are now 3D printers to print very long objects or multiple objects in the same print job. An extension of this has led to 3D printing on a moving platform. As the object is completed, it moves down the belt and then pops off the belt when it is done.
  • +
  • 3D printers can be controlled remotely and the printers can be operated as “lights out manufacturing”, meaning no one has to be present while the printers do their work
  • +
  • SLS (selective laser sintering) printing - this new technology is able to use a broader range of materials with differing levels of strength, flexibility and stiffness than conventional 3D printers. 
  • +
  • 3D printing is slowly beginning to be used for human body parts. The day is not far when someone when someone will have a 3D printed heart.
  • +
+ +

What does the future hold?

+ +

After successfully establishing a 3D printing technology, there are now +plans to add another dimension to it. Yes, a 4-D printing technology is +in the making. 4D printing is 3D printing +plus another dimension tacked on: the variable element of time. In other +words, 4D printing involves 3D-printing objects that can eventually do +one or both of two things: self-assemble and/or change properties based +upon certain conditions.

+ +

So let’s wait and watch what revolutionary innovations does this new +technology bring along!

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/A-Comprehensive-Guide-To-LiFi/index.html b/blog/A-Comprehensive-Guide-To-LiFi/index.html new file mode 100644 index 0000000..f8976fe --- /dev/null +++ b/blog/A-Comprehensive-Guide-To-LiFi/index.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Introduction

+ +

Li-Fi Visual

+ +

Wouldn’t it be interesting if we could use our everyday LED bulbs as the transmitters of data for wirelessly accessing the internet, instead of Wi-Fi Routers or Cellular Networks? Li-Fi is a technology that does exactly that. Li-Fi was unveiled by Dr. Harald Haas in his iconic 2011 TED Talk entitled Wireless data from every light bulb, where he demonstrated Li-Fi in public for the first time. Li-Fi (which is an acronym for Light Fidelity), is a light-based communication system that is capable of transmitting data at high speeds over the visible, ultraviolet, and infrared spectrums, in contrast with conventional wireless data communication methods (such as Wi-Fi, 4G, etc.) that use the radio frequency spectrum for data transmission.

+ +

Li-Fi is a subset of Optical Wireless Communications (OWC). However, the uniqueness of Li-Fi is brought out in the fact that the same light energy used for illumination, may also be used for communication!

+ +

The use of visible light to transmit data allows Li-Fi to offer several advantages - most notably, a wider bandwidth channel (the visible light spectrum is 2,600 times larger than the entire radio frequency spectrum), the ability to safely and reliably transmit data in areas susceptible to electromagnetic interference due to radio waves (e.g. in aircraft cabins, hospitals, nuclear power plants and many more), and to offer higher transmission speeds (researchers at The University of Oxford and University College, London recently achieved speeds of 224 Gigabits/Second using Li-Fi!).

+ +

How It Works

+ +

A demo of Li-Fi Communication

+
+

Credits: https://www.weforum.org/agenda/2015/10/could-li-fi-be-the-future-of-the-internet/

+
+ +

LED’s are light sources based on semiconductors which can amplify and switch their light intensity rapidly (within nanoseconds, in fact); therefore, LED cells can modulate a massive number of signals per second without the human eye even noticing! Since a robust Li-Fi system requires extremely high rates of light output, this makes LED bulbs ideal for implementing Li-Fi transmission. Communication using Li-Fi is just as seamless as other radio systems, allowing the users to be connected wherever there is Li-Fi enabled light.

+ +

The changes in light intensity from the LED light source are interpreted by the receiving photodiode device. Once the electronic signal is demodulated, it is converted into a continuous stream of binary data, which is then transferred to the target device.

+ +

A helpful infographic illustrating the working of Li-Fi is attached below:

+ +

How Li-Fi Works?

+
+

Credits:https://www.cdnsol.com/blog/li-fi-light-based-communication-technology/

+
+ +

You can also watch a live demo of the technology here

+ +

A few questions may pop into your mind when first encountering Li-Fi:

+ +
    +
  1. +

    You may wonder if you’ll need to keep your lights on all the time if you wish to stay connected. The answer is yes. However, due to their very sensitive communication link and great signal to noise ratio, the Li-Fi LEDs can be dimmed to below human visibility while still emitting enough light to carry data!

    +
  2. +
  3. +

    You may ask if it’s just a line-of-sight technology that requires the communicating sender and receiver to have direct visiblity of one another. The answer to this is not really, because any light-transmitting path that exists between the transmitter and receiver can support a Li-Fi link, including reflections from a wall, ceiling or floor. Recently, it has been demonstrated that a signal reflected off a wall can achieve transmit speeds of upto 70 Mbits/sec.

    +
  4. +
  5. +

    What might happen if the light beam is temporarily blocked, or say, if we wish for our mobile devices to be connected to the internet when it’s in our pocket and all external light sources are blocked-off. The answer to this is that it is not necessary for Li-Fi to be the sole active network transmission link at all times: it can work alongside other systems. Currently, mobile devices can transfer between a variety of different communication protocols such as Wi-Fi, 4G, 3G, etc. Li-Fi can seamlessly be integrated with this available stack of communication protocols - when a Li-Fi link is available, it can be used in preference to other links, due to its higher transmission rates.

    + +

    But, think about it - a lot of the times you require high data transfer rates (for example, watching an ultra-HD Youtube video) are inevitably the exact times when you are using the device and it’s in range of a light source within the surroundings. So, more often than not, a Li-Fi signal will usually be available when it is most required.

    +
  6. +
  7. +

    You may be curious about whether other light sources in the room, or say something like strong sunlight, could interfere with Li-Fi communications. Li-Fi relies on detecting rapid changes in light intensity and not on the absolute amount of light falling on it. This means that constant or slowly-varying sources of light can be filtered out. Different room-lighting scenarios have been modelled and tested while a Li-Fi link has been established; it has been shown that it is possible to achieve optimum lighting as well as a clean Li-Fi reception simultaneously in a variety of different scenarios. Li-Fi receivers have also been tested outdoors when exposed to 77,000 lux of sunlight.

    +
  8. +
  9. +

    Finally, you may wonder if Li-Fi is suitable for downloads only - that is, is it also possible for our devices that are receiving data to also send data? +Since Li-Fi is not restricted to visible light for communications, uplink communication can be efficiently done using the infrared spectrum. In 2018, Harald Haas (the inventor of Li-Fi) and his team conducted an experiment in which data was sent at a speed of 1.1 Gbps over a distance of 10 m with an LED of only 4.5 mW optical output power!

    +
  10. +
+ +

Its Advantages over Conventional Information Transfer Methods

+ +

Li-Fi has the advantage of being useful in electromagnetic sensitive areas such as in aircraft cabins, hospitals and nuclear power plants (where RF-based communications are heavily restricted), without causing electromagnetic interference.

+ +

Both Wi-Fi and Li-Fi transmit data over the electromagnetic spectrum, but whereas Wi-Fi utilizes radio waves, Li-Fi uses visible, ultraviolet and infrared waves. This is advantageous because the US Federal Communications Commission has warned of a potential spectrum crisis caused by Wi-Fi being close to full capacity. Li-Fi has almost no limitations on capacity, since the entire visible light + infrared spectrum is about 2,600 times larger than the entire radio frequency spectrum.

+ +

Electromagnetic Spectrum

+
+

Credits:https://www.sciencedirect.com/science/article/pii/S2405428317300151

+
+ +

Security: Since LiFi makes use of the visible light spectrum, it cannot penetrate through optically opaque objects like walls, thus adding another level of defense against unauthorised access (RF-based communication waves can easily pass through walls). Also, the existing security protocols for encryption and authentication in other types of communications can be be applied to Li-Fi systems too.

+ +

Speed & Bandwidth: At the current state-of-the-art, Li-Fi can deliver multiple Gbps of speed in mobile devices. This next generation technology will drive wireless beyond any current capability, opening up unprecedented bandwidth. With a single LED, peak transmission speeds of 8 Gbps have been recorded.

+ +

Li-Fi faster than Wi-Fi

+
+

Credits:https://technicalera21.blogspot.com/2018/12/li-fi-100-times-faster-than-wifi.html

+
+ +

Reliability and Low Latency: Li-Fi provides enhanced reliability enabling interference-free communications. It currently offers latency that is a factor of three times lower than Wi-Fi, which can help enable automation and applications such as Augmented Reality and Virtual Reality.

+ +

Interference Free: Conventional RF is vulnerable to interference from a wide range of devices such as cordless land-line phones, microwaves and neighbouring Wi-Fi networks. Li-Fi signals can be restricted to the area of illumination, which means that interference is much simpler to avoid.

+ +

Commercial Implementations of Li-Fi Technology

+ +
    +
  1. +

    pureLiFi is a manufacturing firm co-founded by the inventor of Li-Fi to commercialize Li-Fi products for their integration with existing LED-lighting systems. It is currently at the forefront of production of Li-Fi related products. pureLiFi demonstrated the first commercially available Li-Fi system, the Li-1st, at the 2014 Mobile World Congress in Barcelona.

    + +

    Since then, the company has gone through multiple iterations of products, each generation improving upon the drawbacks of the previous. Currently, the latest products developed by pureLiFi are the LiFi-XC and the Gigabit Li-Fi Mobile Integration.

    + +

    You can have a look at the history of Li-Fi products developed by pureLiFi here

    +
  2. +
  3. +

    A BMW manufacturing plant located in Munich, Germany tested the operation of Li-Fi in an industrial environment with mobile robots, and the results were very positive. In fact, BMW’s project manager hopes for the scaling-down of Li-Fi transceivers for its widespread adoption in manufacturing plants.

    +
  4. +
  5. In August 2018, Kyle Academy, a secondary school in Scotland, trialed Li-Fi within the school. Eight LiFi-enabled LED ceiling bulbs using rapid on-off patterns were set up to transmit data to USB Li-Fi receivers plugged into the students’ laptops. +Scotland School Li-Fi Test +
    +

    Credits:https://www.fibre-systems.com/news/lifi-technology-piloted-scotland-s-south-ayrshire-school

    +
    +
  6. +
  7. Recently, in June 2019, French company Oledcomm tested their Li-Fi technology at the 2019 Paris Air Show. Oledcomm hopes to collaborate with Air France in the future to test Li-Fi on an aircraft in-flight. In-flight internet (on the infrequent even that it is offered) is often unreliable and slow. Oledcomm wants to take things up a notch by making high-speed LiFi available on Air France and KLM flights, promising in-cabin bandwidths of 100Mbps. Currently, even the fastest WiFi available on domestic airlines in the US stalls at around 15 Mbps. The actual implementation of the the technology, named LiFiMAX, should be available on Air France flights by the end of the year. Here’s a link to a demo of the technology.
  8. +
+ +

Li-Fi in Airplanes

+
+

Credits: https://www.fasttracks.eu/li-fi-technology-how-it-works-and-its-applications/

+
+ +

Using Li-Fi, aircraft passengers can access high-speed internet via lights fitted over their seats. Li-Fi can also be used to integrate the In-Flight Entertainment System with the passengers’ smartphones. Oledcomm also a manufactures a range of Li-Fi devices, such as Li-Fi enabled desk lamps, hospital lights and street lights.

+ +

Current Limitations

+ +

Every new technology has its limitations, and Li-Fi is no exception. A few of the major drawbacks of Li-Fi are:

+ +
    +
  • Opaque obstacles on pathways can affect data transmission. The main problem is that light cannot pass through objects - so if the receiver is blocked in any way, then the high-speed Li-Fi signal will immediately disappear.
  • +
  • Unlike radio waves, light waves do not penetrate through walls and so Li-Fi may potentially have a shorter range compared to Wi-Fi. While this does help improve security, it may also prove to be an annoyance at times.
  • +
  • We still need RF-based Wi-Fi and Cellular Communications, since we cannot have a light bulb that provides data to high-speed moving objects and in other such scenarios where the scope of using of Li-Fi is non-ideal
  • +
+ +

Conclusion and Future Scope

+ +

There is plenty of scope for innovation in the field of Li-Fi communications. Like conventional broadband and Wi-Fi, Li-Fi can also function as a bidirectional communication system. Currently, research is being done looking into using multi-colored RGB (Red - Green - Blue) LED’s at retina size to send and receive a wider range of signals than single-colored white LED’s.

+ +

Li-Fi is an innovative technology that is poised to impact many industries. It can unlock the IoT and Industry 4.0 applications, enable communication between intelligent transport systems, enhance road safety with the driverless car revolution, create secure wireless networks, and can aid in health monitoring of the elderly.

+ +

In the not-too-far future, it isn’t difficult to imagine the modest LED lightbulb serving a multitude of applications - it will be an integral part of the emerging smart cities and smart homes. This could possibly lead to the merging of the lighting industry with the wireless industry. However, an important prerequisite for the large-scale adoption of any technology is the availability of standards. In this regard, the IEEE 802.11bb Task Force for the development of a Global Standard for Li-Fi Communication was set-up in 2018.

+ +

Generations of Cellular Communications

+
+

Credits:https://ars.els-cdn.com/content/image/1-s2.0-S2405428317300151-gr8.jpg

+
+ +

Although there’s still a long way to go to make this technology a commercial success, it promises a great potential in the field of wireless internet. The commercial deployment of Li-Fi will result in inexpensive and fast internet service world-wide. Widespread migration to cleaner, greener and safer communication networks such as Li-Fi will have a positive impact on the current global climate crisis too.

+ +

Further Readings and Resources

+ +

Gigabit Li-Fi integration into our smartphones

+ +

Gigabit Li-Fi integration into our smartphones

+ +

LiFi-XC: The current state-of-the-art amongst consumer-oriented LiFi devices
+Press Release of the Global LiFi Congress 2019
+A small-scale DIY Li-Fi tutorial
+Integrating Li-Fi receivers in Solar Cells
+Gigabit Li-Fi demonstration
+A deeper dive into the technical aspects of Li-Fi
+Li-Fi products by Oledcomm

+ +

References

+ +

https://purelifi.com/faq/how-does-lifi-work/
+https://www.lifi-centre.com/about-li-fi/faqs/
+https://en.wikipedia.org/wiki/Li-Fi
+http://www.axrtek.com/how-does-liFi-work.html
+http://tec.gov.in/pdf/Studypaper/lifi%20study%20paper%20-%20approved.pdf
+https://www.youtube.com/watch?v=iHWIZsIBj3Q
+https://www.fibre-systems.com/news/lifi-technology-piloted-scotland-s-south-ayrshire-school
+https://www.sciencedirect.com/science/article/pii/S2405428317300151
+https://purelifi.com/lifi-technology/
+https://www.archlighting.com/technology/li-fi-high-speed-communication-via-led-modulation_o
+https://purelifi.com/lifi-misconceptions/
+https://www.archlighting.com/technology/li-fi-high-speed-communication-via-led-modulation_o

+ + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Alpha-Beta-Pruning/index.html b/blog/Alpha-Beta-Pruning/index.html new file mode 100644 index 0000000..dbab581 --- /dev/null +++ b/blog/Alpha-Beta-Pruning/index.html @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Among the many advancements computer science has made in the past couple of decades, Artificial Intelligence (AI) is the most widely known. You might have simply heard about J.A.R.V.I.S from the Avengers or smart assistants like Siri or Alexa. All of them use AI and machine learning algorithms to work as well as they do. It turns out that we can get a glimpse into one such algorithm - particularly the one used by computers to beat you at chess, connect 4, tic-tac-toe and more. It’s called the Minimax Algorithm and you can implement this by yourself very quickly. In fact, you can optimize this algorithm to run faster and more efficiently using a technique called Alpha Beta Pruning in just a few extra lines of code. Let’s see how it works.

+ +

Basic Gameplay - The Minimax Algorithm

+ +

Two player turn based games like chess, tic-tac-toe, backgammon etc, when played against a computer are based on the Minimax Algorithm. This algorithm uses backtracking to find the optimal move at any point in the game by assuming that the opponent also plays optimally. The two players are sometimes called the maximising and minimising players. The objective of the maximising player is to get the largest possible positive score or the smallest possible negative score based on board evaluations. On the other hand, the minimising player tries to get the largest possible negative score or smallest possible positive score. These scores indicate the player having the upper hand at that instant - positive for maximising player and negative for minimizing player.

+ +

The way these scores are evaluated differ in technique and complexity based on the game. For something simple like tic-tac-toe (where there aren’t too many positions to consider) we could exhaustively search all patterns until the game ends. Then the winning games could have score 1, losing games score -1 and games that draw get a score of 0. For complicated games like chess, this evaluation is a lot more involved and the number of moves is too large for us to search all positions until the game ends. So the evaluations are done considering several other metrics.

+ +

Since this is a backtracking based algorithm, it tries all possible moves from a given board position while assuming that the opponent is always going to play the best move they can. The number of moves the algorithm looks ahead is the depth of the recursion. At the end of the process, the algorithm picks the best board evaluation and makes a move intending to arrive at it. The various intermediate boards are evaluated along the way and the scores make up the decision tree of the algorithm.

+ +

To understand what this tree looks like, consider the example of Connect 4 - a popular two player turn based game - being evaluated using minimax. Here’s a visual representation of the boards and the moves explored by the algorithm at the very beginning of the game :

+ +

Decision Tree of Connect4

+ +

Instead, if we assign scores for each board evaluation, it could look like this:

+ +

Board Evaluated Decision Tree

+ +

As you can see, the algorithm tries all the moves it can make, and then all subsequent moves the opponent can make, repeatedly until it reaches the depth of its recursion. Then it picks the maximum of the branches for maximising player and minimum of the branches for minimising player until the backtracking is complete and returns the calculated value and the move/branch corresponding to it.

+ +

Here is the pseudocode for the algorithm:

+ +
function minimax(node, depth, maximizingPlayer) is
+    if depth = 0 or node is a terminal node then
+        return the score/evaluation of node
+    if maximizingPlayer then
+        best_score := −∞
+        for each child of node do
+            branch_score := minimax(child, depth-1,False)
+            best_score := max(best_score, branch_score)
+        return best_score
+    else (* minimizing player *)
+        best_score := +∞
+        for each child of node do
+            branch_score := minimax(child, depth-1,True)
+            best_score := min(best_score, branch_score)
+        return best_score
+
+ +

The Need to Optimize - Alpha Beta Pruning

+ +

You might have already noticed that while this exhaustive search for the best result is indeed more or less foolproof, it is very time consuming and often excessive. The reason for this is because there are some moves that are so glaringly bad or some which are obviously the best ones possible and they become apparent much before the depth of recursion is reached. Unfortunately the algorithm in its current implementation cannot recognize such moves and continues its search.

+ +

To improve this, we use an optimization technique called Alpha Beta Pruning. This optimization can tell the algorithm when it has found a really good or bad move so that it can stop exploring further or to simply ignore evaluating that sequence of moves. The algorithm gets its name because it manages to shorten or prune unnecessary branches of the decision tree.

+ +

After pruning, the tree might look something like this :

+ +

Decision Tree of Connect4 after pruning

+ +

Once again, in terms of board evaluation, it could look like this:

+ +

Board Evaluated Decision Tree after pruning

+ +

The values seen in grey are not evaluated - those are the branches that the algorithm decided as unnecessary to explore.

+ +

This is the pseudo code for the implementation :

+ +
function alphabeta(node, depth, α, β, maximizingPlayer) is
+    if depth = 0 or node is a terminal node then
+        return the score/evaluation of node
+    if maximizingPlayer then
+        best_score := −∞
+        for each child of node do
+            branch_score := alphabeta(child, depth-1, α, β, False)
+            best_score := max(best_score, brach_score)
+            α := max(α, best_score)
+            if α ≥ β then
+                break (* β cutoff *)
+        return best_score
+    else
+        best_score := +∞
+        for each child of node do
+            branch_score := alphabeta(child, depth-1, α, β, True)
+            best_score := min(best_score, branch_score)
+            β := min(β, best_score)
+            if β ≤ α then
+                break (* α cutoff *)
+        return best_score
+
+ +

The variables alpha and beta are used to denote the most favourable board evaluations for the maximising and minimising player respectively. Whenever the maximum score that the minimizing player is assured of becomes less than the minimum score that the maximizing player is assured of, the maximizing player need not consider further descendants of this node, as they will never be reached in the actual play.

+ +

Some Shortcomings of the Optimization

+ +

This optimization gives a significant boost to the standalone Minimax Algorithm but is not always bound to work. Sometimes, if the moves explored by the algorithm are just in a bad order, then it might come across one of those really good or bad moves towards the end at that level of recursion. Another unfortunate drawback of this algorithm is the fact that it cannot remember previously evaluated boards. Often we can arrive at a certain board position by performing the moves in different orders. But since the algorithm does not keep track of these boards, it re-evaluates them. In such cases, Alpha Beta Pruning hasn’t managed to reduce the number of boards that need to be evaluated.

+ +

Improvements and Conclusion

+ +

As you can see, even with this optimization, the algorithm isn’t quite perfect. However, we can improve this algorithm further if we choose the order in which moves are explored wisely. For example, in chess, moves that capture pieces may be examined before moves that do not, and moves that have scored highly in earlier passes through the decision tree analysis may be evaluated before others. We can also consider storing some recent board evaluations (sometimes there are too many to store at once so we only consider the last few). With these, and several other improvements, this algorithm can be modified to give some fantastic results.

+ +

References

+ +

More on Minimax Algorithm

+ +

Alpha Beta Pruning - Wikipedia

+ +

More code - Javapoint

+ +

Some theory and exercises - UCLA Recitation

+ +

More examples - Cornell Recitation

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/An-Intro-to-WebSockets/index.html b/blog/An-Intro-to-WebSockets/index.html new file mode 100644 index 0000000..e3cb461 --- /dev/null +++ b/blog/An-Intro-to-WebSockets/index.html @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Introduction

+ +

Have you ever wondered how the extremely volatile stock/share market prices are constantly updated on online portals? +To have a glimpse of how rapid the changes are, head here Cryptowatch portal +Similarly how do new messages automatically pop up in Whatsapp Web or Facebook Chat?

+ +

A Brief History of Real-Time Web Applications

+ +

When a user surfs the web, the browser (client) establishes a HTTP connection with a server; sends certain requests via RESTful routes (‘GET’, ‘PATCH’, ‘POST’, etc) to the server that hosts the website. The server receives the requests and sends information as responses back to the client, which receives and renders the response information on the page. Following this the connection would close. Any further request, (by the user to the same server also) required the opening of a new HTTP connection.

+ +

Image1

+ +

This went on just fine until….. +Clients started sending more frequent requests to the server requesting for data. +A good example of this is web apps that need real-time data (like gaming or chat apps). These require an abuse of the HTTP protocol to establish bidirectional data transfer.

+ +

Problem

+

The main problem in the traditional HTTP model was that it was always the client that initiated transactions, ie. it was unidirectional. +An other reason was increasing overheads due to HTTP. Every time a HTTP request is made, a bunch of headers and cookie data are transferred to the server. This can add up to a reasonably large amount of data that needs to be transferred, which in turn increases latency.

+ +
+

Basically imagine that each time to get an updated stock’s price/a new message from your friend you had to refresh the page, and wait until the new price/message loaded. Firstly how would you even know that there has been a change in price/a new message has been sent to to you? And even if you did, it would take +quite a while to load.

+
+ +

So a number of strategies were proposed to enable the server to ‘push’ data to the client. +Some of the startegies devised to combat the issue were:

+

1. Optimising HTTP Polling

+
    +
  • Periodic Polling: +The very first attempt to solve the problem was by polling the server at regular intervals. It could reduce server consumption by increasing time gap between two requests. But ofcourse notifications of server events would be delayed :/
  • +
  • Long Polling: +After the server receives a request, it holds the request open until new data(if any) is available. There were no notification delays.But more server resources were used.
  • +
  • Streaming: +Basically infinitely polling…But the connection could get interrupted by intermediaries serving other requests in a Round-Robin manner.
  • +
+ +

2. AJAX

+

This technology can be used to create better, faster and more interactive applications using XML, HTML, CSS, and JavaScript. With Ajax, once you submit a form, JavaScript makes a request to the server, finds the result and updates the screen. The end user remains unaware of the fact that information was actually transmitted to the server. +AJAX is asynchronous; thus, a web front-end can send any number of AJAX requests without having to wait for each response. Each AJAX request is associated with a JavaScript callback that gets called when the server sends the response.

+ +

Image2

+ +

Then came along WebSockets!!

+ +

WebSockets provide a persistent, duplex connection between a client and server that both can use to start sending data at any time. Since it maintains a persistent unique connection, latency problems faced previously are eliminated. +Also, no HTTP/XML headers are needed anymore, as the amount of data simply moving around between the server and cient is cut down.

+ +

Working of WS

+ +

The client establishes a WebSocket connection through a process known as the WebSocket handshake. This process starts with the client sending a regular HTTP request to the server. An Upgrade header is later included in this request that informs the server that the client wishes to establish a WebSocket connection. +If the server supports WS, the handshake is completed and the initial HTTP connection is replaced by a WebSocket connection that uses the same underlying TCP/IP connection. At this point, either party can starting sending data. Data is transferred through WebSocket as messages, each of which consists of one or more frames containing the data being sent (the payload).

+ +

Image3

+ +

The WS traffic of a web page can be inspected by viewing the WS tag under the Network section of developer tools.

+ +

Image4

+ +

WS are supported in almost every web browser except Android browser and Opera Mini.

+ +

Note: WebSockets don’t make AJAX obsolete but they do supersede HTTP Long-polling/HTTP Streaming as the solution of choice for true realtime functionality. +AJAX should still be used for making short-lived web service calls

+ +

Further Reading

+ +

WebSockets can be implemented practically using Node.js(using Socket.IO), Rails(using Action Cable) and in other frameworks too.

+ +

References

+ + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/An-Introduction-to-Disjoint-set-data-structures/index.html b/blog/An-Introduction-to-Disjoint-set-data-structures/index.html new file mode 100644 index 0000000..1407d98 --- /dev/null +++ b/blog/An-Introduction-to-Disjoint-set-data-structures/index.html @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Introduction

+ +

A disjoint-set data structure, also called a union–find data structure or merge–find set, is a data structure that stores a collection of disjoint (non-overlapping) sets. Equivalently, it stores a partition of a set into disjoint subsets.

+ +

Capabilities

+ +

This data structure provides the following capabilities. We are given several elements, each of which is a separate set. A DSU(Disjoint set union) will have an operation to combine any two sets, and it will be able to tell in which set a specific element is. The classical version also introduces a third operation, it can create a set from a new element.

+ +

Basic Interface

+ +

Thus the basic interface of this data structure consists of only three operations:

+ +
    +
  • make_set(v)- creates a new set consisting of the new element v
  • +
  • union_sets(a, b) - merges the two specified sets (the set in which the element a is located, and the set in which the element b is located)
  • +
  • find_set(v) - returns the representative (also called leader/parent) of the set that contains the elementv. This representative is an element of its corresponding set. It is selected in each set by the data structure itself (and can change over time, namely after union_sets calls). This representative can be used to check if two elements are part of the same set or not. a and b are exactly in the same set, if find_set(a) == find_set(b). Otherwise they are in different sets.
  • +
+ +

How it works

+ +

We will store the sets in the form of trees: each tree will correspond to one set. And the root of the tree will be the representative/leader of the set.

+ +

In the beginning, every element starts as a single set, therefore each vertex is its own tree. +Image_being_discussed

+ +

Then we combine the set containing the element 1 and the set containing the element 2. Then we combine the set containing the element 3 and the set containing the element 4. And in the last step, we combine the set containing the element 1 and the set containing the element 3.

+ +

For the implementation this means that we will have to maintain an array parent that stores a reference to its immediate ancestor in the tree.

+ +

Implementation

+ +

As I said, all the information about the sets of elements will be kept in an array parent.

+ +

To create a new set (operation make_set(v)), we simply create a tree with root in the vertex v, meaning that it is its own ancestor.

+ +

To combine two sets (operation union_sets(a, b)), we first find the representative of the set in which a is located, and the representative of the set in which b is located. If the representatives are identical, that we have nothing to do, the sets are already merged. Otherwise, we can simply specify that one of the representatives is the parent of the other representative - thereby combining the two trees.

+ +

Finally the implementation of the find representative function (operation find_set(v)): we simply climb the ancestors of the vertex v until we reach the root, i.e. a vertex such that the reference to the ancestor leads to itself. This operation is easily implemented recursively. Here is the implementation -

+ +
void make_set(int v) {
+    parent[v] = v;
+}
+
+int find_set(int v) {
+    if (v == parent[v])
+        return v;
+    return find_set(parent[v]);
+}
+
+void union_sets(int a, int b) {
+    a = find_set(a);
+    b = find_set(b);
+    if (a != b)
+        parent[b] = a;
+}
+
+ +

The time complexity of this algorithm is O(N) where N is the size of the set of elements.

+ +

Improving the efficiency of the algorithm

+ +

Path Compression

+ +

Path compression is useful for speeding up the find_set function.

+ +

If we call find_set(v) for some vertex v, we actually find the representative p for all vertices that we visit on the path between v and the actual representative p. The trick is to make the paths for all those nodes shorter, by setting the parent of each visited vertex directly to p. Here is the implementation -

+ +
int find_set(int v) {
+    if (v == parent[v])
+        return v;
+    return parent[v] = find_set(parent[v]);
+}
+
+ +

The simple implementation does what was intended: first find the representative of the set (root vertex), and then in the process of stack unwinding the visited nodes are attached directly to the representative. The complexity has been reduced to O(NlogN).

+ +

Union by Rank

+ +

Think about what happens when we join the larger tree to the smaller tree while merging the two sets. Clearly this can lead to trees with chain length of O(N). So if we always join the smaller tree to the larger one, we can significantly reduce the time complexity.

+ +

In this approach, we use the size of the tree as the rank and we join the tree with lower rank to the one with the higher rank. Here is the implementation -

+ +
void make_set(int v) {
+    parent[v] = v;
+    rank[v] = 1;
+}
+
+void union_sets(int a, int b) {
+    a = find_set(a);
+    b = find_set(b);
+    if (a != b) {
+        if (rank[a] < rank[b])
+            swap(a, b);
+        parent[b] = a;
+        rank[a] += rank[b];
+    }
+}
+
+ +

Time Complexity

+ +

If we combine the two optimisation techniques that we discussed, the time complexity comes out to be O(α(n)), where α(n) is the inverse Ackermann function, which grows very slowly. In fact it grows so slowly, that it doesn’t exceed 4 for all reasonable n. So we can say that we will reach nearly constant time queries. This is one of the reasons why a disjoint-set is so powerful.

+ +

Applications

+ +

Connected Components in a graph

+ +

This is one of the obvious applications of DSU.

+ +

Formally the problem is defined in the following way: Initially we have an empty graph. We have to add vertices and undirected edges, and answer queries of the form (a,b) - “are the vertices a and b in the same connected component of the graph?”

+ +

Here we can directly apply the data structure, and get a solution that handles an addition of a vertex or an edge and a query in nearly constant time on average.

+ +

This application is quite important, because nearly the same problem appears in Kruskal’s algorithm for minimum spanning tree and DSU helps in reducing it’s time complexity.

+ +

Job Sequencing problem

+ +

Given a set of n jobs where each job i has a deadline d_i >= 1 and profit p_i >= 0. Only one job can be scheduled at a time. Each job takes 1 unit of time to complete. We earn the profit if and only if the job is completed by its deadline. The task is to find the subset of jobs that maximizes profit.

+ +

Note : If you try to solve this greedily the time complexity will be O(n^2) but DSU makes it much faster.

+ +

All time slots are individual sets initially. We first find the maximum deadline of all jobs. Let the max deadline be m. We create m+1 individual sets. If a job is assigned a time slot of t where t => 0, then the job is scheduled during [t-1, t]. So a set with value X represents the time slot [X-1, X].

+ +

We need to keep track of the greatest time slot available which can be allotted to a given job having deadline. We use the parent array of Disjoint Set Data structures for this purpose. The root of the tree is always the latest available slot. If for a deadline d, there is no slot available, then root would be 0.

+ +

Conclusion

+ +

We can clearly say that DSU are one of the most efficient data structures and are really helpful for various algorithms. They are efficient and use small amount of memory. I hope that this article will help you quickly familiarise yourself with DSU as it can help you in solving various problems quickly and efficiently.

+ +

References and further reading

+ +
    +
  1. en.wikipedia.org/wiki/Disjoint-set_data_structure
  2. +
  3. en.wikipedia.org/wiki/Ackermann_function
  4. +
  5. https://www.topcoder.com/community/competitive-programming/tutorials/disjoint-set-data-structures/
  6. +
  7. https://en.wikipedia.org/wiki/Kruskal%27s_algorithm
  8. +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/An-Introduction-to-Matrix-Exponentiation/index.html b/blog/An-Introduction-to-Matrix-Exponentiation/index.html new file mode 100644 index 0000000..e460e9d --- /dev/null +++ b/blog/An-Introduction-to-Matrix-Exponentiation/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Matrix Exponentiation is one of the most used techniques in advanced competitive programming. The concept of matrix exponentiation in its most general form is very useful in solving questions that involve calculating the nth term of a linear recurrence relation in time of the order of log(n). It is especially useful in converting a linear O(n) dynamic programming solution into a O(log(n)) solution.

+ +

To understand this better, let us consider a very simple example of finding the nth Fibonacci number. This problem can be very easily solved using a linear recurrence. As we all know, by definition of the fibonacci series, Fn = Fn - 1 + Fn - 2. Consider the code below that calculates the nth fibonacci number.

+ +
def get_fibonacci(n):
+
+    if n <= 0: return -1 # Throw error : Invalid value of n
+
+    if n == 1: return 0
+    if n == 2: return 1
+
+    dp = [0] * (n + 1) # Initializing Array
+
+    # Setting base case
+    dp[1] = 0 
+    dp[2] = 1
+
+    for i in range(3, n + 1):
+        dp[i] = dp[i - 1] + dp[i - 2]
+
+    return dp[n]
+
+
+ +

This solution is an iterative dp that runs in linear time ie. O(n). Note that this solution has a space complexity of O(n), but it can be easily converted into O(1) space.

+ +

Now at first there does not seem to be any straightforward way to improve the time complexity of this solution. This is where matrix exponentiation comes into the picture. Our goal is to obtain a recurrence relation of the form Fn = P * Fn - 1 where P is a constant matrix and Fn and Fn - 1 are matrices. Let us see what happens if we obtain such a relation.

+ +

F2 = P * F1

+ +

F3 = P * F2
+F3 = P * P * F1
+F3 = P2 * F1

+ +

F4 = P * F3
+F4 = P * P2 * F1
+F4 = P3 * F1

+ +

.
+.
+.

+ +

Fn = Pn - 1 * F1

+ +

This is a very helpful relation. We have got the nth term of the series in terms of the base matrix F1. Note: This base matrix need not always be n = 1.

+ +

You must already be knowing that xn can be calculated in O(log(n)) time using binary exponentiation where x and n are integers. Refer to the code below in case you need a refresher on how that is done. If you have never heard of binary exponentiation, go through this article before continuing.

+ +
def power(x, n):
+
+    result = 1
+
+    while n > 0:
+
+        if n % 2 != 0:
+            result *= x
+
+        n = n // 2
+        x = x * x
+
+    return result
+    
+
+ +

A very similar function can be implemented to calculate Pn in O(log(n) * m3) time where P is a square matrix, n is an integer and m is the dimension of P (ie. P is an m x m matrix).

+ +
def matrix_power(P, n):
+    m = len(P) 
+
+    # Initializing m x m identity matrix
+    R = [[1 if i == j else 0 for i in range(m)] for j in range(m)] 
+
+    while n > 0:
+
+        if n % 2 != 0:
+            R = matrix_multiply(P, R)
+
+        n = n // 2
+        P = matrix_multiply(P, P)
+
+    return R
+
+
+def matrix_multiply(A, B):
+
+    n = len(A)
+    m = len(A[0])
+    q = len(B)
+    r = len(B[0])
+
+    if m != q:
+        return -1 # Throw error : Incompatible
+
+    # Initialzing m x m zero matrix
+    R = [[0 for i in range(r)] for j in range(n)] 
+
+    for i in range(n):
+        for j in range(r):
+            for k in range(m):
+                R[i][j] += A[i][k] * B[k][j]
+
+    return R
+
+
+ +

‘matrix_multiply’ is a function that runs in O(n3). Considering that, the overall time complexity of calculating Pn is O(log(n) * m3).

+ +

Now let us get back to the original question. That is, calculating the nth fibonacci number. What we need to do is to get the matrices Fn and P.

+ +

We consider Fn to be:

+ +
Fn = |  fn  | 
+     | fn_1 |
+
+where fn is the nth fibonacci number and fn_1 is the (n-1)th fibonacci number.
+
+ +

Now we need to find P such that +Fn = P * Fn - 1
+Using fn = fn - 1 + fn - 2 and fn - 1 = fn - 1 and with the help of basic linear algebra we see that:

+ +
P = |1 1|
+    |1 0|
+
+ +

We will consider the base matrix to be:

+ +
F2 = |f2| = |1|
+     |f1|   |0|
+
+The base matrix is Fn when n == 2.
+
+ +

Now we can easily see Fn = Pn - 2 * F2. As shown early Pn - 2 can be calculated in O(log(n) * m3). Here m = 2. Therefore the time complexity of this solution is O(log(n) * 23) which is O(log(n)). The code for this is given below.

+ +
def get_fibonacci_matrix_exp(n):
+    if n <= 0: return -1 # Throw error
+    if n == 1: return 0
+ 
+    F2 = [[1],
+          [0]]
+ 
+    P = [[1, 1],
+         [1, 0]]
+ 
+    Pn_2 = matrix_power(P, n - 2) # Calculating P^(n-2)
+    Fn = matrix_multiply(Pn_2, F2) # Fn = P^(n-2) * F2
+
+    return Fn[0][0] 
+
+
+ +

This is much more efficient solution and scales much better for very large values of n.

+ +

Now using this, try to solve the following problem in logarithmic time.

+ +

Q. Given a 3 x N rectangle, determine how many ways can we tile the rectangle using 1 x 3 and 3 x 1 tiles.

+ +

Like before, first we will come up with a O(n) solution and obtain a linear recurrence relation. In this problem dpn = dpn - 1 + dpn - 3. If it is unclear how we obtain this, I suggest you read this article. We need to express this relation as DPn = P * DPn - 1 , where P, DPn and DPn - 1 are all matrices. +Here we take DPn, P and base matrix DP3 (n == 3) as:

+
DPn = | dpn |
+      |dpn_1|
+      |dpn_2|
+where dpn is the answer when for when N = n.
+
+P = |1 0 1|
+    |1 0 0|
+    |0 1 0|
+
+DP3 = |2|
+      |0|
+      |0|
+
+ +

It is easy to see that, DPn = Pn -3 * DP3. As shown before, this can now be solved in O(log(n) * m3) where m is now 3. The code for this is given below.

+ +
def get_tiling_count(n):
+    if n <= 0: return -1 # Throw error : Invalid value of n
+    if n == 1: return 0
+    if n == 2: return 0
+ 
+    DP3 = [[2],
+           [0],
+           [0]]
+ 
+    P = [[1, 0, 1],
+         [1, 0, 0],
+         [0, 1, 0]]
+ 
+    Pn_3 = matrix_power(P, n - 3) # Calculating P^(n-3)
+    DPn = matrix_multiply(Pn_3, DP3) # DPn = P^(n-3) * DP3
+
+    return DPn[0][0] 
+
+
+ +

Here are some other problems that you can try solving to practice this concept.

+ + + +

References

+ + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Applications-of-Neural-Networks-in-Power-Systems/index.html b/blog/Applications-of-Neural-Networks-in-Power-Systems/index.html new file mode 100644 index 0000000..a99ee4a --- /dev/null +++ b/blog/Applications-of-Neural-Networks-in-Power-Systems/index.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Application of Neural Networks in Power Systems

+ +

Have you ever heard of Machine Learning or Neural Networks, but you don’t know their applications? Scroll down to find out!

+ +

For most beginners, the title itself might be a bit complicated to digest. So let’s split it into its 2 major components - Neural Networks in Power Systems.

+ +

What are Neural Networks?

+ +

Neural networks are a set of algorithms, modeled after the human brain, primarily designed to recognize patterns. To understand how a neural network works, one must know the related terminologies. This is a blog that contains the basics of Machine Learning. It also includes the types of neural networks and learning patterns.

+ +

If you’re an athirst reader and have already gone through it or already know the basics, jump right in xD.

+ +

What exactly is a Power System?

+ +

The power system is a network that mainly consists of generation, distribution, and transmission systems. The output electrical energy from a generator in a power plant is transmitted across lines and then supplied at the appropriate +value suitable for the consumers.

+ +

img1

+ +

Let’s run through the 3 main subsystems

+ +

1. Generating Substation

+ +
The main components of this system are the generator and the transformer.
+The generator converts mechanical energy into electrical energy.
+
+Sources of mechanical energy are the burning of coal, nuclear fuel, or a
+hydropower plant. The transformer transfers the power with very high
+efficiency to ensure minimum losses.
+
+ +

2. Transmission Substation

+ +
This substation carries the overhead lines which transfer the generated
+electrical energy from generation to the distribution substations.
+
+ +

3. Distribution Substation

+ +
This substation connects all the consumers in an area to the bulk power
+sources.
+
+The transmission lines form the connection between the bulk power stations
+and generation substations.
+
+ +

But why use Neural Networks when there are several other AI techniques?

+ +
    +
  1. +

    Ability to adapt and learn by example in real-time

    +
  2. +
  3. +

    Fast Speed

    +
  4. +
  5. +

    Real-time pattern recognition

    +
  6. +
  7. +

    They can generalize and are known for their intelligent association.

    +
  8. +
+ +

Neural Network Application Areas in Power Systems

+ +

img2

+ +

Here are some of the most prevalent problems :

+ +

Load Forecasting

+ +

The forecasting of electricity demand has become an essential research field as it plays a significant role in economic and financial development, expansion, and planning of electric power systems.

+ +

It is a difficult job as the load series is complex and exhibits several levels of seasonality but is a suitable problem for NN application due to the availability of historical load data on the utility databases.

+ +

Some of the factors influencing the load are Economic, Time, Weather, and other Random Disturbances.

+ +

Hence, they can be classified into 3 groups

+ +
    +
  • +

    Short-Term Load Forecasting

    + +

    Ranges from a few minutes to a week.

    +
  • +
+ +
+

Some applications are economic load dispatch, real-time control, and energy + transfer scheduling.

+
+ +
    +
  • +

    Mid-Term Load Forecasting

    + +

    Ranges from a month to a year.

    + +

    They are mostly done to buy adequate fuel for power plants after calculating electricity tariffs.

    +
  • +
  • +

    Long-Term Load Forecasting

    + +

    Ranges from 5-20 years or more.

    + +

    It is used by engineers to find out the type and size of generating plants to minimize all costs.

    +
  • +
+ +

Example of Short Term Load Forecasting using neural networks:

+ + + +

img4

+ +

Date: 13/04/2012

+ +

The architecture is trained by using a backpropagation algorithm with SIMULINK. The performance of the model was tested using hourly load data. A comparison of 24 hours ahead load forecasting and a specific load is shown above.

+ +

Security Analysis

+ +

The main task of the power industry is to deliver the power requested by the customers, without exceeding acceptable voltage and frequency limits. This task has to be solved in real-time with consistency and must be safe and economical.

+ +

The real-time measurements of the system are stored in a database, and missing data is adjusted. Based on the values, the mathematical model of the power system is established.

+ +

Based on the simulation of potential equipment outage, the security level of the system is determined. If a system is considered unsafe concerning any potential outage, then control actions are taken.

+ +

There are mainly 2 types of security assessments: Static and Dynamic

+ +

The different operational states in both types are:

+ +
    +
  • +

    Secure state: In this state, all customer demands are met, and the operating limit is within existing limits.

    +
  • +
  • +

    Critical state: In this state, the system variables are still within limits, and constraints are satisfied, but little disturbance can lead towards instability.

    +
  • +
  • +

    Unsecured state: In this case, the power system enters the emergency mode of operation upon violation of constraints.

    +
  • +
+ +

In realistic and modern power systems, the dimension of the operating system is enormous. Thus, the modeling of neural networks can help overcome this curse of high dimensionality.

+ +

E.g., Multi-Layer Perceptron with the backpropagation learning algorithm

+ +

Fault Detection and Diagnosis

+ +

Fault detection and diagnosis are some of the challenging problems in power systems.

+ +

The Multi-Layer Perceptron identifies the type and location of faults with a given set of power system conditions, measurements, and alarms. A Kohonen net (basic self-organizing neural net) is applied to handle the classification of fault patterns.

+ +

The diagnosis is done to judge what kinds of faults the apparatus suffered from and then accordingly it is cleared.

+ +

Economic Load Dispatch

+ +

ELD is one of the vital optimization problems in a power system. It ensures an optimal combination of power generating units are selected to minimize the total fuel cost while satisfying the load demand and several operational constraints.

+ +

Hopfield Neural networks or Feedforward Neural networks can be used for the same. It helps in sharing the system load including the system losses amongst the available generators. Hence, it is basically to minimize the cost of generation and supply of electricity to load subject to multiple constraints like limitation of generators, power balance and network stability. The problem is highly non-linear and complex.

+ +

The applications of neural networks are incredibly vast and not just limited to power systems. They are used in speech recognition, machine translation, character recognition, image classification, and a lot more!

+ +

The best course for beginners started with Basics of Machine Learning is This Course by Andrew Ng.

+ +

References for further reading:

+ + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Bluetooth-Low-Energy/index.html b/blog/Bluetooth-Low-Energy/index.html new file mode 100644 index 0000000..b80e845 --- /dev/null +++ b/blog/Bluetooth-Low-Energy/index.html @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

We all know how infuriating it is when our devices drains battery when it uses wireless communication like wifi, bluetooth, infra-red. In every device we use, we are always concerned with the power consumption. A device which consumes less power is always favourable. +So in this article, I am going to elucidate an effective solution to the power problem in wireless communication- Bluetooth Low Energy , also known as BLE.

+ +

Why BLE?

+ +

Historically, classic bluetooth (the bluetooth we are all aware of) was mainly designed to replace cable and it covers many protocols. And with speeds increasing with new versions, power consumption was not always the primary concern for this technology.

+ +

Hence, it was not suitable for wireless boards running on a battery that only needs to send a few bytes of information. Well this is where BLE comes in. It was contrived to consume as low power as possible. Devices using BLE can run on button cells for months or even years.

+ +

BLE Architecture

+ +

alt text

+ +

BLE architecture has the following stacks-

+ +
    +
  • +

    Physical layer -

    +

    This is the physical radio which transmits in the 2.4GHZ radio spectrum, which is the same spectrum used by classic bluetooth, wifi and zigbee.

    +
  • +
  • + +

    The link layer describes how two devices can use a radio link to transmit information from one to another. The link layer has a simple a state machine with only 5 states- + - Standby mode: Device is in an idle state + - Advertising mode: When the slave needs to make a connection. If it is sending data, it goes to anyone, its not specifically meant for any particular device. + - Scanning mode: When a device wants to listen what other devices are advertising. + - Initiating mode: This is sent from the future master to the device that is advertising and asked to make a specific connection. + - Connected mode: This is when two devices are connectedand sending each other data packets purposefully, so it has a starting point and end point, not general advertising.

    + +

    alt text

    +
  • +
  • +

    Host Controller Interface (HCI) -

    +

    It is the interface between the host and the controller. The HCI has 2 main functions- + - It sends commands to the controller and receives events back. + - And it sends and receives data from a peer device.

    +
  • +
  • + +

    The L2CAP multiplexes 3 different channels and it enables segmentation and reassembly of the data packets that are larger than the radio can deliver.

    +
  • +
  • +

    Attribute Protocol -

    +

    This is where the data is stored and defines how the attribute is managed, the type of attribute, how to read or write data and much more.

    +
  • +
  • +

    The Generic Attribute Protocol (GATT) -

    +

    The GATT defines the format of the data exposed by a BLE device. It also defines the procedures needed to access the data exposed by a device.

    +
  • +
  • +

    Generic Access Protocol (GAP) -

    +

    This makes the device visible to the outside world and determines the role of the device in the network.

    +
  • +
+ +

But why does BLE consume less power?

+ +

BLE uses less energy by keeping things simple. Instead of maintaining a constant connection, the BLE protocol only sends data as needed. And it does so with very little overhead. This allows the device to sleep for longer periods of time , turn off the radio and consume less power. Thus, it is great for periodic updates, like getting readings for a sensor. +But its not so great for streaming audio or video. For now, that is a job left to classic bluetooth or wifi.

+ +

Advantages

+ +
    +
  • Ultra-low peak, average and idle mode power consumption
  • +
  • Low power requirements
  • +
  • Small size
  • +
  • Low cost
  • +
  • Compatibility with large base of mobile phones, computers and tablets
  • +
  • Communication range(10-50m)
  • +
+ +

Applications

+ +
    +
  • Home Automation(Internet of Things)
  • +
  • Fitness Devices
  • +
  • Indoor Location(where GPS is not feasible)
  • +
  • Medical and personal health devices
  • +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/CNAME b/blog/CNAME new file mode 100644 index 0000000..e69de29 diff --git a/blog/ELF-Files-in-Linux/index.html b/blog/ELF-Files-in-Linux/index.html new file mode 100644 index 0000000..00cba4f --- /dev/null +++ b/blog/ELF-Files-in-Linux/index.html @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Have you ever tried to print the a.out file generated when you compile your C program? It prints gibberish! Ever wondered how the computer produces a valid, sensible output from this? Read ahead to find out.

+ +

Introduction

+ +

ELF stands for Executable and Linkable Format. ELF files are usually the outputs of compilers. They exist in binary format (hence, the gibberish when printed). This format helps the operating system interpret the underlying machine instructions correctly. ELF is not only used for binaries and executables but also object code, shared libraries and core dumps. +Any program is first translated by a compiler to object code. This object code is then linked with system libraries using a linker tool. This produces a binary file which can be executed on that specific platform and CPU type. This file follows the ELF format.

+ +

Structure

+ +

You can look at the structure of an ELF file using the readelf command in the terminal.

+ +

ELF Header

+

ELFHeader

+ +

The first mandatory part of an ELF file is the ELF header. It makes sure that the data is correctly interpreted during linking and execution. +Its first 4 bytes are the Magic Number. A magic number is the first few bytes of any file in Linux which helps the operating system understand what type of file it is. The ELF Header begins with the following bytes (hexadecimal parts): 7f 45 4c 46. 45=E, 4c=L and 46=F in ASCII.

+ +

The next byte indicates the architecture required for the file. 01 is for 32-bit and 02 is for 64-bit architecture. This is the class field.

+ +

The following byte represents the type of encoding. 01 indicates LSB (Least Significant Bit) or little-endian. 02 indicates MSB (Most Significant Bit) or big-endian. This value is important in interpreting the remaining objects in the file as they are specified in the corresponding format. Different processors represent data and addresses in various formats, and hence, this field becomes +very significant. This is the data field.

+ +

The 7th byte is the version byte which as the name suggests gives the version of ELF. Currently, there is only one version, and so its value is 01.

+ +

The ELF Header follows an alignment, every field of n bytes starts at a byte which is a multiple of n. So, if a field is 4 bytes then it starts at a byte which is a multiple of 4, say the 20th byte. The 8th to 16th byte is 0. This space is a buffer. This provides extensibility to future versions of ELF, in case additional fields are needed and helps provide alignment.

+ +

The 17th and 18th byte are the type field of our ELF file. Type can take on four values. 01 indicates Relocatable file (before linking), 02 indicates Executable (binaries), 03 stands for Shared object files (libraries) and 04 for core.

+ +

Apart from the ELF Header, the ELF file has three parts: Program headers (Segments), Section headers (Sections) and Data.

+ +

Program Headers

+

ProgramHeader

+ +

This describes how to create a process/memory image for run-time execution. The kernel uses these segments to map them into virtual address space. It converts predefined instructions into a memory image. To run a binary ELF file, program headers are required. It uses these headers, with the underlying data structure, to form a process. This process is similar for shared libraries. Examples of program headers include GNU_EH_FRAME and GNU_STACK.

+ +

Section Headers

+

SectionHeader

+ +

The section headers define all the sections in the file. This is used for linking and relocation. Once the GCC compiler converts code to assembly and the GCC assembler converts that to object code, these sections appear in the ELF file. Any segment (mentioned above) can have zero or more sections. Executable files have four main sections: .text, .data, .rodata, and .bss. Each of these sections is loaded with different access rights.

+ +

Conclusion

+ +

ELF is a formal specification that defines how instructions are stored in executable code. The ELF file type is extremely flexible. It provides support for multiple CPU types, machine architectures, and operating systems. It is also very extensible. This article is an introduction to ELF Files in Linux. To know more check out the links in References.

+ +

References

+ + + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Elegant-Algorithms-Using-Randomization/index.html b/blog/Elegant-Algorithms-Using-Randomization/index.html new file mode 100644 index 0000000..2a6a29f --- /dev/null +++ b/blog/Elegant-Algorithms-Using-Randomization/index.html @@ -0,0 +1,618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Elegant Algorithms using Randomization

+ +

Randomized algorithms are those algorithms that make use of something random (for example a random permutation of an array, a random number generator, etc) to calculate the answer fast with certainty or it gives the approximate answer which on an average case is correct.

+ +

Let us skip the philosophical/mathematical question of the ability of a computer to generate something truly random and assume that we have an RNG(random number generator) that provides a number between [a,b] with uniform distribution(for all practical purposes).

+ +

Why should we use Randomized algorithms?

+ +

After all deterministic algorithms are so intuitive and predictable. We can understand their time complexities and predict the output quite easily. So what is the need for randomization? +We use randomization to come up with faster algorithms (on an average case) or to avoid highly complicated deterministic algorithms. In some cases randomized algorithms are the only feasible solution to some problems.

+ +

Let me show you the beauty of Randomization with a few examples:

+ +

Problem 1:

+ +

Problem Statement: Given an array of integers of length $N$ (where $N$ is even), you are given that there are $\frac{N}{2}$ integers that are distinct and $\frac{N}{2}$ integers that are the same (For example {$1,6,2,6,6,3$}, 3 distinct elements and 3 copies). Find the element that repeats $\frac{N}{2}$ times.

+ +

Deterministic Solution: +You can run two nested for loops and check for every $(i,j)$ if $arr[i] == arr[j]$ in which case $arr[i]$ would be the answer. The time complexity of this algorithm is $O(N^2)$ which is not very efficient. +This can be improved to $O(N)$with knowledge of hash-maps or hash-tables or even smart partitioning. But in any case it can be proved that any deterministic algorithm takes at least $O(N)$ time to solve this problem. That is because since our program is predictable we can give the array in such a way that it takes at least $\frac{N}{2}$ steps because the first $\frac{N}{2}$ integers are the unique ones.

+ +

Randomized Solution: +The solution is quite elegant and much more simpler AND faster than the deterministic one. The solution is, take any 2 random elements of the array. If they are equal then we have found our repeated element, if they are not equal then just repeat the process again. +The algorithm is just:

+ +
while(true){
+	int i1 = random_number(0,n-1), i2 = random_number(0,n-1);
+	if(i1 == i2) continue;
+	if(arr[i1] == arr[i2]){
+		cout << "Repeated element is: " << arr[i1] << endl;
+		break;
+	}
+}
+
+ +

That’s it. No hash-map or any advanced concepts. This quite literally the simplest and fastest algorithm to solve the problem. +It’s surely simple but why is it fast? I mean in theory this algorithm could run forever, imagine it just kept taking the distinct elements. But lets do some maths and find the probability with which our algorithm takes those distinct integers each time. +Number of favourable pairs (pairs if chosen our program would end) = $(N/2)\cdot(N/2-1)$ +Total number of pairs = $N^2$.

+ +

So the probability that our program would end in the first iteration is,(say) $P$= $\frac{N \cdot(N-2)}{4 \cdot N^2}$ = $\frac{1}{4} - \frac{1}{2 \cdot N}$ +which is greater than $\frac{1}{5}$ for all $N \geq 10$, so $P \geq \frac{1}{5}$ which implies that the probability that the program does not end on the first step (say) $Q$ = $1-P$, so $Q$ $\leq 4/5$

+ +

So we have found out that if we only performed one iteration there is a $80$% chance that we would not get our desired answer. Yikes that’s extremely bad. Well whats the probability that we don’t get our answer after 2 steps? Its just $Q^2$ because there is no difference between the first and second iteration. and $Q^2 \leq 16/25$, so we have a $64$% chance that we don’t get our answer within 2 steps. Well its still bad but at least its better.

+ +

So let our program run for 100 iterations. Then $Q^{100} \leq 2\cdot 10^{-10}$ which is such a small number that for all practical purposes that this will never happen. So our algorithm is so fast that given an array of $2$ million integers any deterministic algorithms would take at least $1$ million steps to find the answer whereas the above one would require at most $100$ (for all practical purposes).

+ +

There is a separate method for denoting and calculating time complexities of randomised algorithms. But they are not straightforward so for brevity’s sake I will skip it.

+ +

Problem 2:

+ +

Problem Statement

+ +

The solution is greedy. +Algorithm: Let $str$ be the string we have inputted and $N$ be the length of the string. Here is the solution below. Only the replace() function needs to be written.

+ +
str.push_back('$'); // adding an extra special character to cover corner cases
+int ans = 0;
+for(int i = 0; i+1 < N; i++){
+    if(str[i] == str[i+1]){
+		str[i+1] = replace(str[i],str[i+2]); //coming with the replace() function is the hardest part
+        ans++;
+    }
+}
+cout << ans << endl;
+
+ +

Deterministic Solution: +Well that seems easy, let’s come up with the replace() function that takes 2 alphabets as arguments and returns an alphabet that is not one of the two. Let the two alphabets be $a_1$ and $a_2$ An easy solution is to just return the alphabet that comes after max($a_1$,$a_2$). So if $a_1 =$’d’ and $a_2 = $ ‘x’ then we would choose ‘y’.

+ +

But wait this wont work if one of them is ‘z’ as there is no alphabet after ‘z’. Ok, to fix this we could choose the alphabet that comes before both of them but that would not work if one of them is ‘a’. We can’t choose the middle because $a_1$ and $a_2$ could be consecutive.

+ +

All in all, there is definitely an efficient solution that returns us a valid alphabet but the code/logic would be a bit messy.

+ +

Randomized Solution: +Just choose a random alphabet. If the alphabet is equal to one of the two alphabets then choose again, else we are done and return the chosen alphabet. That’s it!

+ +
char replace(char a1, char a2){
+	char ch = a1;
+	while(ch == a1 || ch == a2) ch = 'a' + random_number(0,25);
+	return ch;
+}
+
+ +

Just 3 lines of code. It definitely simplified the code and logic. What about running time? We can use the same logic we did for the first example and calculate the probability with which our program wont end in 10 steps. Spoiler: The probability is $(\frac{2}{26})^{10}$ which is even smaller than the previous example.

+ +

Link to my submission

+ +

Problem 3:

+ +

Problem Statement

+ +

Deterministic Solution: +Since this a constructive problem there are multiple solutions all of which require some smart non-trivial observation. +For example one possible answer, is to just print the alternate characters of the given string. This is definitely a simple and fast algorithm, but you need to prove that the answer string you print will always match with at least one of the characters in each substring. This might take some effort and time on your side to convince others and yourself that this algorithm works. Running time wise, this is the fastest solution.

+ +

Randomized Solution: +Choose a random binary string of length $N$. For each substring of length $N$ of the original string, check if at least one character matches with the chosen random string. If there exists some substring which has no matching character then we just choose another random binary string. If for each substring our string is valid then we output it. +Make sure you understand the logic of the above algorithm properly, it can be quite tricky to understand the first time you read it.

+ +

But it is obvious that the string produced by this algorithm is always correct . There is no need of proving to anyone of its correctness. But you need to convince yourself that its fast enough. +Calculating the time complexity is a little more complicated but it can be done. it is of the order $O(N^2)$ and since $N \leq 50$ we can be sure that the algorithm will give the answer quite quickly.

+ +

Link to my submission.

+ +

All the algorithms discussed above fall under a class of randomized algorithms called Las Vegas Algorithms. These are such algorithms that will always give the correct answer but whose running time depends on the randomness of the variables.

+ +

There is another class of algorithms called Monte Carlo algorithms, where the running time of such algorithms are fixed but the algorithm may or may not give the correct answer because the answer depends on the randomness of our variables. For example it may give the correct answer $80$% of the time.

+ +

Conclusion

+ +

Not all problems can be solved using randomization. But do keep a lookout on those that can optimised/simplified using randomness. This just scratches the surface of randomization.

+ +

There are data structures that use randomness called probabilistic data structures(Monte Carlo type) and other data structures like Treaps (Las Vegas type) that depend on randomness for its fast running time. Quick Sort is one of the fastest sorting algorithms because of the property of random numbers. There is also a class of algorithms called Genetic Algorithms(Monte Carlo type) that simulate survival-of-the-fittest concept to find the optimal answer. +So the scope of this topic is quite large and highly practical.

+ +

References

+ +
    +
  • +

    Wikipedia

    +
  • +
  • +

    Computer Algorithms in C++, Computer Science Press, division of W.H. Freeman, New York, September 1996 (with S. Sahni and Sanguthevar Rajasekaran)

    +
  • +
+ + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/GaN/index.html b/blog/GaN/index.html new file mode 100644 index 0000000..fc5c5bb --- /dev/null +++ b/blog/GaN/index.html @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

GaN: Gate to New era

+ +

introduction

+ +

To make life easier, more affordable mankind has always been in search of transforming the current technologies and making it much more better, whether be it wheels to cars, or electric current to cell phones. Different tech giants use slogans such as ‘Be what’s next’ by Microsoft, ‘THINK’ by IBM, etc, thus directly promoting new transformations not only in technology but they point towards an economical product which is easily feasible and accessible to its customers. +Since the dawn of the electronics age over a hundred years ago, power design engineers have been on a quest for the ideal switch, one that will rapidly and efficiently convert raw electrical energy into a controlled, useful flow of electrons. First came the vacuum tube but inefficiency, as evidenced in the heat that they generate, and their large size and high cost, created limits to their ultimate use. Next, in the late ‘50s, the transistor gained widespread use; with its small size and better efficiency they appeared to be the “holy grail” and rapidly displaced tubes while creating enormous new markets unreachable by vacuum tube technology.

+ +

Shrinking lengths of transistors

+ +

In last two decades, length of transistor chips has been shrinking exponentially, parallely making it more efficient. Gallium nitride (GaN), a new member in the family of transistors, is a material that can be used in the production of semiconductor power devices as well as RF components and light emitting diodes (LEDs). GaN has demonstrated the capability to be the displacement technology for silicon semiconductors in power conversion, RF, and analog applications.

+ +

The New Silicon:

+ +

GaN wafer

+ +

Advantages of GaN over Silicon:

+ +
    +
  • +

    lower on resistance giving lower conductance losses and conducting 1000 times faster than silicon

    +
  • +
  • +

    faster devices yielding less switching losses

    +
  • +
  • +

    less capacitance resulting in less losses when charging and discharging devices

    +
  • +
  • +

    less power needed to drive the circuit

    +
  • +
  • +

    smaller devices taking up less space on the printed circuit board

    +
  • +
+ +

Fortunately, the cost to produce a GaN device is inherently lower than the cost to produce a MOSFET device, since GaN devices are produced using standard silicon manufacturing procedures in the same factories that currently produce traditional silicon semiconductors, and the resulting devices are much smaller for the same functional performance. Since the individual devices are much smaller than silicon devices, many more GaN devices can be produced per wafer, thus forming a situation where GaN devices will always cost less to manufacture than their silicon counterparts. As GaN technology improves, the cost gap gets even wider.

+ +

DEVELOPMENTS

+ +

Functioning of radar

+ +

Different studies and researches in various laboratories all over the globe are going on to grow GaN wafers more efficiently.

+ +
    +
  • +

    In 2007, Toshiba Corporation announced that it has developed a gallium nitride (GaN) power field effect transistor (FET) for the Ku-band (12GHz to 18GHz) frequency range that achieves an output power of 65.4W at 14.5GHz, the highest level of performance yet reported at this frequency band. The main application of the new transistor will be in base stations for satellite microwave communications, which carry high-capacity signals, including high-definition broadcasts.

    +
  • +
  • +

    In 2010, Fujitsu developed an amplifier based on gallium-nitride (GaN) high electron mobility transistor (HEMT) technology, which features an output of 12.9W - more than twice the output of previous amplifiers and presently featuring the world’s highest amplification output - when operating in the wide band range of the C-band, X-band, and Ku-band radio frequency spectrums between 6GHz-18GHz.

    +
  • +
  • +

    CeNSE department of IISc, Bangalore is working on growing GaN wafers, designing and manufacturing it indigeniuosly. Moreover, it also aims to produce GaN MOSFETs at economical rate and design indigenious long range radars, in order to make Indian army more advanced and strong.

    +
  • +
+ +

Hope GaN will Drain all its applications from its Source and open new Gates towards to the development of mankind.

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Genome-Editing/index.html b/blog/Genome-Editing/index.html new file mode 100644 index 0000000..0eb9df7 --- /dev/null +++ b/blog/Genome-Editing/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

GENOME EDITING

+

A genome is an organism’s complete set of DNAs, together with all of its genes. Every genome contains all the data required to create and maintain that organism. In humans, a replica of the whole genome (more than three billion DNA base pairs) is contained in all cells that have a nucleus. Modification to provide desired traits in plants, animals, and microbes used for food began around 10,000 years ago. These changes, in conjunction with natural evolutionary changes, have resulted in common food species that are currently genetically totally different from their ancestors.

+ +

Genome Editing

+ +

GENETIC ENGINEERING

+

Genetic Engineering may be a form of genetic modification that involves a deliberate and targeted changes in plant or animal gene sequences to impact a selected attribute by making use of the rDNA technology.

+ +

GENETIC ENGINEERING TECHNIQUES

+ +

Microprojectile Bombardment

+

Klein and his colleagues discovered, in the 1980s, that naked DNA can be delivered to plant cells by “shooting” them with microscopic pellets to which DNA had been adhered. This is often a crude however, an effective physical technique of DNA delivery, particularly in species like corn, rice, and different cereal grains, which Agrobacterium doesn’t naturally remodel. Several GE plants in industrial production were at first remodeled with the help of microprojectile delivery.

+ +

Electroporation

+

In electroporation, plant protoplasts take up macromolecules from their encompassing fluid, accelerated by electrical impulse. Cells growing in a medium are stripped of their protective walls, leading to protoplasts. Providing known DNA to the protoplast medium, and so applying the electrical pulse briefly destabilizes the cell wall, permitting the DNA to enter the cell. Remodeled cells would then regenerate their cell walls and grow to whole, fertile transgenic plants. Electroporation is restricted by the poor potency of most plant species to regenerate from protoplasts.

+

Microinjection

+

The process of microinjection is quite inefficient and extremely labor-intensive compared to alternative techniques. DNA is injected directly into anchored cells. Some proportion of those cells can survive and integrate the injected DNA.

+ +

Transposons/Transposable elements

+

The genes of most plants and a few animal (e.g., insects and fish) species carry transposons, that are short, naturally occurring items of DNA with the flexibility to maneuver from one location to a different one in the within the genome. Barbara McClintock first described such transposable components in corn plants during the 1950s (Cold Spring Harbor Laboratory, 1951). Transposons are investigated extensively in research laboratories, particularly to check cause, and also the mechanics of DNA recombination. However, they need not however been harnessed to deliver novel genetic information to enhance commercial crops.

+ +

GENE ETHICS

+

A gene-editing tool named Crispr-Cas9, that allows us to treat many diseases, has made ethics question graver than ever. This tool behaves like a pair of molecular scissors that can be used very intricately to have an effect on only specific genes, cutting and splicing them to prevent or cure diseases. One widely held opinion is that it’s unethical to use Crispr on the human sperm cell, eggs and embryos because changes can get carried on for generations and present a range of unsought consequences for the humankind. Laboratory analysis has shown Crispr-Cas9 can accidentally alter genes apart from those intended. This means it may disrupt other genes, impairing functions or causing individuals to become susceptible to infections.

+ +

How CRISPR actually works?

+

CRISPR is a combination of a scissor like protein, such as Cas9, and a guide molecule. The molecule acts like a bloodhound taking CRISPR on the hunt to specific sites within the genome. Once there, the protein cuts the cell’s DNA on the spot. That completely disables the targeted gene. The cells then repair their DNA, they put in a new DNA sequence that the bloodhound also carried, or simply patch up the break caused by CRISPR’s molecular scissors. Enter tiny cellular machines called ribosomes. They translate the edited blueprint, skipping the disease-causing genes or producing healthy proteins that the repaired genes code for. CRISPR’s ability to repair may be most important at the beginning of life. Edit the genome of a very early embryo - one created by in vitro fertilization - and couples who carry disease causing mutations will be able to have children spared from them. Once a child is born with a genetic disease, such as Huntington’s or Tay-Sachs, it is more difficult to use CRISPR to treat it. It’s also being used to research and test treatment for cancer, blindness, and liver diseases among others. But CRISPR isn’t just for humans. Editing the genome of mosquitoes can give us the power to stop spread of diseases like malaria. This opens up a new world of technological advancements. When you can edit the DNA’s blueprint, the possibilities are vast. +Crispr Cas9

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Introduction-to-audio-processing-in-NLP/index.html b/blog/Introduction-to-audio-processing-in-NLP/index.html new file mode 100644 index 0000000..c130341 --- /dev/null +++ b/blog/Introduction-to-audio-processing-in-NLP/index.html @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Introduction

+ +

Any machine learning task involves three steps - data collection, training and evaluation. However, for training a machine learning model, we cannot use raw data. We need to pre-process the data to some suitable form and extract features which can be used for training the model. In the case of NLP, audio signals are used as data, hence one must be familiar with the various processing techniques specific to the audio data types. One of the state-of-the-art tools for extracting features from an audio signal is MFCCs (Mel-frequency cepstral coefficients), hence we will be specifically focusing on MFCC feature extraction.

+ +

Useful Techniques and Terminologies

+ +

Fourier Transform

+ +

Fourier transform is an important tool used in signal processing, it is a mathematical transform that converts a time-domain signal into a frequency domain signal. When we calculate a Fourier transform, we begin with a function of time, f(t), and through mathematical decomposition, we produce a function of frequency, F(ω). When discrete signals are involved, Discrete Fourier Transform (DFT) is used, which is normally computed using the so-called Fast Fourier Transform (FFT). Here is a sample Python code to calculate FFT of an audio clip using the SciPy library. You can refer to this link to know more about FFT.

+ +
import numpy as np
+from scipy.io import wavfile as wav
+from scipy.fft import fft
+
+rate, data = wav.read('audio.wav')
+fft_out = fft(data)
+print(fft_out)
+
+ +

Spectrum and Cepstrum

+ +

Two important features in audio processing are Spectrum and Cepstrum. Both Spectrum and Cepstrum are closely related to each other.

+ +
    +
  1. A spectrum is the Fourier transform of a signal, hence a spectrum is the frequency domain representation of a time-domain audio signal.
  2. +
  3. A cepstrum is defined as the Fourier transform of the logarithm of the spectrum. This results in a signal that’s neither in the frequency domain nor in the time domain. The domain of the resulting signal is called the quefrency. You can refer to this link to know more about cepstrum and quefrency.
  4. +
+ +

The reason for converting signals into their frequency domain is related closely to the biology of the human ear. The cochlea is a portion of the inner ear that looks like a snail shell and is a fluid-filled part with thousands of tiny hairs that are connected to nerves. The shorter hairs resonate with higher frequencies and the longer hairs resonate with lower frequencies. Since our ears are frequency analyzers, decomposing audio signals into frequency domain seems like a logical approach to extract features from it.

+ +

The Mel-Frequency Scale

+ +

The human hearing is highly selective to lower frequencies ( < 1000 Hz) and this keeps decreasing as the frequency increases. Mel-Frequency Scale is a kind of psycho-acoustic scale, derived from a set of experiments on human subjects. It has high resolution at lower frequencies and the resolution keeps decreasing as the frequency increases, hence it helps to simulate the way human ears work.

+ +

Mel-frequency cepstral coefficients (MFCC)

+ +

One popular audio feature extraction method is the Mel-frequency cepstral coefficients (MFCC). They are coefficients that collectively make up an MFC (Mel-frequency cepstrum). In the MFC, the frequency bands are equally spaced on the Mel scale, which approximates the human auditory system’s response more closely than the linearly-spaced frequency bands used in the normal cepstrum. Hence MFCCs can represent human audio signals more effectively as compared to ordinary cepstrum or other transformations.

+ +

Steps to calculate Mel-frequency cepstral coefficients

+ +
    +
  1. Break the signal into overlapping frames.
  2. +
  3. Apply FFT to get the frequency Spectrum.
  4. +
  5. Apply Mel Filter banks.
  6. +
  7. Take the logarithm.
  8. +
  9. Apply FFT to get the Mel-frequency cepstral coefficients.
  10. +
  11. Keep the first 13 coefficients and discard the rest.
  12. +
+ +

Calculating MFCC in Python

+ +

Howevere there are many wonderful libraries in python which can do all this in a single line of code. One such library is Librosa. The code for generating MFCC for a sample audio clip is given below.

+ +
import librosa
+from librosa import display
+import matplotlib.pyplot as plt
+
+y, sr = librosa.load(librosa.util.example_audio_file()) # reading audio clip
+
+librosa.display.waveplot(y, sr=sr)                      # plotting audio clip
+plt.title('Audio Wave Plot')
+plt.show()
+
+mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)     # calculating the first 13 MFCCs
+
+librosa.display.specshow(mfccs, x_axis='time')          # plotting the MFCCs
+plt.colorbar()
+plt.title('MFCC')
+plt.tight_layout()
+plt.show()
+
+ +

This is the wave plot of the sample audio clip.

+ +

Wave Plot of Sample Audio Clip

+ +

This is the plot of the first 13 MFCCs of the sample audio clip.

+ +

MFCC Plot of Sample Audio Clip

+ +

References

+ +

Fourier Transform

+ +

Spectrum and Cepstrum

+ +

Mel-frequency cepstral coefficients

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/LICENSE b/blog/LICENSE new file mode 100644 index 0000000..edeb698 --- /dev/null +++ b/blog/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 IEEE NITK + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/blog/Long-Short-Term-Neural-Networks/index.html b/blog/Long-Short-Term-Neural-Networks/index.html new file mode 100644 index 0000000..7471414 --- /dev/null +++ b/blog/Long-Short-Term-Neural-Networks/index.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Long Short Term Memory Neural Networks or LSTM Neural Network is a commonly used Recurrent Neural Network model that is most commonly used in tasks like speech recognition, music generation etc. Lets take a deep dive into what Recurrent Neural Networks are and why we need and use LSTMs.

+ +

Long Short Term Memory Neural Networks

+ +

Recurrent Neural Networks and Why LSTMs?

+ +

Recurrent Neural Networks are those Neural Networks that we use to process information that require us to keep informed of previous information. In simpler words, when we want a model to perform a certain category of tasks like speech recognition, music generation, machine translation, sentiment classification, etc, all of which invloves keeping track of previous information (like keeping track of all the words while processing a sentence during machine translation), a normal Neural Network cannot do this, while a Recurrent Neural Network, which keeps a track of the past information in it’s internal state addresses this issue.

+ + + + + + + + + + + + +
Recurrent Neural Network - Unrolled
RNN
+ +

The above diagram is that of a basic Recurrent Neural Network, the chained structure is appropriate for modeling sequences and using this structure for Neural Networks have proven to work for the above mentioned applications. LSTMs come into play when a certain problem occurs within RNNs itself.

+ +

Problem of Vanishing Gradients due to Long Term Dependencies

+ +

Consider the following small sentence: She was riding her cycle . Predicting the word ‘her’ using RNNs is relatively easy since it just has to process the immediate words next to it, but predicting some sort of information that requires some sort of context from earlier, for example, mentioning I am from France in the beginning of a paragraph, but having to predict the language that was spoken much later in the text. Here, as the gap between relevant information grows, it becomes difficult for RNNs to connect both information to make a valid prediction. This happens because while calculating gradients for the weights during backpropagation, the values from one end of the sequence may find it difficult to influence that in other ends of the sequence which may or may not play an important role in prediction. This is the case in normal RNNs, where ‘long range dependencies’ are not really supported.

+ +

This is where LSTMs come into play!

+ +

Long Short Term Memory Networks

+ +

Long Short Term Memory Networks (usually just called LSTMs) are a special kind of RNN, capable of learning long-term dependencies. They were introduced by Hochreiter & Schmidhuber (1997). They are explicitly designed to avoid the long-term dependency problem by remembering information for long periods of time, and this is possible by introducing ‘memory cells’ which keep track of these dependencies throughout the sequence.

+ + + + + + + + + + + + +
Long Short Term Memory Network
LSTM
+ +

This is how an LSTM looks like, it follows the same chain like structure like that of the RNNs, but it contains several added gates. It may seem difficult to process this as a whole, but we’ll walk through this step by step.

+ +

Note: The sigmoid function returns a value between 0 to 1 and this case, values very close to either 0 or 1 and hence is commonly used in our gates to make a particular decision.

+ +

The following are states and gates involved in an LSTM cell:

+
    +
  1. Activation layer: This layer consists of the activation values like the normal RNNs do
  2. +
  3. Memory Cell or Candidate layer: This layer is involved in keeping track of dependencies
  4. +
  5. Update Gate: Sigmoid function that decides whether or not the memory cell should keep track of the dependecy
  6. +
  7. Forget Gate: Sigmoid function that decides whether or not the memory cell should leave or forget the dependency
  8. +
  9. Output Gate: Sigmoid function that helps us filter what parts of the memory cell layer we want to pass into the output
  10. +
+ + + + + + + + + + + + +
LSTM Structure Inside
LSTM2
+ +

If the diagram is overwhelming, the following equations may help you to walk through the process.

+ +\[\hat{c}^{<t>} = tanh( W_{c}[ a^{<t-1>},x^{<t>} ] + b_c )\] + +

This is the calculation for a memory cell initially which takes into account the previous activation layer and input layers’ weights, and adds it to a bias, while passing the resultant to a tanh function that returns a score between -1 and 1, which in turn carries a dependency.

+ +\[\Gamma_{u} = \sigma( W_{u}[ a^{<t-1>},x^{<t>} ] + b_u )\] + +\[\Gamma_{f} = \sigma( W_{f}[ a^{<t-1>},x^{<t>} ] + b_f )\] + +

Here, the decision is made whether or not to keep track of the dependency with the help of the update and forget gates, which are sigmoid layers.

+ +\[\Gamma_{o} = \sigma( W_{o}[ a^{<t-1>},x^{<t>} ] + b_o )\] + +\[c^{<t>} = \Gamma_{u}*\hat{c}^{<t>} + \Gamma_{f}*c^{<t-1>}\] + +

Here, we decide what exactly to update into the memory cell, which either retains the dependency from earlier or updates it to a new value based on the decision made by the update and forget gates. Hence, the output will be filtered. This is done by running a sigmoid function layer to decide which parts of the memory cell we will send to the output and while the memory cells will be passed through tanh and then passed through the output gate to get only the filtered output. Here, our memory cells are updated appropriately.

+ +\[a^{<t>} = \Gamma_{o}*tanh(c^{<t>})\] + +

The activation layer is influenced by certain memory cell values decided upon by the output gate, and is appropriately updated and passed onto the next cell.

+ +

The resultant \(\hat{y}^{<t>}\) vector is obtained by passing the activation layer through a softmax function, but do note that this step is dependent on what problem we’re solving and isn’t part of the general LSTM framework.

+ +

Character to Character LSTM Model

+ +

We are going to use a two layer LSTM model with 512 hidden nodes in each layer. We will make the model read a text file that contains text from a transcript, in this example we will make the model read an exerpt from ‘The Outcasts’, we will then use the same sequence but shifted by one character as a target.

+ +

Before we get started, here are some key terms to get used to:

+ +
    +
  1. Vocabulary: This is a set of every character that our model requires
  2. +
  3. LSTM Cell : We will make use of pyTorch’s LSTM cell that has the structure, as explained earlier
  4. +
  5. Hidden State or Activation State: This is a vector of size(batch_size, hidden_size), the bigger dimension of the hidden_size, the more robust our model becomes but at the expense of computational cost. This vector acts as our short-term memory and is updated by the input at the time step t.
  6. +
  7. Layers of an LSTM: We can stack LSTM cells on top of each other to obtain a layered LSTM model. This is done by passing the output of the first LSTM cell from the input to the second LSTM cell at any given time t, this gives a deeper network.
  8. +
+ +

The code with explanation in comments is provided at the references section of this article

+ +

The model receives an “A” initially as an input to the LSTM cell at time t=0. After that, we get the output with the size of our vocabulary from the memory cell. If we apply softmax function to the output, we get the probabilities of the characters. Then we take ‘k’ most probable characters and then sample one character according to their probability in the space of these ‘k’ characters. This sampled character is now going to be input to the LSTM cell at time t=1, and so on.

+ +

Always remember that pytorch expects batch dimensions everywhere, and don’t forget to convert numpy arrays into torch tensors and back to numpy again since we are dealing with integers in the end and we need them to look up actual characters.

+ +

Here is some of the output while monitoring the losses during training:

+ +
Epoch: 0, Batch: 0, Train Loss: 4.375697, Validation Loss: 4.338589
+Epoch: 0, Batch: 5, Train Loss: 3.400858, Validation Loss: 3.402019
+Epoch: 1, Batch: 0, Train Loss: 3.239244, Validation Loss: 3.299909
+Epoch: 1, Batch: 5, Train Loss: 3.206378, Validation Loss: 3.262871
+.
+.
+.
+Epoch: 49, Batch: 0, Train Loss: 1.680400, Validation Loss: 2.052764
+Epoch: 49, Batch: 5, Train Loss: 1.701830, Validation Loss: 2.061397
+
+ +

Here is what the model learnt and generated in the first epoch:

+ + + + + + + + + + + + +
First Epoch
epoch1
+ +

and this is the outcome after 50 epochs:

+ + + + + + + + + + + + +
Fiftieth Epoch
epoch50
+ +

Final Outcome

+ +

We can see that the resulting sample that at the 50th epoch doesn’t make much sense, but it does show signs that the model has learned a lot, like some words, some sentence structure and syntax. Now all we need to do is to tweak the model’s hyper-parameters to make it better, and we will have a better character to character model than we started off with.

+ +

References -

+ + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Neural-style-transfer/index.html b/blog/Neural-style-transfer/index.html new file mode 100644 index 0000000..7465b58 --- /dev/null +++ b/blog/Neural-style-transfer/index.html @@ -0,0 +1,572 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Neural Style Transfer

+ +

Neural Style Transfer is the problem of applying the style of an image/painting onto a content image. For Humans the process of painting is seamless. In this blog we will step by step include components into style transfer model, in order to improve the results, first look into the loss functions which capture style representations, next feed-forward networks which produce styled images given style and content image, Then we will look into style embedding and how this can be used to produce new styled images even for unseen paintings.

+ +

Style and Content loss

+ +

As loss function captures the objective of a model, we shall first look into style and content loss functions. When training CNN model for image classification, each layer captures certain features of the input image .the lower layers capture low-level information whereas the higher-level layers capture the high-level content in terms of objects and their arrangement in the input image but do not constrain the exact pixel values. So we can say that the activations of higher layers contain information about the content of an input image. Gram matrix of a layer contains the dot product between different channel activations of a given layer this contains information on correlation of features extracted by different channels of a layer. The gram matrix contains the correlation between activations of different channels of a layer, this is similar to painting where we see a pattern or certain colour play, So we use gram matrix of lower layers as style representation of an input image.

+ +

Style Representation

+ +\[\Large + G_{ij}^l = \sum_k F_{ik}^l . F_{jk}^l\] + +

Here Gijl is the ijth entry in the gram matrix of Layer l. Fil is the activations of ith channel in lth layer. +We use the pre trained VGG16 Network for activations

+ +

Style Reconstruction from Gats et al

+ +

We consider the content representation of the content image to bo the target for content loss and we consider the style representation of style image as a target for style loss.

+ +

Content Loss given Pl is target content activation of layer l:

+ +\[\Large + \mathcal{L}_{content}(\vec{p},\vec{x},l) = \frac{1}{2}.\sum_{i,j}(P_{ij}^l-F_{ij}^l)^2\] + +

Style loss given Al is target style representationof layer l:

+ +\[\Large +E_l=\sum_{i,j}(A_{i,j}^l-G_{i,j}^l)^2\\ + +\mathcal{L}_{style}(\vec{a},\vec{x})=\sum_{l=0}^L(w_l.E_l)\] + +

Here wl is the weight per layer, the weight decreases from lower layers to higher layers

+ +

Total Loss given content representation \(\Large \vec{p}\), style representation \(\Large \vec{a}\), styled image representation \(\Large \vec{x}\):

+ +

\(\Large +\mathcal{L}_{total} = \alpha.\mathcal{L}_{content}(\vec{p},\vec{x})+\beta.\mathcal{L}_{style}(\vec{a},\vec{x})\) +Here \(\large \alpha\) and \(\Large \beta\) are weights for content and style loss.

+ +

The brute force method to generate the styled image is to take a noise image and calculate its loss from pre-trained image classifier given style and content image and then apply gradient descent on individual pixels of noise image and repeating this process iteratively till we convert noise image to styled image. This method consumes a lot of time and there are no learned parameters.

+ +

Image Transformation Network

+ +

Image Transformation Network from Jonson et al

+ +

Here the image transformation network learns to map the content image to the style of the painting image, using this network we can generate images of a particular style. The image transformation network consists of Residual blocks and non-residual convolution layers, for upsampling it uses fractional strided convolution. Batch normalisation takes place after every convolution layer, The output layer uses tanh activation to provide output in the range [0-255] The loss network is used to calculate the respective content and style loss given the style and content image. Using gradient dissent the model is trained in order to decrease the loss. The drawback of this is it can be used to generate the style of a single painting and not multiple paintings, so training new weights for new painting style is not practically feasible as it takes a lot of memory. In the conditional instance normalisation, we will make a few changes to this image transformation network using which we can generalise or use the same weights for multiple styles.

+ +

Conditional Instance Normalisation

+ +

We can see that many paintings share some common features like brush strokes etc, conditional instance normalisation helps us to encode style into an embedding and a common image transformation network for multiple styles. To understand about instance normalisation please look at this blog link. We see in this paper that instance normalisation is better than batch normalisation in image transformation network. For using a single image transformation network for multiple styles, we see the work in this paper, where they found a surprising fact about role of normalisation in transformation network, where scaling and shifting of the instance normalized activations can be used to produce different styles. For each style, the activations of instances normalised layer are scaled and shifted differently and these scaling and shifting parameters represent the style as an embedding in space, we can use this property and can find embedding of different styles and during production for different styles, we can just change these shifting and scaling parameters in order to produce different styles, which majority of the weights remaining the same.

+ +\[\Large +z = \gamma_s.(\frac{x-\mu}{\sigma}) + \beta_s\] + +

So for each style we can train γs and βs which represents the particular style and can be replaced if we wanted different style. this decreasing the cost of memory.

+ +

Applying Instance Normalisation

+ +

The image transformation network details are given in this paper For implementing multi-style transfer;

+ +

Image Transformation Network Details

+ +

The main drawback of this is we can not generate a styled image for an unseen style.

+ +

Style Prediction Network

+ +

Image Transformation Network along with style prediction network

+ +

The style prediction network takes the style image as input and produces the style embedding(shift and scale parameters) for the particular style. This helps us to generalise to unseen styles. The style prediction network generates the shift βs and scaling parameters γs which are described in conditional instance normalisation part. On plotting the embedding of style image we can see that similar styles are close to one another. This model is time,space-efficient and also it can generate stylized images for unseen style, this model can be deployed on mobile and desktop apps and would produce amazing results. For more information refer to this paper

+ +

References

+ + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/README.md b/blog/README.md new file mode 100644 index 0000000..ac613b3 --- /dev/null +++ b/blog/README.md @@ -0,0 +1,102 @@ +# Contributing guidelines +### Step 1: Fork this repository and clone it +- Install git if you don't have it. Here's an [article](https://www.digitalocean.com/community/tutorials/how-to-contribute-to-open-source-getting-started-with-git) on how to install git on Windows/Linux/macOS +- Fork the [blog repository](https://github.com/IEEE-NITK/blog) and clone it. +If you're not sure how to fork or clone a repository, refer to [this](https://www.digitalocean.com/community/tutorials/fork-clone-make-changes-push-to-github) article or do some googling on your own, or ask someone on our Slack workspace under the #github channel. +### Step 2: First-time authors +If you're not a first time author, feel free to skip to the next section. + +- Add your image to the `assets/img/authors` folder and make sure you have a square image. +- Open the file `_data/authors.yml` and add your details at the end of the file in the following format: + ``` + : + name: + github: + author_image: + description: + email: + ``` +### Step 3: Adding the post +- Create a new `.md` file in the `_posts` folder and name it in the following format: + `year-month-date-title-of-your-choice.md` +- Add content to your new post in markdown syntax. Refer to [this](https://guides.github.com/features/mastering-markdown/) link about Github's flavor of markdown or try googling it if you're not familiar with markdown. Here's an example: + ``` + --- + layout: post + title: "Writing a sample blog" + author_github: githubuser123 + date: 2017-05-14 23:32:44 + image: '/assets/img/' + description: 'Introductory post on writing a blog' + tags: + - IEEE NITK + - Blog + categories: + - CompSoc/Diode/Piston + github_username: 'githubuser123' + --- + GraphQL is a query language for APIs and a runtime for fulfilling those queries + with your existing data. + GraphQL provides a complete and understandable description of the data in your API, + gives clients the power to ask for exactly what they need and nothing more, + makes it easier to evolve APIs over time, and enables powerful developer tools. + ``` +- A post consists of the head and the body: + #### Head: + - layout : should always be set to "post" + - title : title of your post + - author_github : your github username + - date : today's date in the format '2020-04-25 17:30:30 ' + - image : location of the images, should always be set to 'assets/img/' + - description : a description of your post + - tags : post tags + - categories : categories your post belongs to + - github_username : your github username + #### Body: + - This is where your content goes. In Github's flavor of markdown. + +### Step 4: Build locally and check for errors + - Install [Ruby and Jekyll](https://jekyllrb.com/docs/installation/) + - Install other dependencies: + ``` + gem install html-proofer jekyll-paginate jemoji + ``` + - Then build your blog: + ``` + jekyll build --destination blog/ #from the root of this repository + ``` + - To preview the blog locally: + ``` + jekyll serve #from the root of this repository + ``` + The output of jekyll serve should have at the bottom: + ``` + Server address: http://127.0.0.1:4000/ + Server running... press ctrl-c to stop. + ``` + Open [http://127.0.0.1:4000/](http://127.0.0.1:4000/) in your browser to preview the blogs + + - To test for errors: + ``` + htmlproofer ./_site --disable-external #from the root of this repository + ``` + The final output of htmlproofer should be something like: + ``` + Ran on XYZ files! + + HTML-Proofer finished successfully. + ``` + If not, check for missing links and follow the error message + - Remove the build files before making your commits + ``` + rm -r blog/ + ``` + +### Step 5: Pushing your article to the repository +- Create a new branch in your local repository and commit your changes to it. +- Push the newly created branch to the main repository and create a Pull Request +- When making the pull request follow this: + - Title : New article: (post title) + - Description : A short description about your article + +Resolve merge conflcts in your Pull Request, if any. Refer to [this](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github) link on resolving merge conflicts or try googling or ask someone on our Slack workspace under the #github channel. diff --git a/blog/Radar-Imaging/index.html b/blog/Radar-Imaging/index.html new file mode 100644 index 0000000..4000b43 --- /dev/null +++ b/blog/Radar-Imaging/index.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

RADAR IMAGING

+ +

The World Wars were undoubtedly the worst things to happen to mankind but, they also birthed some ground breaking technology that is till date being used, one such example is the RADAR, acronym for Radio Detection and Ranging.

+ +

RADARs are a combination of EM transmitters and receivers that can be used to detect the presence of objects in a particular range specified for that RADAR. The principle involved is the reflection of the EM waves off the target and detection by the receiver of the RADAR.

+ +

firstimage

+ +

The diagram represents a high level representation of monostatic RADAR, i.e. the RADAR unit consists of both the transmitter and receiver , both turning on/off alternatively by using a duplexer.

+ +

In this article Pulse RADARS are discussed. Range can be more accurately measured by Pulse RADARs.

+ +

EM waves are transmitted in a pulse and time is given for reception before the next pulse transmitted.

+ +

secondimage

+ +

The entire time taken for transmission and reception is called Pulse Repetition Interval (PRT) as the next pulse is transmission happens after the previous one after one PRT.

+ +

The RADAR transmits EM waves in certain directions and targets are detected when the EM waves get reflected off the target and received by the RADAR. The time delay between transmission and reception of the EM wave is recorded and thus the Radial Range of the target is calculated as

+ +

R= c * t/2

+ +

c is the velocity of EM wave

+ +

t is the time delay between transmission & reception

+ +

The Radial Velocity of the target can also be measured by the frequency deviation between the transmitted and received wave, this phenomenon is called the Doppler Effect.

+ +

The EM waves transmitted by the RADAR can be reflected by more than one point on the target (eg: aeroplane), these points can be called Scattering points and the ability of the RADAR to recognize the target largely depends on its ability to differentiate between these points, this property is called Range Resolution.

+ +

Range Resolution is the minimum separation in range of two distinguishable points.

+ +

The resolution of Pulse RADARs inversely depends on the pulse width, but if the pulse width is too less, the intensity of the transmitted wave and thus the received wave will decrease. Thus, to solve the problem of this trade off, a technique called Pulse Compression is used.

+ +

Pulse compression is a signal processing technique of modulating the transmitted pulse and then correlating the received signal with the transmitted pulse. There are several types of Pulse Compression methods some of which are Linear Frequency Modulation ( LFM ), Stepped frequency , Costa's frequency coding.

+ +

thirdimage

+ +

Linear Frequency Modulated wave , the frequency is proportional to the time in the pulse .

+ +

There are two prominent types of RADAR imaging: SAR and ISAR

+ +

SAR (Synthetic Aperture RADAR) is when the RADAR is moving and ISAR (Inverse Synthetic Aperture RADAR) is when the RADAR is stationary.

+ +

There are two important elements of a RADAR image, Range & Cross Range.

+ +

Range is distance along the axis in the direction of the propagation of the beam. It is taken as the component of Slant Range (radial distance)along the line joining the RADAR and the centroid of the target.

+ +

Cross range is the distance along the axis perpendicular to that of Range.

+ +

fourthimage

+ +

In RADAR imaging, the Range profile is obtained by the time delay between transmission and reception, while, the cross range profile of the target is obtained by the doppler frequencies obtained in the received signals.

+ +

While Range resolution can be obtained by Pulse Compression, Cross Range Resolution is obtained by having narrow beam, which requires larger antennas, but as this imposes physical challenges, Synthetic Aperture RADAR were made, i.e. a small antenna emulates a bigger aperture antenna by using the RADAR's movement relative to the target and some processing techniques. Rotation of the target relative to RADAR is essential

+ +

fifthimage

+ +

SAR

+ +

sixthimage

+ +

ISAR

+ +

The Doppler shift in frequency is caused by radial component of the velocity of a point alone and we can observe that when there is rotation of a target, different resolvable points will have relatively different radial velocity and thus will induce different Doppler shifts and thus the relative position of each scattering point can be obtained in the Cross Range profile.

+ +

RADAR imaging is a very useful technique and has both civilian and military applications. For example, SAR imaging can be used to survey landscapes and terrains, ISAR imaging has military application of recognizing flying objects in an airspace.

+ +

seventhimage

+ +

ISAR image of a passenger aeroplane

+ +

eigthimage

+ +

ISAR image of a Fighter Jet

+ +

ninthimage

+ +

SAR image

+ +

References:

+ +

http://www.radartutorial.eu/index.en.html

+ +

Inverse Synthetic Aperture Radar Imaging With MATLAB Algorithms - Caner Ozdemir

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Requirements-and-Importance-of-Research/index.html b/blog/Requirements-and-Importance-of-Research/index.html new file mode 100644 index 0000000..0326403 --- /dev/null +++ b/blog/Requirements-and-Importance-of-Research/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Research, an informal testimony

+ +

The feeling of working with the author of textbooks that you first read to learn a subject is something beyond the ability of adjectives to explain. However, it is also the time when you begin to realize what you know is barely a fraction of what exists and that there’s always much more to learn. I am extremely privileged to have spent the summer at Stanford Microfluidics Lab as a UGVRI. Now before getting into more details I’d like you to know a little history and the following content is aimed at leaving you takeaway 3 points that I think is important as an aspiring researcher. 

+ +

Just like most other enthusiastic students in freshman year I would try to participate in all activities happening in college and one such event was the IEEE Insight. I remember sitting there awestruck staring at the faces of the then ‘seniors’ (read ‘accomplished professionals in making’) not paying attention to much of what they said but just wondering if there could be a day when I could be standing in their position. Note here that it has, for years, been my goal to be a space scientist. I came back to hostel after the talk and the year just passed by until I heard again the same faces speak at the IE Spark. What changed in these months were only that the speakers had cracked a milestone securing admits from premier institutions and reputed positions in leading companies but I as an audience just remained where I was. I believe this is when I realized the power of doing meticulous research (well, it applies to any work practice for that matter). Since then has also been a time when I’ve overlooked academics and stuck to reading stuff that interests me. I would suggest to not compromise on getting good grades but even if it is low it’s not the end of everything. 

+ +

Research, like every other work, by it’s very nature requires that one is thorough with the governing fundamentals and it’s important to realize that there’s no point of research if it leads to no additional understanding of the phenomenon under study. To begin with, research requires a well-defined problem statement that needs to be solved for which brainstorming and intensive literature review are the prime ways to go.  As a matter of fact, most leading discoveries happened either accidentally or in the process of solving a problem that was entirely different. The aim should not be to complete a project quickly but to progress slowly, trying to question, infer, learn and verify as much as possible at each step. 

+ +

Often I find myself grunting over few topics wondering the need for me to read about it and I think many might be of the same opinion, but what if I tell you that the one derivation of chip formation or the assumptions made in a hypothesis that you once neglected might just give you insight to resolve a complex experimental fix, or get you past the interview of your dream company! Research is extremely interdisciplinary and there is no single topic that you should feel is not necessary to know about. For research at least, the ones to make it big are “Jack of all, master of at least one”, but “Jack of all master of none” is much better than one who’s a “Jack of few master of none” and other average traits. Also crucial for research is writing, documenting and presentation skills. A world class researcher inventing a revolutionary technology but not being able to document it in a manner comprehensible for a reader, is just as good as a layman dreaming to make it big but doing nothing towards realizing the dream. Thus, a true researcher is constantly enhancing their knowledge base, skill sets and trying to find answers from observing nature. 

+ +

It’s quite natural to claim a field of interest as the one that you’re relatively ‘good at’ (read ‘just scoring well in’) or the one in which you have a couple projects to highlight on your resume. Well, if you’re sure that’s the exact field you want to be working on, it’s brilliant! But otherwise, it’s never a good idea to refrain from exploring different domains, it helps diversify your knowledge and gives a better insight into problems that you want to work on from a career point of view. Having chosen to work on a wide range of projects and realizing that every one of those had something to contribute later where I thought they’d be absolutely irrelevant, I can definitely affirm. To justify the same, at Stanford, I led a theoretical and experimental study on microfabricated sheet jet nozzles for X-Ray spectroscopy studies. Initially during acceptance for the internship I was on an entirely different biological project. However being open and choosing to work on this project helped me gain a wide range of experience including microfabrication techniques, fluorescence imaging, microscopes and CCD Cameras, computational design and CFD simulations, UV laser ablators and some insight into Field Electron Lasers & X-Ray beams which may not have been the case otherwise. So it’s really important to be open to trying new things and remain in constant pursuit of innovation, for the worse that can happen, is an experiment failing, but analyzing the failure might be the biggest key to various other successful experiments. 

+ +

Coming to the application processes, there are a lot many exchange programs, deadlines for application for most of which are about 6-8 months prior to the start of the program. The exact criteria for a successful application remains in a black box, so it’s just a matter of trying your best and hoping for good. Given the rigorous competition for these programs, it can never hurt to write mails to the  many professors whose work interest you. Again here, there’s no standard for a successful mail, but a short explanatory resume with crisp cover mail expressing your interest, the reason for choosing the lab and relevant experience (if any) might be the right way to start off with. In most cases it may be possible that there’s no opportunity at some time, but staying in touch with the professors definitely helps open prospective avenues. I’ve known many students giving up quickly assuming things won’t work out, but believe me when I say patience and perseverance can seldom go in vain. 

+ +

Following your passion and hobbies can never go wrong, cheers to  the noble thought of pursuing novel research. Thanks for reading and I wish you the best!

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/SLAM/index.html b/blog/SLAM/index.html new file mode 100644 index 0000000..476b4a1 --- /dev/null +++ b/blog/SLAM/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Image Link to Video +With the increased use of robots in industries, the need for robots to be more efficient is incredibly high. One of the key concerns is the way in which they commute. Gone are the days when robots were restricted to moving in a pre-defined path, and one of the most fundamental technologies for locomotion of mobile robots are coverage algorithms. +Coverage algorithms require that they allow the bot to cover the maximum area possible without any human intervention. In previously used algorithms, the coverage was achieved with robots crossing the entire length possible in a straight line and then turning and tracing the path in a straight line again. These algorithms worked poorly when the region they had to cover were filled with many obstacles and many of them even need information about the area to be mapped beforehand.
+The SLAM (Simultaneous Localization and Mapping) algorithms ensure that the robot maps out the entire area and also keeps track of its own position. Without knowing where it is, the situation is similar to a human in a room with a blind fold on, you can move the person around multiple times and feed them the path by doing so, but without being able to see where they are, they would still struggle. Because of this, SLAM provides a significant advantage over previously used algorithms, making it a widely used algorithm today. Robots such as Boston Dynamics’ Spot and Anybotics’ Anymal use SLAM to achieve motion from one point to another without any human intervention. SLAM allows the robots to avoid obstacles in an efficient manner making them highly suitable for use in industries where the terrain and work environment need not always be well suited for automated vehicles.

+ +

The processing involved in a SLAM algorithm is:

+
    +
  • Landmark Detection and Extraction
  • +
  • Data association with other objects
  • +
  • State estimation of the robot
  • +
  • State update of the robot position
  • +
  • Landmark updates as we proceed +SLAM isn’t only prevalent in robots, but also in self driving cars. Agreed, GPS is a very viable option, but in situations where GPS isn’t highly functional and optimized, and to go to places that haven’t been mapped, SLAM could prove to be a far better option as it requires no data beforehand. +So, if you’re interested in mobile robots, self-driving cars or anything related, you might want to educate yourself about the various SLAM algorithms out there, because you’ll need it.
  • +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Solving-Switch-Riddle-using-RL/index.html b/blog/Solving-Switch-Riddle-using-RL/index.html new file mode 100644 index 0000000..24a0b46 --- /dev/null +++ b/blog/Solving-Switch-Riddle-using-RL/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

In this article, we will use a Reinforcement Learning based method to solve the Switch Riddle problem. So, let’s start with defining the riddle.

+ +

Switch Riddle

+ +

There are n prisoners in prison and a warden. The Warden decides to free the prisoners if they can solve the following problem. So, every day the Warden will select one of the prisoners randomly and send him to an interrogation room which consists of a light bulb with a switch. If the prisoner in the room can tell that all other prisoners including him have been to the room at least once then the Warden will free all of them otherwise kill all of them. +Except for the prisoner in the room, other prisoners are unaware of the fact that who got selected on that particular day to go to the interrogation room.

+ +

Switch Riddle

+ +

Image Source

+ +

Now, the prisoner in the interrogation room can switch on or off the bulb to send some indication to the next prisoner. He can also tell the warden that everyone has been to the room at least once or decide not to say anything. If his claim is correct, then all are set free otherwise they are all killed.

+ +

Problem Formulation

+ +

We can observe that switch riddle problem comprises of multiple agents working towards completing a single task. Therefore, the puzzle fits in a Multi-Agent setup where the agents are collaborating to complete the task. +We will use a Deep Reinforcement learning based algorithms called the DIAL( Differential Inter Agent Learning) to solve this riddle.

+ +

The things that we need to define for most RL problems are states, actions, and rewards. So let’s formulate these:

+ +

State

+

The state for each agent or prisoner is whether the agent is in the interrogation room or not, i.e., if the prisoner n is in the room, then he receives a 1 and others 0 for that particular day or time step.

+ +

Action

+

There are two choices the prisoners have

+ +

1 - Tell the Warden.

+ +

2 - Don’t tell the Warden.

+ +

Reward

+

The reward is received at the end of the episode.

+ +

+1 - Completing the task.

+ +

-1 - Telling the Warden before everyone has gone to the room once.

+ +

0 - If the prisoners can’t conclude within the max number of time steps.

+ +

In the implementation, the maximum number of timesteps is set to \(4 \times n - 6\) where n is the number of agents. +In addition to state, action, and reward, since the agents need to communicate through the light bulb to send some information to the next prisoner, we also have this one-bit communication channel, i.e., the bulb.

+ +

Messages

+

Training Time - In DIAL during training, the messages are continuous; i.e., it can take values ranging from 0 to 1.

+ +

Test Time - While testing the agents can only communicate with 0 or 1.

+ +

0 -> Bulb is off

+ +

1 -> Bulb is On

+ +

DIAL Algorithm

+ +

The following diagram shows the architecture of the model used in DIAL.

+ +

DIAL

+ +

Image Source

+ +

There are two possible ways in which we can train our model -

+ +

1) Without Parameter sharing

+ +

2) With Parameter sharing

+ +

Parameter Sharing means all the agents share the same neural network parameters or we can say that there is a single central network that learns for all the agents.

+ +

While in No-Parameter sharing there are separate networks for each agent.

+ +

Implementation details -

+ +

Following is the model architecture used in the original paper -

+ +

DIAL Architecture

+ +

Image Source

+ +

1.Instead of directly giving input observation as 0 or 1 to the neural net, it is passed through an embedding layer.

+ +

2.The message from the previous agent is passed through a 1-layer MLP before giving it as an input to the RNN.

+ +

3.The previous actions of the agent and agent id are passed through lookup tables.

+ +

4.The final state embedding is given by -

+ +\[z^a_t = (TaskMLP(o^a_t) + MLP[|M| , 128 ](m_{t-1}) + Lookup(u^a_{t-1}) + Lookup(a))\] + +

5.For better stability and performance a batch normalization layer can be used to preprocess \(m_{t-1}\).

+ +

6.\(z^a_t\) is processed through a 2-layer RNN with GRUs, \(h^a_{1,t} =GRU[128, 128] (z^a_t, h^a_{1,t−1})\), which is used to approximate the agent’s action-observation history.

+ +

7. +Finally, the output \(h^a_{2,t}\) of the top GRU layer, is passed through a 2-layer MLP \(Q^a_t, m^a_t =MLP[128, 128,(|U| + |M|)](h^a_{2,t})\).

+ +

References -

+ + + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/Solving-a-traffic-problem-using-graph-decomposition/index.html b/blog/Solving-a-traffic-problem-using-graph-decomposition/index.html new file mode 100644 index 0000000..7db7905 --- /dev/null +++ b/blog/Solving-a-traffic-problem-using-graph-decomposition/index.html @@ -0,0 +1,800 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Solving a traffic problem using graph decomposition

+ +

The Capital city is known for its prosperous life and big opportunities. Its inhabitants are called “capitolates”. Every capitolate in Capital city wants to live a happy and peaceful life. Now Capital city has three divisions - Residential town, Fun town and market city. Residential town is where capitolates live. Fun town is where they meet friends and make merry. Market city is where they work to make a living. But every passing year, capitolates are becoming more and more frustrated and unhappy. The reason is that people from neighbouring lands want to become capitolates and are moving to Capital city. This is making the roads busier and traffic slower. In particular, every road intersection in market city has become a deadly traffic bottleneck.

+ +

The ten peace-keepers of Capital city propose an unconventional solution to this traffic problem - “Transform market city and make all the roads one-way”. But at this juncture a few questions arise:

+ +
    +
  1. +

    In what direction should each one-way road go?

    +
  2. +
  3. +

    Is every traffic intersection in market city still reachable from every other traffic intersection in market city using these one-way roads? If not, which intersections are not reachable from one another?

    +
  4. +
+ +

Now, the nine hard working peace-keepers explore different possible one-way transformations of market city. They call the transformation “good” if every traffic intersection is reachable from every other traffic intersection. They assign the tenth peace-keeper, the lazy one, the job of finding whether a given transformation is “good”. If you are the tenth peace-keeper, you are in luck, for we will show you how to accomplish this task, in a fraction of a second, using our vast computing power.

+ +

Formal ideas and definitions

+ +

Before we present a solution to our main problem, we first define some mathematical terms and explore a few key ideas. We will then redefine the main problem statement using those mathematical terms. We will explore the following ideas.

+ +
    +
  • +

    The idea of a graph

    +
  • +
  • +

    Exploring a graph

    +
  • +
  • +

    DFS (Depth First Search)

    +
  • +
  • +

    Connectedness and connected components of a graph

    +
  • +
  • +

    Directed graphs

    +
  • +
  • +

    Strong connectedness

    +
  • +
+ +

The idea of a graph

+ +

alt text

+ +

In mathematics, and graph theory, a graph is a set of objects in which some pairs of the objects are in some sense “related”. The objects are called vertices(also called nodes) and each of the related pairs of vertices is called an edge. In the picture, A, B and C are the vertices and the pairs (A, B) and (B, C) are edges.

+ +

Many important phenomena can be represented using graphs. Examples are:

+ +
    +
  • +

    Webpages connected by links

    +
  • +
  • +

    Intersections connected by roads

    +
  • +
  • +

    People connected by friendships in social networking.

    +
  • +
+ +
+

Formally, a graph G is a collection v of vertices, and a collection E of edges, each of which connects a pair of vertices.

+
+ +

Exploring a graph

+ +

We have the following definition for a path in G:

+ +
+

A path in a graph G is a sequence of vertices v0, v1, v2, …, vn so that for all i, (vi, vi+1) is an edge of G.

+
+ +

We now have a tool to define Reachability:

+ +
+

Two vertices u and v (u not equal to v) are reachable if there exists a path from u to v.

+
+ +

When we say we explore a graph G, it means that we start at an “unvisited” vertex v of the graph and then start visiting vertices that are reachable from v using the edges in G. Once we finish visiting all vertices reachable from v, we mark the visited vertices as “visited”. Initially, all vertices are “unvisited”.

+ +

Depth First Search (DFS)

+ +

The next thing we will do is give a way to reach all vertices of a graph. The idea is intuitive and easy to understand. What DFS does is, it starts at an unvisited vertex of G and explores it, and continues to do this for every other unvisited vertex of G. So when DFS finishes, we end up visiting every vertex of G.

+ +

For example, consider the following graph on eight vertices.

+ +

alt

+ +

When we run DFS on the graph, we start at some vertex of the graph, say, A. We then explore A:

+ +

A is visited

+ +

alt

+ +

B is visited

+ +

alt

+ +

C is visited

+ +

alt

+ +

D is visited

+ +

alt

+ +

After exploring A as shown in the pictures, we check for other unvisited vertices. Since B, C, and D are already visited, our next unvisited vertex is E. We explore E, and then, F. After exploring F, we will have visited all vertices. This completes our DFS exploration.

+ +

Connectedness

+ +

Connectedness in a graph G is a property which helps us understand which vertices in G are reachable from which others. The following theorem holds for every graph G:

+ +
+

The vertices of G can be partitioned into Connected Components so that a vertex v is reachable from a vertex w if and only if they are in the same connected component.

+
+ +

alt

+ +

In the graph above, the vertices {A, B, C, D} form the first connected component. The vertex {E} forms the second connected component. Finally the vertices {F, G, H} forms the third connected component.

+ +

You might realize that this notion of connectivity gets us closer to the problem that we want to solve. But we are not quite there yet. We also have to tackle the issue of one-way roads. Before we move on, we give a modification of the DFS algorithm to give ourselves more capability. We introduce a new feature - pre and post orderings. We store two variable called previsit and postvisit for every vertex. Every vertex is given the label (previsit/postvisit).

+ +

We store an extra variable called clock. Each time we enter or leave a vertex the value of the clock is incremented by 1. We assign pre and post order values to each vertex as follows:

+ +
    +
  1. +

    During exploration, each time a vertex v of the graph is visited, we assign the current value of clock to the previsit value of v.

    +
  2. +
  3. +

    When exploration of v finishes, we assign the new value of the clock to the postvisit value of v.

    +
  4. +
+ +

Example: Consider a graph on six vertices.

+ +

alt

+ +

The following illustration shows how previsit and postvisit values are assigned to the vertices when we run DFS on the graph.

+ +

Clock = 1:

+ +

alt

+ +

Clock = 2:

+ +

alt

+ +

Clock = 3:

+ +

alt

+ +

Clock = 4:

+ +

alt

+ +

Clock = 5:

+ +

alt

+ +

Clock = 6:

+ +

alt

+ +

Clock = 7:

+ +

alt

+ +

Clock = 8:

+ +

alt

+ +

Clock = 9:

+ +

alt

+ +

The other component of the graph is given pre and post orderings in a similar fashion. After all components are assigned pre/postvisit numbers, the graph looks like:

+ +

alt

+ +

Directed Graphs(DiGraphs)

+ +

alt

+ +
+

A directed graph is a graph where each edge has a start vertex and an end vertex.

+
+ +

Examples are:

+ +
    +
  • +

    Streets with one-way roads (an abstraction of our traffic problem)

    +
  • +
  • +

    Links between webpages.

    +
  • +
  • +

    Followers on social networks like instagram

    +
  • +
  • +

    Dependencies between tasks (sometimes some tasks need to be performed before others).

    +
  • +
+ +

Strong Connectedness

+ +

Strong connectedness in a directed graph is analogous to connectedness in a non-directed graph.

+ +

For any two vertices in a digraph v and w, there are three different possibilities:

+ +
    +
  1. +

    w is reachable from v and v is reachable from w.

    +
  2. +
  3. +

    Exactly one of v or w is reachable from the other.

    +
  4. +
  5. +

    w is not reachable from v and v is not reachable from ww.

    +
  6. +
+ +

The first case sets up the basis for strong connectedness.

+ +
+

A directed graph can be partitioned into strongly connected components (SCCs) where two vertices are connected if and only if they are in the same component.

+
+ +

Consider the graph P below:

+ +

alt

+ +

The sets { A, B, C, E }, { H, I }, {D}, {F}$ and {G} form the five strongly components of the above graph P.

+ +

We define the final tool that we will use to solve our problem:

+ +
+

The metagraph M of a directed graph G is the graph with its vertex set as the set of SCCs of G and edges showing how the SCCs connect to each other.

+
+ +

It should be noted that the metagraph of G will be a Directed Acyclic Graph (A directed graph with no cycles) or a DAG. This property should hold, since if there were a cycle in M, then we will have at least two SCCs in G, which are a part of the cycle, reachable from each other, which contradicts the fact that they belong to two different SCCs.

+ +

The graph below is the metagraph of the graph P we have described in the above picture.

+ +

alt

+ +

In the above metagraph, W is the SCC consisting of the vertices A, B, C and E, Y is the SCC consisting of the vertex F, X is the SCC consisting of the vertices H and I, Z is the SCC consisting of the vertex G and V is the SCC consisting of the vertex D.

+ +

We now have the tools to simplify our main traffic problem. Market city can be seen as a DiGraph with the one-way roads as edges. We just have to compute the strongly connected components of market city.

+ +

The algorithm we use to get our work done here is called Kosaraju’s algorithm.

+ +

An abstraction of the problem

+ +
+

Given a DiGraph G, compute the strongly connected components of G.

+
+ +

This is a simpler version of our original problem.

+ +

Naively, what we can do is, for each vertex v in G, we can explore v to find the vertices that are reachable from v. And then, we can find the vertices u reachable from v that can also reach v. This, by definition, will give us the strongly connected components of G. But the problem with this procedure is that it takes a lot of steps to complete. We want to design a much faster algorithm. To achieve that, we make a few elegant observations.

+ +
    +
  1. Sink SCCs: An important theorem in graph theory tells us that for a DAG, there always exists a sink vertex (a vertex with no outgoing edges) and a source vertex (a vertex with no incoming edges) in the DAG (We leave the proof as an exercise). For our problem, the DAG in question is the metagraph M. Hence, there is a “sink strongly connected component(sink SCC)” in G.
  2. +
+ +

The idea is that if a vertex v is in a sink SCC, then if we run explore on v, we will find all the vertices in the strongly connected component that v is in.

+ +

But we need a way to find a sink SCC of G.

+ +
    +
  1. +

    Another important theorem in graph theory tells us that in a DAG, the vertex with the largest postvisit number lies in a source vertex of the DAG (Proof can be found here). Again, the DAG in question is the metagraph M. Hence, the vertex with the largest postvisit number in G lies in a source SCC of G.

    +
  2. +
  3. +

    Our problem was that we wanted a sink component. But we know how to find a source component. So we reverse the direction of all the edges in G to find the transpose of the graph GR. The following properties hold for GR:

    +
  4. +
+ +
    +
  • +

    GR and G have the same SCCs.

    +
  • +
  • +

    Source components of GR are sink components of GR.

    +
  • +
  • +

    The vertex with the largest postorder in GR is in a sink SCC of G.

    +
  • +
+ +

We are in the home stretch now. Our job is much simpler. We just run DFS on GR and assign pre/postvisit numbers to every vertex. Then we start removing the components associated with the vertex with the largest postvisit number in GR. In the end, we end up finding the SCCs of G. We illustrate the procedure on the sample graph we described before.

+ +

G:

+ +

alt

+ +

GR:

+ +

alt

+ +

We first assign pre and post visit numbers to every vertex:

+ +

alt

+ +

We remove the SCC with the vertex with the highest post order number. That is we first remove the vertex F and all the edges going from F:

+ +

alt

+ +

From the resulting graph above, we remove the component having the vertex with the next highest post visit number, that is I:

+ +

alt

+ +

We continue this process until we have found all the SCCs:

+ +

alt

+ +

And finally:

+ +

alt

+ +

The algorithm we explained now is called Kosaraju’s Algorithm. This completes the solution to our problem. The transformation is good if there is only one strongly connected component. We have successfully found out the disconnected intersections in market city!

+ +

A mathematical analysis of the above algorithm shows that the total time it takes to run the algorithm is proportional to the sum of the total number of vertices and the total number of edges in the graph. Today’s computers can accomplish this within the blink of an eye!

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/TarjansAlgo/index.html b/blog/TarjansAlgo/index.html new file mode 100644 index 0000000..ee85b74 --- /dev/null +++ b/blog/TarjansAlgo/index.html @@ -0,0 +1,574 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Background
+Strong components in directed graphs are components in which all vertices are strongly connected to each other. +2 vertices A and B are strongly connected if there is a directed path from A->B and B->A.

+ +

Need for Computing Strongly Connected Components
+Computing strong components for graphs has been a need in computation since many years now. Biologists use the strong components to find out sub-ecosystems in a food chain. During the early advent of the internet, this became an absolute necessity as dependency graphs of various software modules needed to be processed and their strong components extracted, to know which modules could be packed together. Especially today, with traffic routing problems and due to the presence of one-ways, directed graphs and operations on them have been studied by engineers working in many top tier companies.

+ +

The Breakthrough
+Many years since the advent of computation people had been wondering how to find the connected components in a directed graph(efficiently). So the problem that they faced in simple words was : Given a graph G with V vertices and E directed edges, obtain the strong components of a graph. At first sight this seems very hard and many seem to think of the brute force approach, i.e. take all pairs of vertices and check for strong connections. And indeed this was what was being done prior to 1972 when the breakthrough occurred and the algorithm was named for its inventor, Robert Tarjan(he’s still alive). And a huge surprise was that the solution was linear!

+ +

How the Algorithm Works
+The algorithm assigns what is called ‘low-link values’ to all nodes(vertices) in a graph. When the algorithm is done all vertices of a strong component will belong to a strong component. Also the assignment of low-link values to a node if done during the DFS to get that optimised O(V+E) linear complexity.
+These are the main steps in Tarjan’s Algorithm:

+
    +
  1. A DFS is run from any node.
  2. +
  3. A stack of valid nodes from which to update low-link values from, is maintained during the DFS. This stack basically has all nodes that are present in the current branch of the DFS.
  4. +
  5. Nodes are added to the stack as they are explored for the first time.
  6. +
  7. Nodes are removed from the stack if any path in the DFS ends in an already visited node say V, in this case elements are popped from the stack till the element that was visited again(V). And all these popped nodes along with V, are put in the same strong component, i.e. , their low link values are made the same as the revisited node.
  8. +
  9. If the DFS hits a visited node but which is not in the stack then nothing is done.
  10. +
+ +

A Pictorial Representation
+Starting the DFS +In the above diagram we start the DFS from the node coloured orange and give it a low-link value of 0.

+ +

DFS +We then proceed with the DFS, until and assign a low-link value of 1 to the neighbour of the root.

+ +

DFS +We continue giving unique low-link ids to new nodes till node 2.

+ +

DFS +We now hit an already visited node(node 0). So we make the low-link value of all these nodes as 0. We then pop this connected component out of the stack. These are a connected component.

+ +

Picking a Node +Next we pick another node(part of the DFS).

+ +

Recursion +We do these steps recursively till we obtain more strong components of the graph.

+ +

The Solution +The graph finally looks like this.

+ +

Analysis
+The time complexity of this algorithm is O(V+E) as all it does is basically run a DFS. +However this asymptotic analysis assumes that looking up a vertex in a stack can be done in constant time. In reality this may not be the case and thus the time complexity would be greater. +The space complexity is linear as it makes use of additional space for the stack.

+ +

Pseudocode
+The pseudocode is provided below.

+ +
 algorithm tarjan is  
+  input: graph G = (V, E) 
+  output: set of strongly connected components (sets of vertices)  
+  index := 0  
+  S := empty stack  
+  for each v in V do  
+    if (v.index is undefined) then  
+      strongconnect(v)  
+    end if  
+  end for  
+  function strongconnect(v)  
+    // Set the depth index for v to the smallest unused index  
+    v.index := index  
+    v.lowlink := index  
+    index := index + 1  
+    S.push(v)  
+    v.onStack := true  
+    // Consider successors of v  
+    for each (v, w) in E do  
+      if (w.index is undefined) then  
+        // Successor w has not yet been visited; recurse on it  
+        strongconnect(w)  
+        v.lowlink  := min(v.lowlink, w.lowlink)  
+      else if (w.onStack) then  
+        // Successor w is in stack S and hence in the current SCC
+        // If w is not on stack, then (v, w) is a cross-edge in the DFS tree and must be ignored
+        // Note: The next line may look odd - but is correct.
+        // It says w.index not w.lowlink; that is deliberate and from the original paper
+        v.lowlink  := min(v.lowlink, w.index)
+      end if
+    end for
+    // If v is a root node, pop the stack and generate an SCC
+    if (v.lowlink = v.index) then
+      start a new strongly connected component
+      repeat
+        w := S.pop()
+        w.onStack := false
+        add w to current strongly connected component
+      while (w != v)
+      output the current strongly connected component
+    end if
+  end function
+
+ +

Epilogue
+The legendary master of algorithms, Donald Knuth described Tarjan’s Algorithm as

+
+

The data structures that he devised for this problem fit together in an amazingly beautiful way, so that the quantities you need to look at while exploring a directed graph are always magically at your fingertips.

+
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/What-is-Machine-Learning/index.html b/blog/What-is-Machine-Learning/index.html new file mode 100644 index 0000000..29b328e --- /dev/null +++ b/blog/What-is-Machine-Learning/index.html @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

What is Machine Learning?

+ +

Machine learning is a school of computer science that focuses on programming machines to improve their performance through data and iteration. The machine can learn without being explicitly programmed. Yes, you read it right. This is called Artificial intelligence, where we feed in data into the machine, and it learns the data and predicts the output for any other input given. Machine learning is broadly classified into

+
    +
  • Supervised Learning + In supervised learning, we have an idea of the relationship between the inputs and the outputs from the dataset given. It is further classified into + - Regression: Output can take continuous values (e.g., If the picture of a vehicle is given and it is asked to predict how old the vehicle is. ) + - Classification: Output is discrete(binary) (e.g., If the age of a person is given and the machine is asked to predict if they have a particular disease.)
  • +
  • +

    Unsupervised Learning + Unsupervised learning is the training of an artificial intelligence (AI) algorithm using information that is neither classified nor labeled. Hence the algorithm acts on the data without any previous guidance.

    +
  • +
  • Reinforced Learning + Unlike the other types, there is no data set given, and the machine is bound to learn from experience (e.g., In a chess game the machine rains itself with all possible moves) +Now we shall move ahead and understand the algorithms used for learning
  • +
+ +

The Learning Algorithms

+ +

Before proceeding with the learning algorithms, we can first have a look at the variables we shall be using. +x(i) -The input +y(i)-The output +(x(i),y1(i))-Training example +h(θ(x(i)) - Hypothesis function using which values can be predicted, and θ(i) are the weights

+
J(θ0,θ1)=(1/2m)*∑(i=1 to m) (y(i)−y1(i))^2 =  (1/2m)*∑(i=1 to m)(hθ(x(i))−y(i))^ 2
+
+

In the given equation, the variable J is called the cost function, which calculates the error and aids in calculating the accuracy of the hypothesis, which is measured. The error term is the difference between the hypothesis and the original output y. The error term is squared and divided by two as while we calculate the gradient descent (a method of reducing the error ), it will be easier for calculation.

+ +

Gradient Descent

+ +

The purpose of finding the cost function is to reduce the error in the hypothesis and improve the accuracy. Gradient Descent is an iterative algorithm used to optimize and find the minimum value for the cost function in this case. +The gradient descent algorithm is as follows:

+
θj:=θj−α(∂/∂θ(j))J(θ0,θ1)
+
+

Here the value of θ the weight is updated so that the slope of the cost function reduces, and it becomes optimized. This concept can be clearly understood with the image shown below.

+ +

Gradient Descent

+ +

This iterative process is continued until J reaches its minimum value. This process can be imagined in 3-D as the two weights θ0 and θ1 as the x and y axes and the function J as the z-axes, then the lowermost point(like the lowermost pint of a basin) can be found using this algorithm.

+ +

Logistic Regression

+ +

Logistic Regression is the appropriate analysis to conduct when there are only two possibilities(binary). Logistic Regression is a predictive analysis. Logistic Regression is used to describe data and to explain the relationship between one binary variable and one or more nominal, ordinal, interval, or ratio-level independent variables. +Take an example where we need to classify whether an email is a spam or not. If we use linear Regression for this problem, there is a need for setting up a threshold around which the classification can be done. Say if the actual email is spam; if the predicted continuous value 0.4, and the threshold value is 0.5, the data point will be classified as not spam. +The hypothesis, instead of being the weighted sum of inputs is the sigmoid function with the input as the weighted sum of inputs. +The sigmoid function also called the logistic function gives an ‘S’ shaped curve that can take any real-valued number and map it into a value between 0 and 1. If the curve goes to positive infinity, y predicted will become 1, and if the curve goes to negative infinity, y predicted will become 0. If the output of the sigmoid function is more than 0.5, we can classify the outcome as 1 or YES, and if it is less than 0.5, we can classify it like 0 or NO. Using the sigmoid function we are squashing the output of the linear function into the range [0,1]. Now the threshold value can be applied and the predction can be done. +SigmoidCurve +The sigmoid function of x is 1/1+(e^(-x)).

+ +

Regularization

+ +

Sometimes when we try to reduce errors a lot, we end up with a function that fits the training data set correctly, but it may not be correct for predicting the output for new data(overfitting). This overfitting happens due to larger weights and more input variables, and by using regularization, it can be avoided. This is a form of Regression that regularizes or shrinks the coefficient estimates towards zero. In other words, this technique discourages learning a more complex or flexible model to avoid the risk of overfitting.In simple terms, if we utilize a curve with higher powers, we can get an equation that fits the training set but might have significant errors during prediction. Hence regularization is used. +There is a regularization parameter(λ) multiplied with the sum of the square of the weights. This λ inflates the weights, and hence while using gradient descent, the curve is smoothened, and overfitting is avoided. Too large a value of λ can also cause problems like underfitting, so an optimum value of λ should be taken. +Regularization

+ +

Neural Networks

+ +

A neural network is a type of machine learning which models itself after the human brain. This type creates an artificial neural network that, via an algorithm, allows the computer to learn by incorporating new data. So far, we were calculating the hypothesis from various inputs directly. However, in neural networks, there are several layers, and the hypothesis output for the previous layer acts as the input for the next layer. It is analogous to the brain and the nerves. The dendrites take in the input and processes it. Then it is passed to the axon, which is, in turn, connected to the dendrites of another neuron. +Neural Network +This is the figurative representation of the neural network. Where layer 1 acts as input, and it is processed by layer two whose output is in turn processed by layer three and is finally given out as the final output. The layers 2 and 3 are called hidden layers. +Usually, you set to buy something, but you end up buying a lot more than planned. This is due to the recommendations on the online websites. +Yes, neural networks do play a role in that. By making use of neural networks and its learnings, the e-commerce giants are creating Artificial Intelligence systems that know you better than yourself. Data is collected from online searches. +Social Media platforms instantly identify which of your friends is in the photo Artificial Intelligence research, discusses the applications of Neural Networks to power their facial recognition software. The image is passed through various levels of the network.

+ +

Image Recognition +To determine which weight is better to modify, a particular process, called “backpropagation” is done.

+ +

Backpropogation

+ +

In neural networks also, the accuracy can be improved. Backpropagation algorithms are a group of methods used to train artificial neural networks following a gradient-based optimization algorithm appropriately. The critical feature of backpropagation is its iterative, recursive, and efficient method for calculating the weights updates to improve the network until it can perform the task for which it is being trained. In machine learning, backpropagation is commonly used by the gradient optimization algorithm to adjust the weight of neurons by calculating the gradient of the loss function. +For the algorithm refer:https://towardsdatascience.com/everything-you-need-to-know-about-neural-networks-and-backpropagation-machine-learning-made-easy-e5285bc2be3a

+ +

The Types of Neural Networks

+ +
    +
  • +

    Feed Forward Neural Network:

    +

    A feedforward neural network is an artificial neural network in which connections between the node are not cyclic. The feedforward neural network was the first and most straightforward type of artificial neural network. In the feedforward network, the information moves in only one direction, forward, from the input layer, through the hidden layers, and to the output nodes.

    +
  • +
  • +

    Multilayer Perceptron:

    +

    A multilayer perceptron has one more hidden layer between the input and output layers. It is used to separate data into classes that cannot be separated by linear methods. This is a type of artificial neural network that has connections from every single node in a layer to each node in the following layer.

    +
  • +
  • +

    Convolution Neural Network(CNN):

    +

    CNN, like all neural networks, are made up of neurons with weights and biases. Each neuron receives inputs, takes a weighted sum over them, passes it through an activation function, and responds with an output. The whole network has a loss function, and all the tips and tricks that are applicable for neural networks still apply on CNNs.

    +
  • +
  • +

    Recurrent Neural Network(RNN):

    +

    A Recurrent Neural Network is a type of ANN(Artificial Neural Network) in which the output from a particular layer is saved and given as feedback to the input. This feedback helps predict the outcome of the layer. + The first layer is formed in the same way as it is in the feedforward network. That is, with the product of the sum of the weights and features. However, in subsequent layers, the recurrent neural network process begins.

    +
  • +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/a-dive-into-git-directory/index.html b/blog/a-dive-into-git-directory/index.html new file mode 100644 index 0000000..0e76e36 --- /dev/null +++ b/blog/a-dive-into-git-directory/index.html @@ -0,0 +1,904 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Git is a distributed version control system. It means Git helps you manage different versions of your work, record the changes and helps different collaborators work parallelly on the same project.

+ +

Imagine that you are working on a big project involving many files and folders in it. You make a series of changes to your project and now finally when you compile it, you see the application is crashing or not working as expected. In such a case, Git is the best tool you could use. If you have recorded all your changes uniformly in Git, you can any time refer to those versions. Alternately, you can create a copy of your work at the beginning itself, and start working over it and if the changes work out correctly, you can try to merge them with your original project.

+ +

This blog mainly covers the following content:

+
    +
  1. Git Core + +
  2. +
  3. Git Branching and Merging + +
  4. +
  5. Git Remotes + +
  6. +
+ +

+ +

Git Core:

+ +

+ +

In a Git repository/folder, we have three three logical areas, namely:

+
    +
  • Working Tree
  • +
  • Staging Area
  • +
  • Commmit History +Three Logical Areas
  • +
+ +

For more clarity on commit, consider taking snapshots of your staged changes.

+ +

Till now, you might be wondering where is all this information getting stored? A Git repository is initialised with an empty .git folder which contains information regarding commits, branches, config and many more. We’ll see a few of these below.

+ +

Let’s play with Git and try to understand its features:

+
+

Note: I will be using command-line Git. I suggest installing any linux system before proceeding and learning basic bash commands. You can refer this for ubuntu installation and this for getting started with basic bash commands.

+
+ +

+ +

Install Git on your system using

+ +

sudo apt-get install git

+ +

Make a new directory git_test and initialize it with Git using

+ +

git init

+ +

It will create .git folder. +Git Init

+ +

Now, we have to configure the user.name and user.email. Whenever we commit our staged changes, Git includes this name, email and time of commit along with it. This is important to check who made these changes and when.

+ +

git config --global user.name <your-name>
+git config --global user.email <your-email>
+To check the configuration, type git config --list. +Git config

+ +

Here, we used --global flag, so this configuration will be reflected to all the Git repositories on your machine. This configuration is stored in your home directory. Type cat ~/.gitconfig to check. +If you use --local flag instead, this configuration will be limited to your current repo. This is stored in .git directory. Type cat .git/config in git_test folder.

+ +

Now, we create a file say file1 and “Hello World!” to it. +Type the following commands and observe:

+ +

git status
+git add file1
+git status +Git add

+ +

When we created file1 and made changes to it, these changes were present only in the Working Tree i.e. they are not staged/tracked.
+git add command staged these changes i.e.added them to the Staging Area for committing them further.
+Now, we commit these changes.
+git commit -m "First line added to file1"
+-m option helps us to add a small message along with the comment. This message should be clear enough so that we can refer to this commit in future if required.
+Now, type git status again and observe. +Git commit

+ +

We can see a seven digit hexadecimal number above (c934395). Whenever we commit our changes, Git hashes these changes to a 40 digit hexadecimal number. The figure above is the first seven digits of 40 digits.

+ +

Now, see the following operations: +Git diff

+ +

Note the output of first git status above and compare with the previous outputs we got.
+git diff helps us to check the differences between working tree and the corresponding staged file. Note that file2 is not staged at this point, so git diff won’t give any output for it.
+If we use git diff --staged, we can get the changes between the staged files and most recent commit files (Try it before using git commit).This will also show the newly staged files not committed before.
+In git add ., . refers to all the new and modified files within the directory.

+ +

To check your commits till now, type
+git log
+Same can be checked in .git/log/HEAD file. +Git log

+ +

Here HEAD nothing but a pointer pointing to the default master branch.
+If we use git log -p, we can see all the changes in each commit compared to its previous commit.

+ +

To give a picture of what happened till now, refer below +Git Current

+ +

Now, say you want to remove a file2 from Git. So how would you do it?
+Approach 1:
+rm file2
+git add .
+Approach 2: git rm file2
+This will not only remove file2 from Working Directory, but also from Staging Area. Type git status and observe output. +Git rm

+ +

Commit these changes. Moving on…

+ +

Say you have made some changes to a file in the working tree and you want to recover the earlier file version, so what is the way out?
+Let’s say a line added to file1. Now this change is untracked in the Staging Area. But we have the previously staged file1 in Staging Area. +So we recover this file1 to our file system using

+ +

git checkout -- file1

+ +

Undo Working Tree

+ +

Now, say we added changes to the Working Tree (in file1) and Staged these changes. We want to recover previously staged file1 (which was committed). +How will we achieve it? +Undo Staging Area

+ +
+

Tip: Try to think in terms of the logical areas of Git and understand the flow of the commands in the above picture.

+
+ +

How to restore changes from a previous commit?

+ +

In the context of our example, we will try to recover the file2. Type
+git log -- file2
+This shows a list of commit that affect file2. +Recovering from commit

+ +

git checkout <first_five_hash_num> -- file2 can be used to restore changes of file2 from that commit (In this case, restoring the file itself).
+git status indicates that it changes the Working Tree as well Staging Area. Later we just commit these changes.

+ +

Sometimes we don’t want Git to pay attention to a few files or folders. It means we don’t want to check the changes made to these files. +For achieving this, Git has .gitignore file as a way out. +We create some files with .ab extension, say file1.ab, file2.ab and file3.ab. Also, we create a folder say trash which includes some expired or not required stuff. +We don’t want to track either of them. So we implement the following
+vi .gitignore
+In the vi editor, append these lines
+*.ab
+trash/

+
+

Try running git status before and after adding the above lines in .gitignore and observe the output.

+
+ +
+

Task: We know that .git directory is the main directory recording all Git related information. Now make a new directory and copy your .git directory from git_test to this new folder and try to retrieve that data in this directory.

+
+ +

+ +

Git Branching and Merging:

+ +

+ +

Branching in Git enables developers to work on multiple versions of their work and merge the stable version with the master branch.
+Master branch is the the default branch created by Git.

+ +

A branch is nothing but a pointer to a commit. Using different pointers (i.e. branches) leads to different commits. We will take an example and try to visualize it.

+ +

To visualise your Commit History graphically, we’ll use
+git log --graph --online --all

+
+

Check the flags used above, using git log --help.
+Also, if possible create an alias of this command. Here is a reference for it. I will create graph as my alias.

+
+ +

We create a new directory name git_test and initialise it as Git Repo. Further we create two files file1, and file2 and edit them.
+Look at the below picture and observe. +Git branching example

+ +

Once the files are staged before, later staging their changes and committing can be performed in a single line using
+git commit -a -m <message>
+After the second commit on master branch, we can see that master is pointing to the commit 981b7c7. It points to the latest commit till now.
+git checkout -b branch1 creates a branch with name as branch1, and the current branch is switched to branch1 and we can see that it points to the same commit.

+ +

Also, we see that HEAD is pointing to branch1. HEAD indicates the current branch on which we are working.

+ +

git checkout <branch_name> helps to switch to that branch.

+
+

Try to understand the flow of commands and relate it with it’s graph in the above picture.

+
+ +

We can also create a branch using git branch <branch_name>, but it won’t automatically switch it to that branch. You will have to do git checkout <branch_name>

+ +

If you type git branch, you can see all the branches and the branch where HEAD is pointing. +Git branch

+ +
+

Task: Switch to different branches and edit diferent files. You will see that changes in one branch do not affect the changes in other. Think how it may be useful?

+
+ +

+ +

What happens when we try to switch to another branch without committing to its changes in the current branch?
+Look at the picture below +Git stash application

+ +

Git suggests you a way out. It tells you either commit your changes or Stash them. The latter one is used when you don’t want commit your changes but quickly change to a different branch temporarily.

+ +

Git stash application

+ +

git stash can be used to stash our changes.
+git stash save <message> can be used to save stash with a message.
+git stash list shows a list of stashes. -p option helps to check the changes.
+git stash apply applies the recent stash.
+git stash apply stash@{2} helps us to apply any particular stash (In this case stash@{2}).
+git stash pop pops the recent stash and also applies it.

+ +
+

Task:

+
+
    +
  1. Try to search where are the stashes stored in .git folder.
  2. +
  3. Try to search where are the details regarding branch commits and head pointer stored.
  4. +
+
+
+ +

+ +

Moving on to Merging branches...

+ +

Now, say you have created a branch, made changes to it, and finally you want to add all these changes to your master branch copy. +Here it is required to merge two or more branches.

+ +

There are two types of merging techniques:

+
    +
  1. Fast-Forward
  2. +
  3. 3-Way
  4. +
+ +

We continue with our above situation. Look at the picture given below: +Git merge1

+ +

We created a new file3 in branch2 and committed the changes.
+From the final graph, we observe that there is a direct path between master and branch2. But there is no direct path between master and branch1 (We will have to pass through their first common ancestor i.e.981b7c7 to create a path between them).

+ +

Say we want to merge branch2 and master. Since there is a direct path, we perform the Fast-Forward Merge. +Merging master with branch2 is equivalent to moving master branch to branch2. Check the diagram below. +Fast-Forward Merge

+ +

First the checkout master branch anad later perform
+git merge branch2
+This updated master branch to branch2 changes.
+Note: The direct path can be however long as possible. Fast-Forward Merge will take place as long as there is a direct path.

+ +

Now we can delete the branch2 branch as it is no longer required. +Branch Deletion

+ +

git branch --merged can be used to check branches merged with the current branch.
+git branch -d branch2 can be used delete the merged branches.

+ +

When we try to delete a non-merged branch -d gives an error and blocks it. But if you use -D instead, any non-merged branch can be deleted.

+ +

Now, we have the following configuration and we want to merge master and branch1. How will we do it? +Current Config

+ +

Fast-Forward merge cannot be performed as there is no direct path.
+Here we have to perform the 3-Way Merge. Look at the picture below to understand it. +3-Way Merge

+ +

This technique checks the changes in the commits pointed by master and branch1 with their LCA and reflect the changes in the newly merged commit (pointed by both the branches). +3-Way Merge Performed

+ +

git merge branch1 will open the dafault editor in your system for editing the message. Edit the message or keep it as it is and exit.
+The master branch will point to this new commit.

+ +

+ +

Till now, whatever merges we performed, we didn’t encounter any Merge Conflicts.

+ +

Merge Conflicts occur when we try to merge two branches that have changed the same lines in the same file with respect to the LCA. +Merge Conflict

+ +

Initially, there is no fourth line or empty fourth line (in LCA). Later both master and branch have different fourth lines. This puts Git into a conflict which line to choose.
+If one of branch’s line had matched the line of LCA, the merged commit would have had the branch’s line (Changed line has higher priority).

+ +

See the file1 contents. +file1 contents

+ +

======= indicates that both changed lines have same priority.
+Also HEAD and branch show the lines in their respective branches (HEAD points master).

+ +

Observe the below picture +Resolve Merge Conflict

+ +

git status gives us that merging process has not stopped yet and the conflict exists.
+There are two methods to resolve it:

+
    +
  1. Either abort the merging process by
    +git merge --abort
  2. +
  3. Or open the file and manually select the lines you want finally in file1. Later stage and commit your changes.
    +Later we remove branch.
  4. +
+ +

+ +

Finally, we move on to our last topic under the heading i.e. DETACHED HEAD.

+ +

Normally, HEAD points to a branch which in turn points to a commit. If we use git checkout with a commit, the HEAD goes into detached state. +Detached head state

+ +

There are two ways to get out of it:

+
    +
  1. Checkout a branch in your Git repo.
  2. +
  3. Create a new branch. It will automatically point to this commit(Detached Head Commit). Now checkout this branch.
  4. +
+ +

+ +

Git Remotes:

+ +

Remote in Git is nothing but a repository in another location w.r.t your current location. This another location can be GitHub repo, fork of GitHub repo, a repo on your machine itself or a repo on any other Git Server.

+ +

+ +

GitHub is like a cloud where projects can be hosted. Different people can collaborate on a single project hosted on GitHub. It equipped with Git utilities.

+ +

Note: GitHub is a Git Server. Similarly, there are many such servers available to share your code. In fact, you can also establish your own local Git Server. Here is a link for it. +
This blog won’t be covering usage of GitHub. So use this link for GitHub reference.

+ +

+ +

Now, make a repository on your GitHub account (say git_test). If you initialize this repo with README.md, GitHub will automatically create a first commit which includes this file. Now we want to work on this file on our local system. So how do we make a copy of it on our machine?

+ +

We use git clone command followed by the ssh or https link provided by GitHub. For using ssh protocol, use will have to set the public key in GitHub. Use the above GitHub reference for it. This blog will be using https protocol. +Git clone

+ +

If your Git configuration is not set globally, set your configuration (either locally or globally as you wish).

+ +

Check the following picture: +Git remote

+ +

Note: graph is an alias of git log --graph --oneline --all.

+ +

git remote shows that one remote named origin is set up. It is the default name created by Git.
+git remote -v shows that push and fetch links for origin. We will understand these in a while.
+Git graph shows the local master branch. HEAD pointing it indicates that master branch is checked out. Here, we see two new branches origin/master and origin/HEAD.
+origin/master branch shows where the remote origin’s master branch is currently. +Similar is origin/HEAD by the above analogy.
+When we try to check out these branches, we end up in Detached HEAD state. Here HEAD is on the same commit as origin/master (w.r.t above picture). Here we can check the master branch of origin.

+ +

How to update your local repo with the changes done on the remote repo?
+To do this, open the git_test repo on GitHub and add a line to README.md and commit your changes. +Now come back to your terminal. +Git pull

+ +

We see that origin/master is still on the same commit on our local system and not in sync with the remote repo. To update it as remote repo, we use
+git fetch +Now, we can see origin/master updated. +git merge origin/master helps us to merge our locally checked out master with the master of origin.

+ +

These two functions of updating origin/master and merging can be performed by following single command
+git pull

+ +

Now, we’ll see how to reflect the local changes in the remote repo? +To show this, we create file1, edit it and commit it finally. See the picture below +Git push

+ +

graph and git status both show that master is ahead of origin/master by 1 commit.
+git push will push the local changes to the remote repo. Here, you will see that user authentication is required. This checks whether the person is authorised to make changes to the remote repo.
+Go to your GitHub account and check that the implemented changes.

+ +

Note: These fetch and push commands use the links we saw in git remote -v.

+ +

Note: Here we have only one remote set in our local repo, i.e. origin. Thus, we didn’t mention the remote and the branch explicitly. Generally, we run the following type of commands
+git fetch <remote> <branch>
+(E.g., git fetch origin master in our case)
+git pull <remote> <branch>
+git push <remote> <branch>

+ +

+ +

Now, let’s move on to setting more remotes.
+Why would it be required to set more than one remotes?
+Say you want to contribute to a project or maybe provide come changes for a project hosted on GitHub and you don’t have the edit access. How would you do it?

+ +

Generally, for such kind of activity, we copy this file to our GitHub account. This process is called making a fork. Later, we clone this forked repo in our local system. +So, now we have one original repo, a forked repo on our GitHub account and a cloned repo of our fork. +By default, origin will be created for this forked repo in our local repo. But if we want to check the changes implemented at the original repo (from which we forked), we add this as our another remote (generally named as upstream). +For contributing to the project, we create another branch on our local repo, implement the changes and push them to our forked version. Later we create a Pull Request on GitHub. +A Pull Request sends the owner of the file a request of verifying the changes and merging them with their master branch.

+ +

Later, if that owner merges our branch with the master, we delete the branch we created on our local system and pull the changes from upstream/master and continue our work.

+ +

See below picture for adding upstream. +Git upstream

+ +

I have created a dummy account named dummydemo and created a repo called RemoteRepo. We will this repo as original repo and fork it to our account and later clone it to our pc. +We see origin as our own account fork. We add upstream to check the changes at dummydemo/RemoteRepo using
+git remote add <remote-name> <remote-link>
+Git graph shows that still, it’s branches are not updated. So we use
+git fetch upstream
+and merge it with our local master.

+ +

To remove a remote, we can use
+git remote remove <remote-name>

+ +
+

Task: Create a new branch on our local RemoteRepo, make some changes and push this branch to origin (pushing to upstream might not be possible as we might not have the edit access). Now, make a Pull Request to +dummydemo/RemoteRepo on GitHub. dummydemo can verify your changes and merge these to the master branch.

+
+ +

Resources:

+ +
    +
  1. https://git-scm.com/book/en/v2
  2. +
  3. https://github.com/PointCloudLibrary/pcl/wiki/A-step-by-step-guide-on-preparing-and-submitting-a-pull-request
  4. +
  5. https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase
  6. +
  7. https://www.atlassian.com/git/tutorials/rewriting-history
  8. +
  9. https://www.perforce.com/blog/vcs/how-use-git-hooks
  10. +
  11. https://spin.atomicobject.com/2016/06/26/parallelize-development-git-worktrees/
  12. +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/a-future-called-quantum/index.html b/blog/a-future-called-quantum/index.html new file mode 100644 index 0000000..1ae8fa0 --- /dev/null +++ b/blog/a-future-called-quantum/index.html @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Introduction

+ +
+

Life is not just made of a good(1) or a bad(0) experience it is a superposition of such experiences. $\qquad \qquad \qquad \quad \quad$ –Manav

+
+ +

Then why do we only think and hear of binary when it comes to information transfer in computers? Presenting to you a new field, called Quantum Computing which works on the superposition of two bits you constantly hear about the 0 and the 1 to give a qubit.

+ +

In this realm we believe that the information is stored in |$\varphi$> a ($\alpha$|0>+$\beta$|1>) state wherein $\alpha ,\beta$ are the respective coefficients of |0> and |1> ( |0> is the matrix $\begin{bmatrix}1\\0 \end{bmatrix}$ and |1> is the matrix $\begin{bmatrix}0\\1 \end{bmatrix}$).

+ +

Like the common binary gates which exist, drawing parallel in this field we have the Quantum Gates.

+ +

i) Quantum NOT Gate(X):

+ +

NOT |0> = |1>

+ +

NOT |1> = |0>

+ +

Therefore X is basically the matrix: $\begin{bmatrix}0 & 1\\1 & 0\end{bmatrix}$

+ +

ii) The Hadamard Gate(H):

+ +

H |0> =$\quad\frac{\vert0>+\vert1>}{\sqrt 2}$

+ +

H |1> =$\quad\frac{\vert0>-\vert1>}{\sqrt 2}$

+ +

Therefore H is basically the matrix: $\frac{1}{\sqrt 2}\begin{bmatrix}1 & 1\\1 & -1\end{bmatrix}$

+ +

iii) Controlled NOT Gate(CNOT): + CNOT +This gate is such that the implementation of the NOT is controlled by a control qubit( Filled Dot) while the unfilled dot is the target qubit. If the control qubit is set to 1, as in the states of |10> and |11>, then it flips (i.e. NOTs) the target qubit or else it does nothing. +Therefore:

+ +

CNOT |00>=|00>

+ +

CNOT |01>=|01>

+ +

CNOT |10>=|11>

+ +

CNOT |11>=|10>

+ +

From these basic quantum gates, the various AND, OR or XOR gates can be implemented.

+ +

Measuring a Qubit : If I give you a qubit without telling you $\alpha$ and $\beta$ is there a way for you to figure it out? Well the answer is NO ! +The amplitudes are thought as hidden information. So information extraction works by measurement in the computational basis. Suppose a qubit is in the state $\alpha\;$|0>+$\beta\;$|1>, when you measure this qubit in the computational basis it gives you a classical bit of information(0 or 1): it gives you the outcome |0> with probability $\alpha^2$ and the outcome |1> with probability $\beta^2$.

+ +

Now why is this field INTERESTING and what are its PROSPECTS?

+ +

Quantum Networking

+ +

Qubits are being used for creating secrets keys using random strings of 0s and 1s which can be used to encode classical information, this application being called quantum key distribution (QKD). +QKD involves one party, say Alice, sending qubits to Bob, who measures the qubits. Only for certain types of measurements will Bob get the same value that Alice encoded in the qubits. Alice and Bob can compare notes over a public channel to figure out what those measurements are, without actually sharing the qubit values. Using those private values they can create a secret shared key to encrypt classical messages. If an intruder were to intercept the qubits, Alice and Bob could detect the intrusion, discard the qubits and start over until no one is tapping their quantum channel. +Meme +Theoretically more is expected than QKD however qubits encoded using a photon’s polarization large amounts of quantum information is problematic. Photons get absorbed or scattered. Fortunately, there is a more robust way to exchange quantum information—via another property of quantum systems, called entanglement.

+ +

When two particles or quantum systems interact, they can get entangled. Once entangled, both systems are described by a single quantum state, so measuring the state of one system instantly influences the state of the other. Imagine two network nodes, Alice and Bob, each made of some isolated bit of matter. Such “matter nodes” can become entangled with each other via a process that involves the exchange of entangled photons. Using entangled matter nodes, Alice can exploit her share of the entanglement to send an entire qubit to Bob, without actually transmitting a physical qubit, making the transfer foolproof and secure.

+ +

Quantum Cryptography

+ +

In this future basically the one thing cryptography relies on that is the lack of computation power of classical computers is not true anymore. Hence longer keys are the first line of defense against quantum encryption. Longer keys will make encryption slower and more costly, however the key length will have to increase substantially to stay ahead. Another option is to use symmetric encryption for the messages themselves, then use asymmetric encryption just for the keys.

+ +

Quantum Machine Learning

+ +

Now why is this arena brimming with excitement?

+ +

AI systems are given large amounts of data to analyse and classify. Quantum computers will give the edge in accessing more computationally complex feature sp1aces. They would also perform feature scaling on complex data structures. +Right now qubits struggle to remain in a quantum state for more than a few hundred microseconds even in a highly controlled laboratory environment however need to remain longer for calculations. +Recently Google even published a paper on Quantum Neural Networks, highlighting the design of it in a world where such a computer would exist.

+ +

Humans too are currently in that superposition state(|success>) where $\alpha$ of the world is preparing for a post-quantum world while the other $\beta$ is still working in making it a reality!

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/a-step-ahead-in-reverse-engineering/index.html b/blog/a-step-ahead-in-reverse-engineering/index.html new file mode 100644 index 0000000..0b71b66 --- /dev/null +++ b/blog/a-step-ahead-in-reverse-engineering/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Hello to all the computer enthusiasts out there!

+ +

In this article,we will look into a simple C program intended to perform a particular task is MADE to perform a task it was not supposed to perform. +SO,WE WILL BE TRYING TO FOOL THE COMPUTER!

+ +

Pre-requisites :

+
    +
  1. A computer which runs Linux.
  2. +
  3. A curious mind which wants to know how stuff actually works!
  4. +
+ +

We will be using GDB(GNU Debugger) to understand the C program at the assembly level.

+ +

If GDB is not installed in your box,you can type in this command to install it.

+ +
sudo apt-get install gdb   
+
+ +

Here is the source code of the executable we will be dealing with. It is named overflow.c. You will know by the end of this article,Why it was named so.
+Image1

+ +

What does this program do?

+ +

a. In the main function,a printf() function is called to print the string “Before function call” .
+b. The main function simply calls another function “print_string()” .
+c. In the print_string() function , We have an uninitialised character array and WE HAVE ALLOCATED 30 BYTES OF SPACE for it.
+d. In this function,Using gets() function , it asks us to enter a string.
+e. It will simply print the string that we have entered.
+f. After the “print_string” function is executed completely,CONTROL IS TRANSFERED BACK TO THE main function.
+g. At the end,there is another printf () statement which prints “After function call”.

+ +

Think for a moment why the 2 printf() statements are present before and +after the function call.

+ +

Compile the program(normally) using gcc :

+ +
gcc overflow.c -o overflow   
+
+ +

This gives an executable named “overflow”.

+ +

Image2

+ +

It is important to note the second warning(the overflow.c : (.text + 0x39)) +It says “the gets() function is dangerous and should not be used”.

+ +

You would have used gets() before. Have you given a thought of why this warning came up?

+ +

Running the executable with random inputs and observing what happens.

+ +

Image3

+ +

Let us go step by step.

+ +

a. The first 2 times it was executed,These are normal cases because the number of characters were less than 30.
+b. The third time,The string length is greater than 30 but nothing wierd happened.
+c. The last time it was executed,we get this “ stack smashing detected “ and the program is terminated right there. IF YOU NOTICE,The string “After function call” is not printed. This means BEFORE THE CONTROL GOT TRANSFERRED TO THE main function,THE PROGRAM WAS TERMINATED. Why did this happen? One obvious guess is that our string length was way more than 30 bytes. But what exactly happened??
+d. To analyse this,we will have to compile our code in the following manner.

+ +
gcc overflow.c -o overflow -fno-stack-protector -zexecstack -g   
+
+ +

e. One more thing,we will have to give random inputs like above to analyse +the behavior of the executable. So everytime typing “aaaaaaaaaaaaaa….” +100 a’s for example is very cumbersome.WE HAVE A SOLUTION!

+ +

We will use python to solve this problem. +Execute the program in following manner : $ python -c “print ‘a’ * 35” | ./overflow

+ +

Image4

+ +

The 35 can be replaced by any number you want as showed in the above screenshot.

+ +

Analyse the above screenshot

+ +

a. Though the string storage capacity is 30 bytes,in the first case,the program is able to take 35 bytes.
+b. In the third case,something wierd happened. It says “Illegal Instruction” and “After function call” was not printed. So,control didn’t get transferred to the main program.
+c. In the last case,again something wierd happened. It said “segmentation fault” and the program was terminated right away.

+ +

We obviously have to investigate the wierd cases and know if we can do something about it.

+ +

Finally, it is time to fireup your debugger!

+ +
$ gdb -q overflow
+
+ +

Image5

+ +

Follow the instruction in the screenshot.

+ +

a. (gdb)set disassembly-flavor intel : This means there are other flavors also right?Research about them.
+b. (gdb)disass main : This dumped the assembly equivalent of the main function written in C.
+c. (gdb)disass print_string() : This dumped the assembly equivalent of the print_string() function.

+ +

Analysis OF main() :

+ +

a. In the main function,we had 3 main tasks 1.printf() , 2.function call 3.again a printf().
+b. We can easily figure out that tha main<+9> instruction is the printf(“\nBefore function call\n”), and main<+29> is printf(“\nAfter function call\n”);
+c. What does main<+19> do? It says <+19> call 0x40058f < print_string > . From this,it is clear that our “print_string” function is called at <+19> instruction.(Address of this instruction is 0x400579).

+ +

Analysis of print_string() :

+ +

a. push rbp + mov rbp,rsp + sub rsp,0x20

+ +

What this does is,The system is making space(in the stack) to store our 30 bytes(string) . +b. print_string<+20> ,the gets() is called.(important!)
+c. print_string<+32> ,the puts() is called.

+ +

After the execution of print_string(), How does the computer know that control should return ed back to main() again? Notice that there is something called “ret” in print_string<+39> .

+ +

(NOTE : The 0x0000000000400566 is the starting point of main() IN MY COMPUTER. IT MIGHT BE DIFFERENT IN DIFFERENT COMPUTERS).

+ +

Note our observation points and then run the program.

+ +

a. Let us stop before print_string() is called.
+b. Let us stop after print_string() is called and then go step by step.

+ +

We can stop using the “break” instruction of gdb.

+ +

Image6

+ +

First,we break at main() and then at print_string() .Now we run the program.$(gdb)run

+ +

c. (gdb)ni-> means next instruction.Using “ni”,we can analyse each instruction as we go. +AT 0X400579,print_string() is present.This is important.

+ +

Finally,we have stopped at gets(a).This instruction is not yet executed.

+ +

Image6

+ +

In the above screenshot, +d. (gdb) x/32xw $rsp shows us the memory space (the space in stack) that system has allocated to store the string we input. There is something that is highlighted in the screenshot. Can you guess what this could be??

+ +

e. 0x0040057e -> Address of the instruction after “call print_string() “ in the main() function . [Go back to the assembly code of main() and check] . This means,when print_string() function is called, THIS “0X0040057e” or THE RETURN ADDRESS is stored.

+ +

Image7

+ +

f. After a few “ni”s,gets(a) is executed and we input our string. +Then again,check the stack by using $(gdb) x/32xw $rsp . (refer the above screenshot).

+ +

g. We will run it again with nore ‘a’s and see what happens.

+ +

The space where return address or 0x0040057e is supposed to be present has now become 0x00400061. 0x61 is the ascii equivalent of ‘a’.So, Our string this time tried to overwrite the return address.

+ +

The computer now thinks that the return address is 0x00400061 ,but that is an invalid address (Or an address which is not used in this particular program).

+ +

Check out the screenshot below .

+ +

Image8

+ +

Let us see and check what happens . After a few “ni”s,The string is printed and then “Segmentation fault“Remember we had got the same error in the very beginning . (before we started analysing with gdb) .

+ +

Now we know why the error occurred. The address “0x00400061” was not accessible(or not a valid address) and that’s why we got an error. The control was NOT transferred back to main() .

+ +

Think about it once,What if we overwrite the actual return address by a new VALID address where the new address has instructions that WE want to execute?

+ +

THIS WAY,WE CAN EXECUTE WHICHEVER INSTRUCTIONS WE WANT.The statement we had at the beginning (trying to fool the computer) is slowly coming to our light right?

+ +

h. Ok,now that we know the trick,we can give any valid address and the instruction in that address will be executed.

+ +

What if we give the address of “print_string()”, will it be executed twice,Will it print the inputed string twice? . Let us see..

+ +

Let us note that the address of the instruction which calls print_string() is at 0x0000000000400579 .

+ +

Image9

+ +

Instead of using python,we will use another useful tool,the printf .

+ +
printf "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x00\x79\x05\x40"|./overflow
+
+

There are 39 a’s and the address which calls print_string() in the reverse order.(WHY IS THAT??)

+ +

AND WE HAVE ACHIEVED IT!!The print_string() function was executed twice silently(with no wierdness) and control was returned back to main() again silently.

+ +

(Note:The number of a’s that I have put to reach the space where return address is stored may or may not be same as the number of a’s you might have to put to reach it. AND AGAIN,Our addresses need not be same.)

+ +

So,analyse the assembly code properly,make a note of all the important addresses and then proceed.

+ +

There are a few things that were left unexplained:

+ +

1. Why the source code was named “overflow.c” :What you have just done is a simple but an authentic example of what is known as “BUFFER OVERFLOW” . The a[30] is the buffer we had to store the string. When the strig length exceeded 30,the string is said to have overflown the buffer.

+ +

2. When compiled normally,we could not have done all the analysis that we did now. The latest compilers keep a check on buffer sizes and protects us from buffer overflows.

+ +

3. Check why we added -fno-stack-protector and -zexecstack while compiling the sourcecode.

+ +

4. Why we typed in the address in the reverse order in the last part?

+ +

And a few more for you to research.

+ +

There was one more thing. Executing instruction that WE wanted. That is definitely possible but is beyond the scope of this article. READ ABOUT THE ACTUAL IMPLICATIONS OF A BUFFER OVERFLOW. It is very interesting!

+ +

I know this is a lot of stuff to know at once.Go through the article several times,understand each and every bit.

+ +

I hoped you enjoyed the article and learnt something new out of it. Any kind of suggestion,feedback or appreciation:P ,leave a comment below.

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/airbus-e-fan/index.html b/blog/airbus-e-fan/index.html new file mode 100644 index 0000000..dc22537 --- /dev/null +++ b/blog/airbus-e-fan/index.html @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

The Airbus E-Fan Project

+ +

For over a hundred years - and certainly many to follow, the aircraft +industry, for the most part, has relied upon combustion based engines, +ranging from the long-forgotten piston-prop through the state of the art +Turbofan. Yet, no matter what the degree of advancement is in the field +of such engines, what’s guaranteed is an ever-increasing toll of CO2 and +other greenhouse gases.

+ +

The intuitive solution for sustainable development, as in nearly all +domains of power generation, especially in transportation, is +electricity. Presently, every mode of transport (save for aviation) +employs at least a certain level of technological know-how of the +utilisation of electrical energy to power any system that would +otherwise use energy from combustion of fossil fuels.

+ +

However, no such concrete technology in the aircraft domain is in +existence yet, due primarily to the commendable figures of power output +and efficiencies of the contemporary combustion engines. But then, +electric engines were never invented with the aim of outperforming the +existing engines (though with the current trends of R&D, such a thought +could be realised), but to rather mimic them without using non-renewable +resources and reducing greenhouse emissions in parallel.

+ +

The E-Fan Programme of Airbus is one such initiative that aims to +accelerate developments towards environment-friendly aviation. The E-Fan +was initially designed specifically to utilise electric power. As a +second step, E-Fan was transformed into an updated ‘Plus’ version with a +hybrid configuration for longer flight endurance. E-Fan Plus – which +debuted during the summer of 2016 – incorporates an internal combustion +engine as a range extender in addition to the aircraft’s on-board +lithium-ion batteries.

+ +

These two propulsion system configurations – and ongoing innovation – +highlight the aircraft’s role as a technology demonstrator that allows +the company to make important advances on its electric aircraft roadmap.

+ +

The E-Thrust concept with Rolls Royce Airbus has strategically partnered +with Rolls-Royce for the E-Thrust concept study. This research is +focused on delivering lower fuel consumption, fewer emissions and less +noise for future aircraft through a hybrid/electrical distributed +propulsion system. Building on E-Fan’s all-electric power system, the +E-Thrust concept features electrically-driven fans distributed in +clusters along the wing span and an advanced gas power unit to provide +electrical power for the fans and for recharging the energy storage +system (potentially high-density batteries) depending on the phase of +flight. Electrical energy management throughout the flight profile For +takeoff and climb, electrical power is generated from both the energy +storage system and gas power unit to provide peak power to the fans. +During cruise, the gas power unit powers the fans and recharges the +energy storage system. In the aircraft’s descent, the gas power unit is +switched off – with no power provided to the fans, and the energy +storage system producing the energy for on-board systems. In a second +phase of descent, the fans will be used as “windmills” to generate +electrical power to re-charge the energy storage system. Finally, for +landing the gas power unit is restarted, offering low levels of power +for propulsion as a safety measure during this phase of flight.

+ + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/aircraft-engines/index.html b/blog/aircraft-engines/index.html new file mode 100644 index 0000000..58207d4 --- /dev/null +++ b/blog/aircraft-engines/index.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Many of you might have flown in an aircraft at least once in your lifetime and even if you haven’t, you might have at least seen one in a picture. You might have noticed that there are different types of aircraft for different purposes.

+ +

Some are small and can accommodate only 5 people while some are huge and can carry more than 600 people, some are used for dropping bombs while some others are used for rescuing people during disasters.

+ +

One of the most essential parts of any of these aircrafts is the engine. The engine provides the thrust required to take the aircraft to the sky. Now, all aircraft cannot have the same type and size of engines.

+ +

The size and type of the engine depend upon various factors, a major one being the uses of the aircraft. Let us now go through some of these different types in detail.

+ +

Reciprocating (Piston) Engines

+ +

Turboprop

+ +

A turboprop consists of an intake, compressor, combustor, turbine, and a propelling nozzle. Air is drawn into the intake and compressed by the compressor. Fuel is then added to the compressed air in the combustor, where the fuel-air mixture is burnt.

+ +

The hot combustion gases expand through the turbine. Some of the power generated by the turbine is used to drive the compressor. The rest is transmitted to the propeller. Further expansion of the gases occurs in the propelling nozzle, where the gases exhaust to atmospheric pressure. The propelling nozzle provides a relatively small proportion of the thrust generated by a turboprop.

+ +

The major portion of the thrust is generated by the propeller. These are used in small aircraft used to transport a few passengers over short distances. The ATR 72-500 uses turboprop engines.

+ +

Turbojet

+ +

A turbojet consists of a gas turbine with a propelling nozzle. The gas turbine has an air inlet, a compressor, a combustion chamber, and a turbine.

+ +

The compressed air from the compressor is heated by the fuel in the combustion chamber and then allowed to expand through the turbine. The turbine exhaust is then expanded in the propelling nozzle where it is accelerated to high speed to provide thrust.

+ +

These are not used anymore as turbofan engines are more efficient than these. The Concorde was a supersonic jet which used turbojet engines.

+ +

Turbofan

+ +

Engines used in modern day airliners are of this type. They consist of a massive fan at the front which draws in the air. Most of this air passes bypasses the turbine and is directly sent to the nozzle to provide thrust.

+ +

Some of the air drawn in by the fan is sent to the compressor which compresses the air after which combustion occurs. The exhaust is used to drive a turbine which powers the fan in the front and the compressors. The exhaust gasses are then sent through a nozzle to provide thrust.

+ +

The ratio of mass flow of air bypassing the engine core to the mass flow of air entering the engine core is called bypass ratio. Modern day airliners use engines with a high bypass ratio as they are more efficient.

+ +

Ramjet

+ +

Ramjets are engines that do not have a moving compressor. They use the forward motion of the engine to push the air through the compressor in the engine. Because of this they require some other form of thrust at lower speeds. Therefore they are not useful in slow moving aircraft.

+ +

The compressor is a geometrical feature of the engine. It has a lower area of cross section than the inlet. Therefore the air passing through that area gets compressed. After compression the fuel is injected and combustion occurs. The exhaust gasses are then directed into a nozzle which allows for expansion into the atmosphere and provides thrust. These are mainly used in missiles. The Brahmos missile jointly developed by India and Russia uses ramjet engines.

+ +

Many more types of engines exist. The ones mentioned here are just to give a basic idea. Continuous research is being done to further improve the efficiency of the modern day engines and to develop new engines which are more efficient. We have come a long way from the early days of air travel when planes could carry very few people and required a lot of fuel. There is still a long way to go to improve the efficiency of engines and make planes lighter.

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/alterego/index.html b/blog/alterego/index.html new file mode 100644 index 0000000..b2885cd --- /dev/null +++ b/blog/alterego/index.html @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

AlterEgo

+ +

We basically can’t live without our cell phones, our digital devices. But at the moment, the use of those devices is very disruptive. Wouldn’t it be rather nice if we could just think of the question and a device could just Google it real quick and give the answer? +Well, we’ve reached the point where robots can now read your mind. Kind of. +Researchers at MIT have developed a wearable gadget that transcribes and responds to conversations users have with themselves in their heads. +Example

+ +

Comprised of a wearable device and a small computing system, AlterEgo enables users to “silently converse” with a computing device without talking or making any recognisable movements. +It uses electrodes to pick up neuromuscular signals in the user’s jaw and face that are triggered by internal verbalisations. +These signals are then sent to a machine-learning system that has been trained to associate certain signals with certain words.

+ +

A pair of bone-conduction headphones included in the device transmits vibrations through the bones of the face to the inner ear. As the headphones don’t obstruct the ear canal, this means the system can pass on information to the user without interrupting a conversation or interfering with the user’s aural experience. +The motivation for this was to build an IA device — an intelligence-augmentation device, a computing platform that’s more internal, that melds human and machine in some ways and that feels like an internal extension of our own cognition. +If the user were to internally question, “what is the time,” the AlterEgo headset would register this, and feed the answer back to them through bone conduction.

+ +

This means the user doesn’t have to look at a screen and type in words to find the answer to their question, or to control a device.

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/amateur-radio/index.html b/blog/amateur-radio/index.html new file mode 100644 index 0000000..8a36d43 --- /dev/null +++ b/blog/amateur-radio/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

image-1

+ +

We are all fascinated by how our voice travels through the atmosphere by electromagnetic waves and reaches its destination. We humans have built transmitters and receivers suitable to our needs.

+ +

What is Amateur Radio and who are these Amateurs?

+ +

Amateur Radio operators are a group of people interested in wireless communication technology worldwide. According to the Indian Wireless Telegraphs (Amateur Service) Rules, 1978, Amateur Radio or HAM radio is ‘A service of self-training, inter-communication and technical investigations carried on by amateurs, that is, by persons duly authorized under these rules interacted in radio technique solely with personal aim without pecuniary interest’. Unlike commercial radio broadcasting, where we tune our radios to receive information, amateur radio is a two-way exchange of information.

+ +

What can you gain from this?

+ +

Despite the availability of other communication facilities amateurs run their own wireless communication network with entirely personal effort. Some operators also build their wireless transceivers from scratch and transmit their voice throughout the world to be then replied to by their fellow operators. This a very special hobby where HAMs operate their wireless transceivers for joy and excitement of carrying out a worldwide wireless communication. They learn important communication engineering concepts by doing. Their conversation covers diverse topics like Astronomy, Literature, Climate Change, Wildlife, STEM fields. Exchange of information on business, commerce, religion, and politics are not allowed.

+ +

So, can anyone broadcast information?

+ +

Amateur radio is one of the few hobbies in the world which requires a government license. You cannot broadcast information on air without a license. It is given by the Wireless Planning and Coordination (WPC) Wing of the Ministry of Communication, New Delhi in India. You have to qualify for a written examination that covers the basics of electronics radio theories and national and international rules and regulations of amateur radio communication in radiotelephony (voice) and Morse Code to obtain the license. The eligibility to appear for examination is 12 years. License is given for 4 grades. Advanced, Grade I License, Grade II License Grade II License (Restricted Grade). Out of these only Restricted Grade license can be obtained without any knowledge of Morse code. While for getting the license for other grades, the candidate must show proficiency in sending and receiving Morse code according to international standards. The speed of transmitting and receiving Morse code should be 5 WPM (Words per Minute) for Grade I license.

+ +

Each Amateur is allotted a separate number known as a call sign. By looking at the call sign other amateurs can say that from which country does a person belong. These are allotted by International Telecommunication Union (ITU). Prefix ‘VU’ is used in call signs of Indian operators.

+ +

Okay, but what is the real-life use apart from all the fun?

+ +

Along with sharing and acquiring knowledge, amateur radio operators have been very helpful in re-establishing destroyed communication during natural calamities. An example: In December 2004, a point in the ocean near Indonesia became an epicenter of a major Earthquake which then resulted in a Tsunami. The effect was seen on the Andaman and Nicobar Islands of India also. Communication to islands was destroyed so it was very difficult to carry out the relief work. In those circumstances, a HAM operator from New Delhi Bharati Prasad, who was on a tour to the islands came forward with her Amateur Radio set and helped establish communication. Like this example, many times Ham operators have been useful.

+ +

References

+ +
    +
  1. Government website for HAM radio
  2. +
  3. Wikipedia
  4. +
  5. Safari Magazine
  6. +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/amazon-go/index.html b/blog/amazon-go/index.html new file mode 100644 index 0000000..c5562f7 --- /dev/null +++ b/blog/amazon-go/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Amazon Go is Amazon’s cashier-less shopping platform. +Contrary to Amazon’s online website, the Go is a brick and mortar store- similar to your regular convenience store. What’s unique about the Go is that you can pick up an item and just walk out of the store without having to wait in line to pay for it. The store sells ordinary grocery items like bread, dairy and packaged ready to eat meals.

+ +

Landing image

+ +

How does it work?

+

A customer has to hold up a QR code on the Amazon Go app onto scanning devices, similar to subway turnstiles. After that they just start shopping as they normally would. +Cameras mounted on the ceiling track each person and what item they pick up or put down and updates that on their cart. When done, he/she just has to walk out of the store and is billed only for the items picked up.

+ +

What’s the technology behind it?

+

Naturally, Amazon is pretty secretive about the technology used. However, what they have revealed is that it’s a combination of Artificial Intelligence, Computer Vision, Deep Learning and data pulled up from multiple sensors that enables this cashier-less experience. +In Amazon’s own words,

+
+

“It’s similar to the same technology you’d find in self driving cars. We’re calling it ‘Just Walk Out’ technology”

+
+ +

What exactly is this technology?

+ +

Artificial Intelligence:

+

AI is pretty much the rage these days and everyone’s heard more than enough about it.

+ +

Computer Vision

+

Computer Vision however, is something that’s a little vague. It deals with teaching computers to make educated guesses based on visual cues like images or video feeds. It aims at automating the human visual system.

+ +

Imaging technology in use +Computer Vision deals with acquiring information from digital images, and then processing them to arrive at a digital output, like numeric or symbolic information in the form of decisions.

+ +

Using the horde of cameras on the ceiling, the software is able to uniquely classify and track each individual. In fact, the software is so good that it was able to uniquely distinguish between an army of customers in Pikachu costumes.

+ +

A view of the cameras +The Cameras

+ +

After that, the program follows each person around virtually and keeps track of what they pick up and put down. The program analyzes which shelves a customer interacts with to determine what item they chose. In order to aid the system, there are weight sensors on the shelves that help the program narrow down on an item.

+ +

The shelved with the items +The Shelves with items

+ +

In addition to this, Amazon also keeps a track of each person’s previous shopping history to zero-in on an item in the event of the program being confused. For example- if the program is unable to determine whether someone picked up a bottle of mustard or ketchup, it simply looks at the person’s previous choices. If the person buys mustard more often than not, then that’s what they’re more likely to have picked up this time as well.

+ +

What are the drawbacks?

+

Like any new software, Amazon Go has its fair share of problems. +Some customers have been able to leave the store without being charged for certain items. +The program also has trouble when there are more than 20 people in the store at once. +It also runs into issues when there is a group of people shopping together- like families. There is the added issue of dealing with grabbers- kids that impulsively pick up items only to have their parents put it back immediately. It is still unknown as to how the system would deal with such issues.

+ +

Furthermore, many people feel vulnerable about their shopping habits being monitored. A lot of people also feel uncomfortable being tracked by cameras while they shop. Another issue is that the technology facilitates impulse buying.

+ +

It is yet to be seen how Amazon will deal with these issues. However, the technology is still impressive and is completely unparalleled. It goes to show just how far Artificial Intelligence and Deep Learning will go on to influence our daily lives and how the future of retail shopping is shaping up.

+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/an-intro-to-the-map-reduce-programming-paradigm/index.html b/blog/an-intro-to-the-map-reduce-programming-paradigm/index.html new file mode 100644 index 0000000..a55c539 --- /dev/null +++ b/blog/an-intro-to-the-map-reduce-programming-paradigm/index.html @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

The following blog is an attempt to explain the map-reduce programming paradigm and some of its practical appliations.

+ +

Introduction:

+ +

Over the past few years, many computer scientists at Google have implemented hundreds of special purpose computations that process large amounts of data, such as crawled documents, web request logs, etc., to compute various kinds of derived data. to compute various kinds of derived data, such as summaries of the number of pages crawled per host, the set of most frequent queries in a given day, etc. However, the input data is large and the computations have to distributed across hundreds of thousands of machines in order to finish in a reasonable amount of time. The problem was that it was very difficult to organize this huge input data and process this data with minimalistic time. +As a reaction to this complexity, Google designed a new abstraction that allows the user to express the simple computations we were trying to perform but hides the messy details of handling this large data. It was realized that most of our computations involved a map operation to each ‘logical’ record in our input in order to compute a set of intermediate key/value pairs, and then applying a reduce operation to all the values that shared the same key, in order to combine the derived data appropriately.

+ +

Programming Model:

+ +

The computation takes a set of input key/value pairs, and produces a set of output key/value pairs. The user of MapReduce library expresses the computation as two functions : map and reduce. +Map written by the user takes an input pair and produces a set of intermediate key/value pairs. The map reduce library groups together all intermediate values associated with the same intermediate key I and passes them to the reduce funciton. +The reduce function also written by the user, accepts an intermediate key I and a set of values for that key. It merges together these values to form a possibly smaller set of values. The intermediate values are supplied to the users reduce function via an iterator.

+ +

Example:

+ +

Consider the problem of counting the number of occurrences of each word in a large collection of documents. The user would write code similar to the following pseudo-code:

+ +

Map function pseudocode:

+
     map(String key, String value):
+       // key: document name
+       // value: document contents
+       for each word w in value:
+         EmitIntermediate(w, "1");
+
+

Reduce function pseudocode:

+
     reduce(String key, Iterator values):
+       // key: a word
+       // values: a list of counts
+           int result = 0;
+       for each v in values:
+           result += ParseInt(v);
+       Emit(AsString(result));
+
+

The map function emits each word plus an associated count of occurences. The reduce function sums together all counts emitted for a particular word. +In addition, the user writes code to fill in a mapreduce specification object with the names of the input and the output files, and optional turing parameters. The user then invokes the MapReduce function, passing it the specification object. The user’s code is linked together with the map-reduce library.

+ +

More Examples:

+ +

Here are a few simple examples of interesting programs that can be easily expressed as map reduce computations.

+ +

Distributed Grep:

+

The map function emits a line if it matches a supplied pattern. The reduce function is an identity function that copies the supplied intermediate data to the output.

+ +

Count of URL access frequency:

+ +

The map function processes logs of web page requests and outputs <URL,1>. The reduce funciton adds together all values for the same URL and emits a <URL, total count> pair.

+ + + +

The map function outputs <target, source> pairs for each link to a target URL found in a page named source. The reduce function concatenates the list of all source URLs associated with a target URL and emits the pair: <target, list(source)>

+ +

To learn more about Map Reduce read the paper published by Google given in the references.

+ +

References:

+ + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/an-intuition-on-how-RNN-and-LSTM-works/index.html b/blog/an-intuition-on-how-RNN-and-LSTM-works/index.html new file mode 100644 index 0000000..955a362 --- /dev/null +++ b/blog/an-intuition-on-how-RNN-and-LSTM-works/index.html @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

An intuition on how Recurrent Neural Networks and LSTM works

+ +

Let us first try to understand how RNNs work and how they are used to solve sequence modeling tasks that require the model to store the information seen before.

+ +

Working of RNN

+ +

At time step 0, RNN takes the input X0, predicts an output h0, and stores the information in the state S0. Now, for the next time step, the RNN takes the current input X1 along with the information from the previous state S0 and predicts the output h1 subsequently storing the information from the previous state and the input in S1. This process continues until time T.

+ +

You can notice that at some time step t, state St carries all the information seen until then.

+ +

unfolded RNN

+ +

Analogy between RNN and a whiteboard

+

Now let us try to draw an analogy between RNN and a whiteboard.

+ +

Let us say we want to do some calculation on a whiteboard, which has limited space. At periodic intervals, we see all the information that we have written on the board until then and then figure out the next step and write some more information on to the board.

+ +

We can notice that after some time, we are bound to overwrite the previous information that we wrote because of the limited space of the board.

+ +

Now at some time step t, we would have written so much that there would be no way for us to know what we had written at timestep t - k and we also wouldn’t be able to find how much error was caused due to whatever we calculated at timestep t - k.

+ +

whiteboard

+ +

We can see how the state St in RNN is similar to a whiteboard with all the information cramped to limited space and how calculating St+1 from St and the input is similar to writing more information on the filled board.

+ +

This gives us intuition about why RNN fails to perform well when there are strong dependencies on information seen long before.

+ +

For example, if we had a sentence,
+Alice lives in France. She is an artist. She likes to cook. She speaks
+and had to predict the next word, we could easily say that it would be French but it would be difficult for the RNN model to remember the word France seen long before and hence fails to predict the correct next word.

+ +

Math behind RNN

+

Let us now see the actual math that goes behind RNN.

+ +

math behind RNN

+ +

At a time step t, State St and output yt is given by, +equations +where U, V and W are the parameter weights, b is the the bias, +Xt is the current input, St-1 is the previous state,c is the bias, St is the current state and sigma is the +sigmoid function of x.

+ +

Solving efficiently on a whiteboard

+

Let us now try to see how we can solve the whiteboard problem to build an intuition about LSTM.

+ +

Let us take a scenario where we have to evaluate the expression,
+equations

+ +

on the whiteboard but the whiteboard has space to accommodate only 2-3 steps.

+ +

Now instead of writing something like, +equations +We could just write, +equations

+ +

Let us call this selective writing where we are writing only specific information instead of writing everything on to the board.

+ +

Now, while reading from the board to make the next step, we only need the information about xy and xz but not yz for the next step. So, we can only read whatever is important for the immediate timesteps and we will call this selective reading.

+ +

After plugging in the values on the board, we get, +equations +We can see that we don’t need the xy or xz values anymore and we can erase them from the board instead of keeping everything on the board like before. We are essentially forgetting specific information that we think is not relevant anymore. We will call this step selective forgetting.

+ +

We saw that by using selective read, write, and forget instead of blindly writing and keeping everything, we can solve the whiteboard problem to an extent.

+ +

Analogy between LSTM and the whiteboard

+

Let us now see how LSTM is similar to this technique.

+ +

LSTM

+ +

While passing the information of the previous state St-1 to the next state, we don’t pass the whole information like RNN, instead, we introduce a gate and specify how much percent of each value should be passed similar to the selective writing on the board.

+ +

After taking in information from the previous state and the current input to calculate the current state, we introduce one gate to specify how much should be read from this state similar to selective reading.

+ +

Finally, instead of keeping all this information in the current state, we introduce one more gate which specifies how much percent of each value should be kept in the state and how much should be discarded similar to the selective forget that we saw above.

+ +

If the same example,
+ Alice lives in France. She is an artist. She likes to cook. She speaks
+ is given to the LSTM model to predict the next word, it would retain the information France seen long before using gates and would be able to predict the next word as French.

+ +

Math behind LSTM

+

We will now see the mathematical equations behind LSTM,

+ +

math behind LSTM +The previous state St-1 is passed through an output gate ot-1 to get the state +ht-1. These are given by, +equations

+ +

An intermediate state is then found from the current input Xt and the previous state ht-1 which is then passed through the input gate it +equations

+ +

The final state St is then found after applying input gate and forget gate ft respectively as, +equations

+ +

Conclusion

+

Thus we intuitively understand the architecture of LSTMs and RNNs and then connect it with the actual mathematical equations that go behind these models. We also get an intuitive understanding of why LSTM has a better architecture, and how it helps them in performing better than RNN, and solve the problems like long-term dependencies in RNN to an extent.

+ +

References

+
    +
  1. Deep Learning NPTEL course
  2. +
  3. LSTM colah’s blog
  4. +
  5. LSTM tutorial
  6. +
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/applications-of-RL/index.html b/blog/applications-of-RL/index.html new file mode 100644 index 0000000..8735998 --- /dev/null +++ b/blog/applications-of-RL/index.html @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+

Have you ever been so lazy that you thought, “it would be great if there wes a robot to get me food from the kitchen”? Or have you ever wondered what it would be like if there were robots to do your daily chores for you? Well, the good news is, it is indeed possible to make such an intelligent robot. But if we are to achieve this, reinforcement learning will play a big part in it. In this blog, we will explore the potential of reinforcement learning and how it can be useful in various fields.

+ +

What is Reinforcement Learning?

+ +

Machine learning can be broadly classified into three paradigms - supervised learning, unsupervised learning, and machine learning. In supervised learning, we are given input and output data using which we derive a function between the input data and output data. This function is then used to make predictions on sets of unseen input data. Supervised learning is used in computer vision, speech recognition, etc. In unsupervised learning, we are not given the output labels in the training data. Instead, the task is centered around finding patterns and trends in the data. Unsupervised learning is instrumental in clustering, targeted advertisements, etc. The third paradigm is what we are most interested in for this blog. Reinforcement learning is concerned with how an agent takes actions in an environment to maximize the total reward. Reinforcement learning(RL) differs from supervised learning in that it does not need labeled input and output pairs, and it does not need suboptimal actions to be corrected by any human influence. RL is similar to unsupervised learning as the agent tries to find patterns in the environment. However, the goal in RL is not just finding patterns, but also finding an optimal policy that maximizes the reward. This makes it different from unsupervised learning. Also unlike most unsupervised learning problems, we are not given any data apriori, instead, we need to generate it by interacting with the environment.

+ +

Typically, we have an agent following a policy/strategy in an environment, using which it takes actions/decisions to improve its cumulative reward over the interaction with the environment. Reinforcement learning tasks are usually modeled as Markov Decision Processes(MDP). This consists of:

+
    +
  • a set of states for the environment and the agent, S
  • +
  • a set of actions for the agent, A
  • +
  • probability of transitions from one state to another based on the current state and the action taken
  • +
  • a reward function to decide the reward that needs to be assigned on a transition from one state to another when a particular action is taken
  • +
+ +

The eventual goal for the agent is to maximize its overall reward. It does this by balancing exploring new states and exploiting already available knowledge.This is popularly known as the exploration-exploitation dilemma.

+ +

Reinforcement learning can be applied to many fields, including game theory, robotics, multi-agent systems, economics, and many more. Let us now explore a few interesting applications of reinforcement learning.

+ +

Applications

+ +

Games

+ +

In all the applications of RL, we have made the most progress with games. This is partially because the rules are predefined, and there is not much room for unexpected activities happening, unlike in real life. Nevertheless, we can take the learnings and concepts from the successes in games and use them as a foundation in other real-life tasks. In 2016, Deep Mind’s AlphaGo defeated the Go world champion Lee Sedol 4-1 in a convincing victory. In the second game of the five-match series, AlphaGo made an unexpected move(Move 37) that had a probability of 1 in 10000 of being made by humans. Most people initially thought that the move was bad. But later, this turned out to be an important factor in swaying the game towards AlphaGo’s. So AlphaGo could find moves that humans generally ignored.This gives us an insight into what reinforcement learning and artificial intelligence can offer us as we improve the technology and algorithms. If we can use reinforcement learning for building tools that can help us in real life, those tools will be able to help us resolve problems and issues in a way that might have never been imagined by humanity. On the other hand, in game 4 of the above mentioned series, the machine made some poor moves and ended up losing the game in a way that made AlphaGo look very silly. This shows that we still have a long way to go in making our systems more robust and error-free. Like AlphaGo, there are other machines like AlphaZero (for chess, shogi, and go) and AlphaStar (for the strategy-based video game StarCraft II). Both these machines use deep reinforcement learning techniques and have achieved success to a high degree. It is also worth mentioning Agent57, the deep reinforcement learning agent that plays the Atari57 suite of games. Agent57 has successfully outperformed the human atari benchmark.

+ +

Robotics

+ +

Robotics is a more exciting field than games because, unlike gaming, it applies a lot to the real world and the challenges faced in robotics are harder to solve. In principle, RL can enable real-world robots to acquire large repertoires of skills. More importantly, reinforcement learning can allow such systems to continuously improve the proficiency of their skills from experience without much human intervention. Agents trained using reinforcement learning have the potential to adapt to unstructured and very complex environments. This is because, in a real-world scenario, the agent might not know how the environment is going to be, and hence, it has no data. The agent must be able to collect data on its own and then learn to behave accordingly. In such cases, it is not possible to use supervised and unsupervised algorithms as they usually work well when there is enough data available. Reinforcement learning allows the agent to learn to behave in situations accordingly based on its experience.

+ +

RL today has mostly been used for simplistic and less cost consuming tasks. This is important to note because trying to apply RL directly to high level tasks might result in extreme damages either in financial terms or for humans. Hence, it is important to master the little things first before moving to more ambitious ideas. Kormushev et al demonstrates a robot that learns archery using reinforcement learning algorithms. Kormushev et al also uses the state-of-the-art EM based PoWER algorithm for learning the pancake flipping task. It is very likely that reinforcement learning will become a very important tool in improving robotic systems because algorithms are always ever improving. This video offers a small insight into the work and experiments being conducted on robotic reinforcement learning in UC Berkeley.

+ +

A popular and commonly used approach for robot learning is simulation to real-world transfer. In this, an agent is first trained in a simulated environment and then let out into the real world after learning appropriate behaviors. However, the policies trained entirely in simulation may fail to generalize on a robot in the real world. It is hard to simulate the real-world exactly in a simulation because there is always a degree of unpredictability in the real-world which may not be modeled in the simulation. Physical factors like friction, air resistance, humidity, etc are hard to simulate. Even though these can be simulated in good simulators, in real-world, these factors are dynamic which makes training much harder. This gap in an impressive performance in simulation and poor performance in the real world is known as reality gap. Training robots with reinforcement learning directly in the real world eliminates these problems. However, this method comes with its own set of challenges.

+ +

Challenges associated with real-world robotic reinforcement learning are:

+
    +
  • As mentioned earlier, an RL task is usually modeled as an MDP. In such a task, all the states are reset after an episode, and the agent is allowed to attempt the same task again. In a real-world environment, such a reset is not possible.
  • +
  • The states are not directly available in a form suitable for applying in an MDP. The agent usually has cameras, motion sensors, etc. The data obtained from it must be converted to a state ideal for MDPs.
  • +
  • Typically, rewards are expressed as a function of states or are given by an external supervisor. However, it is more effective if the agent can infer rewards from its sensory inputs.
  • +
+ +

Solving these challenges is essential to have scalable, efficient, and practical robotic systems.

+ +

So how do we build systems for real-world robotic RL? We need three things:

+ +
    +
  • Reset free learning: Essentially, this means the agent should be able to learn the optimal policy without needing to reset all the states after each episode. This can be done by learning a ‘perturbation controller’ which changes the agent’s state so that it is never stuck in a particular state for too long, which can happen in some cases, including when it reaches the goal. Also, once the task is completed, the agent is then transferred to a state that has been less explored.
  • +
  • Unsupervised learning for state estimation: Findings and observations taken from the cameras and other sensors are often hard to use in reinforcement learning and slow the entire process. The algorithms would require data in numerical terms such as coordinates of the agent but this is not easy to extract from cameras and other sensors due to the fact that these are usually higher dimensional. In order to resolve this issue, we use unsupervised learning techniques to condense images into only the necessary features. This can then be fed into the reinforcement learning algorithm for learning the optimal behavior.
  • +
  • Classifier-based rewards: To minimize external influence in the learning process, we need to have a system that assigns rewards to itself based on a human’s desired outcome. Once these outcomes are given, the agent can self assign rewards based on the probabilities of the agent reaching its goal state from the current state.
  • +
+ +

Once these three ingredients are put together, we can have a robotic system that works well without human interference. This system can learn to perform several tasks without instrumentation. Although these systems are currently able to perform limited and simplistic tasks, it is important to note that the concepts laid above are essential to building any robotic systems of any desired complexity.

+ +

Multi-Agent Systems

+ +

Until now, what we saw was restricted to single-agent systems. We had only one agent in the environment, and its goal was to maximize its own reward and find the best policy. If we can succeed in creating intelligent robotic systems using reinforcement learning, it is very likely that we will also be inclined towards creating a system where there are multiple robots focussed on one task or various tasks. This is where the concept of multi-agent systems comes in. Multi-agent systems consist of multiple autonomous entities (artificial agents or humans or both) with computational abilities interacting in an environment with distributed/decentralized information with similar, conflicting, or mixed interests. Typically, these agents refer to software agents. When it comes to reinforcement learning, we attempt to make the agents intelligent and study how agents can collectively learn, collaborate, and interact with each other in an environment. RL in multi-agent systems is also known as Multi-Agent Reinforcement Learning (MARL). MARL is a domain that has existed for many years. But the progress that has been made in deep RL (via powerful and scalable function approximators like neural networks) has catalyzed work and progress in this field.

+ +

MARL has a lot of potential for real-world applications. One area of application is resource allocation and task allocation. MARL can help in devising optimal strategies to divide available resources among different agents/processes. This could potentially offer a new insight into optimally utilizing computing resources. Another application is for traffic signal control. AI-based approaches have been investigated in order to optimize traffic flow in junctions. MARL offers a solution to minimize traffic delays using efficient strategies to allocate time for each lane of an intersection in a traffic network. MARL has also seen improvement in games like Dota, Starcraft, Go, etc. MARL could also be applied for the task of energy sharing optimization. Youngwoon Lee et al applied MARL to robotics to assemble IKEA furniture but this direction is currently beyond our scope.

+ +

These applications show not only the power that MARL possesses but also the diverse nature of problems that it can be applied to. However, MARL comes with its own set of challenges and hurdles.

+ +

Challenges with MARL:

+
    +
  • In single-agent RL, the environment reacts (via observations and rewards) in response to just a single agent’s actions. However, when there are multiple agents, it depends on the actions of all the agents. This introduces a notion of non-stationarity where if an agent just myopically optimizes its own objective function without taking into account the behavior of the other agents, it generally fails. This is one of the core problems with RL in multi-agent systems and is difficult to tackle.
  • +
  • In order to resolve the above issue of non-stationarity, it is possible to have a single policy that can give the actions for all the agents. That way, we can keep the policy of an agent stationary. But in this case, the number of state-action pairs increases exponentially, and hence the algorithm slows down drastically. Also, one of the key aspects of multi-agent systems is that the agents should be able to take actions via decentralized information available to them in the form of their local observations. This gets violated if we have a single global policy that takes actions for all agents.
  • +
+ +

In recent years, there have been a few positive results towards solving the above mentioned issues. For example, Thanh Thi Nguyen et al have offered solutions to the non-stationarity problem using Lenient Deep Q-Network or LDQN.

+ +

What Next for Reinforcement Learning?

+

In this blog, we have seen the applications of reinforcement learning in just three areas. However, reinforcement learning can be applied to a lot more fields, including stocks and finance, medicine, and others. When compared to the other paradigms of machine learning, we can say that reinforcement learning is still in its early stages, and that leaves it with a lot of opportunities that can be explored by scientists and researchers. We have seen in history that given enough time, any problem in science can be overcome if there is enough research going into it. It is no different with RL. We will continue to see a lot of progress in this field, and a future where robots are a part of our everyday lives is waiting for us.

+ +

References

+ + + +
+
+
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ + +
+
+ + + + \ No newline at end of file diff --git a/blog/assets/css/animate.css b/blog/assets/css/animate.css new file mode 100644 index 0000000..aa4ee37 --- /dev/null +++ b/blog/assets/css/animate.css @@ -0,0 +1,3367 @@ +@charset "UTF-8"; + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2015 Daniel Eden +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.animated-fast { + -webkit-animation-duration: .5s; + animation-duration: .5s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +.animated.flipOutX, +.animated.flipOutY { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + -ms-transform: scale(0.95); + -webkit-transform: scale(0.95); + transform: scale(0.95); + } + + to { + opacity: 1; + -ms-transform: scale(1.0); + -webkit-transform: scale(1.0); + transform: scale(1.0); + } +} + +@keyframes fadeIn { + from { + opacity: 0; + -ms-transform: scale(0.95); + -webkit-transform: scale(0.95); + transform: scale(0.95); + } + + to { + opacity: 1; + -ms-transform: scale(1.0); + -webkit-transform: scale(1.0); + transform: scale(1.0); + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + /*-webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0);*/ + -webkit-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + /*-webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0);*/ + -webkit-transform: translate3d(0, -50px, 0); + transform: translate3d(0, -50px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + /*-webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0);*/ + -webkit-transform: translate3d(-50px, 0, 0); + transform: translate3d(-50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + /*-webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0);*/ + -webkit-transform: translate3d(-50px, 0, 0); + transform: translate3d(-50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + /*-webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0);*/ + -webkit-transform: translate3d(50px, 0, 0); + transform: translate3d(50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + /*-webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0);*/ + -webkit-transform: translate3d(50px, 0, 0); + transform: translate3d(50px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + visibility: hidden; + /*-webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0);*/ + -webkit-transform: translate3d(0, 40px, 0); + transform: translate3d(0, 40px, 0); + } + + to { + opacity: 1; + /*visibility: visible;*/ + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + visibility: hidden; + /*-webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0);*/ + -webkit-transform: translate3d(0, 40px, 0); + transform: translate3d(0, 40px, 0); + } + + to { + visibility: visible; + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpMenu { + from { + opacity: 0; + visibility: hidden; + /*-webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0);*/ + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 1; + visibility: visible; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpMenu { + from { + opacity: 0; + visibility: hidden; + /*-webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0);*/ + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + visibility: visible; + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpMenu { + -webkit-animation-name: fadeInUpMenu; + animation-name: fadeInUpMenu; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 40px, 0); + transform: translate3d(0, 40px, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 40px, 0); + transform: translate3d(0, 40px, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} + +@keyframes growDown { + 0% { + opacity: 0; + transform: scaleY(0) + } + 100% { + opacity: 1; + transform: scaleY(1) + } +} + +.dropdown-menu { + animation: growDown 200ms ease-in-out forwards; + transform-origin: top center; +} \ No newline at end of file diff --git a/blog/assets/css/blog.css b/blog/assets/css/blog.css new file mode 100644 index 0000000..fab5cac --- /dev/null +++ b/blog/assets/css/blog.css @@ -0,0 +1,709 @@ + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v10/DXI1ORHCpsQm3Vp6mXoaTRampu5_7CjHW5spxoeN3Vs.woff2) format('woff2') + } + + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans Extrabold'), local('OpenSans-Extrabold'), url(https://fonts.gstatic.com/s/opensans/v10/EInbV5DfGHOiMmvb1Xr-hiYtBUPDK3WL7KRKS_3q7OE.woff2) format('woff2') + } + .tags { + margin-top: 1.875rem + } + + .tags a { + font-size: 1.45rem; + color: #499bef; + display: inline-block; + border: 1px solid #499bef; + border-radius: .313rem; + padding: .25rem .625rem; + margin-right: .125rem; + margin-bottom: .5rem; + text-decoration: none + } + + .tags a:hover { + color: #fff; + background-color: rgb(0,86,167); + border: 1px solid rgb(0,86,167); + } + + .img-rounded { + border-radius: 50% + } + .post-item { + text-align: left; + padding: 2.5rem 0; + border-bottom: 3px solid #f2f2f2; + width: auto; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + width: 100%; + } + + .post-item:before, + .post-item:after { + content: ''; + display: table + } + + .post-item:after { + clear: both + } + + @media only screen and (max-width:62.5rem) { + .post-item { + padding-left: 1.25rem; + padding-right: 1.25rem + } + } + + .post-item .datetime { + float: left; + clear: none; + text-align: inherit; + width: 23%; + padding: 2%; + margin-left: 0%; + margin-right: 3%; + text-align: center; + text-decoration: none + } + + .post-item .datetime:before, + .post-item .datetime:after { + content: ''; + display: table + } + + .post-item .datetime:after { + clear: both + } + + .post-item .datetime:last-child { + margin-right: 0% + } + + @media only screen and (max-width:768px) { + .post-item .datetime { + display: block; + clear: both; + float: none; + width: 100%; + margin-left: auto; + margin-right: auto + } + .post-item .datetime:first-child { + margin-left: auto + } + .post-item .datetime:last-child { + margin-right: auto + } + } + + .post-item .datetime .day { + display: block; + font-family: 'Open Sans', sans-serif; + font-weight: 800; + font-style: normal; + color: rgb(0,86,167); + font-size: 8rem; + line-height: 1.6 + } + + @media only screen and (max-width:768px) { + .post-item .datetime .day { + display: block; + clear: both; + float: none; + width: 100%; + margin-left: auto; + margin-right: auto + } + .post-item .datetime .day:first-child { + margin-left: auto + } + .post-item .datetime .day:last-child { + margin-right: auto + } + } + + .post-item .datetime .month-year { + color: #000; + font-size: 2.5rem; + font-weight: 500; + } + + .post-item .content { + float: left; + clear: none; + text-align: inherit; + width: 74%; + margin-left: 0%; + margin-right: 3% + } + + .post-item .content:before, + .post-item .content:after { + content: ''; + display: table + } + + .post-item .content:after { + clear: both + } + + .post-item .content:last-child { + margin-right: 0% + } + + @media only screen and (max-width:768px) { + .post-item .content { + display: block; + clear: both; + float: none; + width: 100%; + margin-left: auto; + margin-right: auto + } + .post-item .content:first-child { + margin-left: auto + } + .post-item .content:last-child { + margin-right: auto + } + } + + .post-item .content a { + text-decoration: none + } + + .post-item .content .date { + color: rgb(0,86,167) + } + + @media only screen and (max-width:768px) { + .post-item .content .post-title { + text-align: center; + margin-top: 30px; + } + } + + .post-item .content .description { + color: #333; + font-weight: 300; + font-style: normal; + padding-right: 3%; + } + + @media only screen and (max-width:768px) { + .post-item .content .description { + padding: 0 3%; + } + } + + .post-content img { + max-width: 100%; + margin: 1.875rem auto; + display: block + } + + .post-content p, + .post-content h1, + .post-content h2, + .post-content h3, + .post-content h4, + .post-content ul, + .post-content ol, + .post-content iframe { + width: auto; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + padding: 0 1.25rem; + margin: 0 auto 1.875rem; + font-weight: 300; + line-height: 2; + } + + .post-content .tags { + width: auto; + max-width: 50rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + padding: 0 1.25rem; + margin: 0 auto 1.875rem; + font-weight: 300; + font-style: normal; + font-size: 1.6rem; + line-height: 2; + letter-spacing: .01rem + } + + .post-content p:before, + .post-content h1:before, + .post-content h2:before, + .post-content h3:before, + .post-content h4:before, + .post-content ul:before, + .post-content ol:before, + .post-content .tags:before, + .post-content iframe:before, + .post-content p:after, + .post-content h1:after, + .post-content h2:after, + .post-content h3:after, + .post-content h4:after, + .post-content ul:after, + .post-content ol:after, + .post-content .tags:after, + .post-content iframe:after { + content: ''; + display: table; + } + + .post-content p:after, + .post-content h1:after, + .post-content h2:after, + .post-content h3:after, + .post-content h4:after, + .post-content ul:after, + .post-content ol:after, + .post-content .tags:after, + .post-content iframe:after { + clear: both + } + + /* @media only screen and (min-width:37.5rem) { + .post-content p, + .post-content h1, + .post-content h2, + .post-content h3, + .post-content h4, + .post-content ul, + .post-content ol, + .post-content iframe { + font-size: 1.25rem + } + } */ + + .post-content p, + .post-content li { + color: #333 + } + + .post-content p code, + .post-content li code { + color: #3085f4; + border: 0; + } + + .post-content a { + font-weight: 300; + font-style: normal; + color: rgb(0,86,167); + text-decoration: none; + border-bottom: 1px solid rgb(0,86,167) + } + + .post-content iframe { + margin-top: 1.875rem; + width: 100% + } + + .post-content #twitter-widget-0 { + margin: auto!important + } + + .post-content h1, + .post-content h2, + .post-content h3, + .post-content h4, + .post-content h5 { + font-weight: 800; + font-style: normal + } + + .post-content h1 { + /* font-size: 1.875rem; */ + line-height: 1.4 + } + + @media only screen and (min-width:37.5rem) { + .post-content h1 { + /* font-size: 2.813rem */ + } + } + + .post-content h2 { + /* font-size: 1.375rem; */ + line-height: 1.4 + } + + @media only screen and (min-width:37.5rem) { + .post-content h2 { + /* font-size: 2.188rem */ + } + } + + .post-content h3 { + /* font-size: 1.125rem; */ + line-height: 1.4 + } + + @media only screen and (min-width:37.5rem) { + .post-content h3 { + /* font-size: 1.563rem */ + } + } + + .post-content ul, + .post-content ol { + padding-left: 2.5rem + } + + .post-content ul.post-list { + padding: 0 + } + + @media only screen and (max-width:37.5rem) { + .post-content ul.post-list { + padding: 0 1.25rem + } + } + + .post-content blockquote { + width: auto; + float: none; + display: block; + padding-left: 1rem; + padding-right: 1rem; + border-left: 4px solid rgb(0,86,167); + margin: 0 auto 1.875rem; + background-color: whitesmoke; + } + + .post-content blockquote:before, + .post-content blockquote:after { + content: ''; + display: table + } + + .post-content blockquote:after { + clear: both + } + + @media only screen and (max-width:37.5rem) { + .post-content blockquote { + width: 70% + } + } + + .post-content blockquote p { + color: rgba(0, 0, 0, .6); + margin: 0 + } + + @media only screen and (max-width:37.5rem) { + .post-content blockquote p { + font-size: 1.125rem; + line-height: 1.5; + padding: 0 + } + } + + .post-content hr { + width: auto; + max-width: 47.5rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + border: 1px solid #f2f2f2; + margin: 50px auto + } + + .post-content hr:before, + .post-content hr:after { + content: ''; + display: table + } + + .post-content hr:after { + clear: both + } + + .card-deck { + display: flex !important; + width: 100% !important; + } + + .card { + flex: 1 !important; + } + + @media only screen and (max-width: 1000px) { + .card { + display: block !important; + flex: none; + } + .card-deck { + display: block !important; + } + } + + .nav-bg { + height: 70px; + background-color: #499bef; + } + + @media only screen and (max-width: 1200px) { + .nav-bg { + height: 90px; + background-color: #499bef; + } + } + + .header-post { + margin-top: 40px; + overflow: hidden; + } + + .header-post h1 { + text-transform: uppercase; + font-size: 2em; + color: #000; + font-weight: 900; + } + + .header-post .content { + margin: 30px; + } + + .header-post .header-date { + margin-left: 4px; + } + + .header-post .subtitle { + color: #101010; + margin: 5px 0; + } + + .author-small { + position: relative; + } + .author-small .author-img { + position: absolute; + top: 0; + left: 0; + display: block; + width: 30px; + height: 30px; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; + } + .author-small .author-img img{ + border-radius: 50%; + } + .author-small .author { + padding-left: 40px; + } + + .mt { + margin-top: 20px; + padding: 30px; + } + + pre { + background: #222; + width: 90%; + padding: 1.25rem; + color: #fff; + margin: 1.875rem auto; + } + + @media only screen and (min-width:37.5rem) { + pre { + padding: 2.5rem; + margin: 2.125rem auto; + } + } + + pre code:before, + pre code:after { + content: ''; + display: table + } + + pre code:after { + clear: both + } + + @media only screen and (max-width:37.5rem) { + pre code { + overflow-x: scroll + } + } + + .temp-div { + display: none; + } + + .related-articles { + line-height: 1.7 !important; + } + + .author-big { + padding: 2.5rem 0; + margin: 2.5rem 0; + display: grid; + } + .author-big .author-img-center{ + text-align: center; + } + .author-big .author-img-big { + width: 250px !important; + height: 250px !important; + max-width: none !important; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; + } + @media only screen and (max-width: 991px) { + .author-big .author-img-big { + width: 150px !important; + height: 150px !important; + } + } + .author-big .author-img-big img{ + border-radius: 50%; + margin: auto; + } + .author-big .author { + padding-left: 40px; + } + .author-big .author-details { + overflow: hidden; + } + @media only screen and (max-width: 768px) { + .author-big .author-details { + margin-top: 30px; + } + } + .author-big-email { + margin-left: 7px; + } + .disp-box { + padding: 2.5rem; + margin: 0 2.5rem 2.5rem 2.5rem; + } + .share-icons a{ + font-size: 2.5rem !important; + margin: 0 0.5em; + } + .share-icons a:first-of-type { + margin-left: 0; + } + .mr { + margin-right: 15px; + } + @media only screen and (max-width: 991px) { + .mr { + margin-right: 0; + } + } + + .overlay { + height: 100%; + width: 100%; + display: none; + position: fixed; + z-index: 1; + top: 0; + left: 0; + } + + .overlay-content { + position: absolute; + top: 46%; + width: 100%; + text-align: center; + } + + .overlay .closebtn { + position: absolute; + top: 20px; + right: 45px; + font-size: 60px; + cursor: pointer; + color: white; + } + + .overlay .closebtn:hover { + color: #ccc; + } + + .overlay input[type=text] { + border: none; + float: left; + width: 100%; + background: white; + } + + .overlay input[type=text]:hover { + background: #f1f1f1; + } + + .search-bar { + margin: 2em auto; + width: 60%; + } + + .search-box, .search-box:focus { + margin: auto; + width: 100%; + border: transparent; + border-radius: 2em; + outline: none !important; + color: #4d4d4d!important; + padding: 1em 1.5em; + display: table-cell; + } + + .results { + display: table-cell; + position: relative; + text-align: left !important; + padding: 1em 3em; + margin: 0 2em; + } + + #results-container { + position: relative; + transition: all .5s ease; + } + + .post-content ol li { + margin-bottom: 2rem; + } \ No newline at end of file diff --git a/blog/assets/css/bootstrap.css b/blog/assets/css/bootstrap.css new file mode 100644 index 0000000..75bde59 --- /dev/null +++ b/blog/assets/css/bootstrap.css @@ -0,0 +1,6259 @@ +@charset "UTF-8"; +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +a:active, +a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + .navbar { + display: none; + } + + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857; + color: #333333; + background-color: #fff; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +a { + color: #337ab7; + text-decoration: none; +} +a:hover, a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +figure { + margin: 0; +} + +img { + vertical-align: middle; +} + +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} + +.img-rounded { + border-radius: 6px; +} + +.img-thumbnail { + padding: 4px; + line-height: 1.42857; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} + +.img-circle { + border-radius: 50%; +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} + +[role="button"] { + cursor: pointer; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h1 .small, h2 small, +h2 .small, h3 small, +h3 .small, h4 small, +h4 .small, h5 small, +h5 .small, h6 small, +h6 .small, +.h1 small, +.h1 .small, .h2 small, +.h2 .small, .h3 small, +.h3 .small, .h4 small, +.h4 .small, .h5 small, +.h5 .small, .h6 small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +h1 .small, .h1 small, +.h1 .small, +h2 small, +h2 .small, .h2 small, +.h2 .small, +h3 small, +h3 .small, .h3 small, +.h3 .small { + font-size: 65%; +} + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +h4 .small, .h4 small, +.h4 .small, +h5 small, +h5 .small, .h5 small, +.h5 .small, +h6 small, +h6 .small, .h6 small, +.h6 .small { + font-size: 75%; +} + +h1, .h1 { + font-size: 36px; +} + +h2, .h2 { + font-size: 30px; +} + +h3, .h3 { + font-size: 24px; +} + +h4, .h4 { + font-size: 18px; +} + +h5, .h5 { + font-size: 14px; +} + +h6, .h6 { + font-size: 12px; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} + +small, +.small { + font-size: 85%; +} + +mark, +.mark { + background-color: #fcf8e3; + padding: .2em; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +.text-justify { + text-align: justify; +} + +.text-nowrap { + white-space: nowrap; +} + +.text-lowercase { + text-transform: lowercase; +} + +.text-uppercase, .initialism { + text-transform: uppercase; +} + +.text-capitalize { + text-transform: capitalize; +} + +.text-muted { + color: #777777; +} + +.text-primary { + color: #337ab7; +} + +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} + +.text-success { + color: #3c763d; +} + +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} + +.text-info { + color: #31708f; +} + +a.text-info:hover, +a.text-info:focus { + color: #245269; +} + +.text-warning { + color: #8a6d3b; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} + +.text-danger { + color: #a94442; +} + +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} + +.bg-primary { + color: #fff; +} + +.bg-primary { + background-color: #337ab7; +} + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} + +.bg-success { + background-color: #dff0d8; +} + +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} + +.bg-info { + background-color: #d9edf7; +} + +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} + +.bg-warning { + background-color: #fcf8e3; +} + +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} + +.bg-danger { + background-color: #f2dede; +} + +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ul ol, +ol ul, +ol ol { + margin-bottom: 0; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} + +dl { + margin-top: 0; + margin-bottom: 20px; +} + +dt, +dd { + line-height: 1.42857; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 0; +} + +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; +} +.dl-horizontal dd:after { + clear: both; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; +} + +.initialism { + font-size: 90%; +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857; + color: #777777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +.blockquote-reverse small:before, +.blockquote-reverse .small:before, +blockquote.pull-right footer:before, +blockquote.pull-right small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +.blockquote-reverse small:after, +.blockquote-reverse .small:after, +blockquote.pull-right footer:after, +blockquote.pull-right small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857; +} + +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container:before, .container:after { + content: " "; + display: table; +} +.container:after { + clear: both; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.container-fluid:before, .container-fluid:after { + content: " "; + display: table; +} +.container-fluid:after { + clear: both; +} + +.row { + margin-left: -15px; + margin-right: -15px; +} +.row:before, .row:after { + content: " "; + display: table; +} +.row:after { + clear: both; +} + +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} + +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} + +.col-xs-1 { + width: 8.33333%; +} + +.col-xs-2 { + width: 16.66667%; +} + +.col-xs-3 { + width: 25%; +} + +.col-xs-4 { + width: 33.33333%; +} + +.col-xs-5 { + width: 41.66667%; +} + +.col-xs-6 { + width: 50%; +} + +.col-xs-7 { + width: 58.33333%; +} + +.col-xs-8 { + width: 66.66667%; +} + +.col-xs-9 { + width: 75%; +} + +.col-xs-10 { + width: 83.33333%; +} + +.col-xs-11 { + width: 91.66667%; +} + +.col-xs-12 { + width: 100%; +} + +.col-xs-pull-0 { + right: auto; +} + +.col-xs-pull-1 { + right: 8.33333%; +} + +.col-xs-pull-2 { + right: 16.66667%; +} + +.col-xs-pull-3 { + right: 25%; +} + +.col-xs-pull-4 { + right: 33.33333%; +} + +.col-xs-pull-5 { + right: 41.66667%; +} + +.col-xs-pull-6 { + right: 50%; +} + +.col-xs-pull-7 { + right: 58.33333%; +} + +.col-xs-pull-8 { + right: 66.66667%; +} + +.col-xs-pull-9 { + right: 75%; +} + +.col-xs-pull-10 { + right: 83.33333%; +} + +.col-xs-pull-11 { + right: 91.66667%; +} + +.col-xs-pull-12 { + right: 100%; +} + +.col-xs-push-0 { + left: auto; +} + +.col-xs-push-1 { + left: 8.33333%; +} + +.col-xs-push-2 { + left: 16.66667%; +} + +.col-xs-push-3 { + left: 25%; +} + +.col-xs-push-4 { + left: 33.33333%; +} + +.col-xs-push-5 { + left: 41.66667%; +} + +.col-xs-push-6 { + left: 50%; +} + +.col-xs-push-7 { + left: 58.33333%; +} + +.col-xs-push-8 { + left: 66.66667%; +} + +.col-xs-push-9 { + left: 75%; +} + +.col-xs-push-10 { + left: 83.33333%; +} + +.col-xs-push-11 { + left: 91.66667%; +} + +.col-xs-push-12 { + left: 100%; +} + +.col-xs-offset-0 { + margin-left: 0%; +} + +.col-xs-offset-1 { + margin-left: 8.33333%; +} + +.col-xs-offset-2 { + margin-left: 16.66667%; +} + +.col-xs-offset-3 { + margin-left: 25%; +} + +.col-xs-offset-4 { + margin-left: 33.33333%; +} + +.col-xs-offset-5 { + margin-left: 41.66667%; +} + +.col-xs-offset-6 { + margin-left: 50%; +} + +.col-xs-offset-7 { + margin-left: 58.33333%; +} + +.col-xs-offset-8 { + margin-left: 66.66667%; +} + +.col-xs-offset-9 { + margin-left: 75%; +} + +.col-xs-offset-10 { + margin-left: 83.33333%; +} + +.col-xs-offset-11 { + margin-left: 91.66667%; +} + +.col-xs-offset-12 { + margin-left: 100%; +} + +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + + .col-sm-1 { + width: 8.33333%; + } + + .col-sm-2 { + width: 16.66667%; + } + + .col-sm-3 { + width: 25%; + } + + .col-sm-4 { + width: 33.33333%; + } + + .col-sm-5 { + width: 41.66667%; + } + + .col-sm-6 { + width: 50%; + } + + .col-sm-7 { + width: 58.33333%; + } + + .col-sm-8 { + width: 66.66667%; + } + + .col-sm-9 { + width: 75%; + } + + .col-sm-10 { + width: 83.33333%; + } + + .col-sm-11 { + width: 91.66667%; + } + + .col-sm-12 { + width: 100%; + } + + .col-sm-pull-0 { + right: auto; + } + + .col-sm-pull-1 { + right: 8.33333%; + } + + .col-sm-pull-2 { + right: 16.66667%; + } + + .col-sm-pull-3 { + right: 25%; + } + + .col-sm-pull-4 { + right: 33.33333%; + } + + .col-sm-pull-5 { + right: 41.66667%; + } + + .col-sm-pull-6 { + right: 50%; + } + + .col-sm-pull-7 { + right: 58.33333%; + } + + .col-sm-pull-8 { + right: 66.66667%; + } + + .col-sm-pull-9 { + right: 75%; + } + + .col-sm-pull-10 { + right: 83.33333%; + } + + .col-sm-pull-11 { + right: 91.66667%; + } + + .col-sm-pull-12 { + right: 100%; + } + + .col-sm-push-0 { + left: auto; + } + + .col-sm-push-1 { + left: 8.33333%; + } + + .col-sm-push-2 { + left: 16.66667%; + } + + .col-sm-push-3 { + left: 25%; + } + + .col-sm-push-4 { + left: 33.33333%; + } + + .col-sm-push-5 { + left: 41.66667%; + } + + .col-sm-push-6 { + left: 50%; + } + + .col-sm-push-7 { + left: 58.33333%; + } + + .col-sm-push-8 { + left: 66.66667%; + } + + .col-sm-push-9 { + left: 75%; + } + + .col-sm-push-10 { + left: 83.33333%; + } + + .col-sm-push-11 { + left: 91.66667%; + } + + .col-sm-push-12 { + left: 100%; + } + + .col-sm-offset-0 { + margin-left: 0%; + } + + .col-sm-offset-1 { + margin-left: 8.33333%; + } + + .col-sm-offset-2 { + margin-left: 16.66667%; + } + + .col-sm-offset-3 { + margin-left: 25%; + } + + .col-sm-offset-4 { + margin-left: 33.33333%; + } + + .col-sm-offset-5 { + margin-left: 41.66667%; + } + + .col-sm-offset-6 { + margin-left: 50%; + } + + .col-sm-offset-7 { + margin-left: 58.33333%; + } + + .col-sm-offset-8 { + margin-left: 66.66667%; + } + + .col-sm-offset-9 { + margin-left: 75%; + } + + .col-sm-offset-10 { + margin-left: 83.33333%; + } + + .col-sm-offset-11 { + margin-left: 91.66667%; + } + + .col-sm-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + + .col-md-1 { + width: 8.33333%; + } + + .col-md-2 { + width: 16.66667%; + } + + .col-md-3 { + width: 25%; + } + + .col-md-4 { + width: 33.33333%; + } + + .col-md-5 { + width: 41.66667%; + } + + .col-md-6 { + width: 50%; + } + + .col-md-7 { + width: 58.33333%; + } + + .col-md-8 { + width: 66.66667%; + } + + .col-md-9 { + width: 75%; + } + + .col-md-10 { + width: 83.33333%; + } + + .col-md-11 { + width: 91.66667%; + } + + .col-md-12 { + width: 100%; + } + + .col-md-pull-0 { + right: auto; + } + + .col-md-pull-1 { + right: 8.33333%; + } + + .col-md-pull-2 { + right: 16.66667%; + } + + .col-md-pull-3 { + right: 25%; + } + + .col-md-pull-4 { + right: 33.33333%; + } + + .col-md-pull-5 { + right: 41.66667%; + } + + .col-md-pull-6 { + right: 50%; + } + + .col-md-pull-7 { + right: 58.33333%; + } + + .col-md-pull-8 { + right: 66.66667%; + } + + .col-md-pull-9 { + right: 75%; + } + + .col-md-pull-10 { + right: 83.33333%; + } + + .col-md-pull-11 { + right: 91.66667%; + } + + .col-md-pull-12 { + right: 100%; + } + + .col-md-push-0 { + left: auto; + } + + .col-md-push-1 { + left: 8.33333%; + } + + .col-md-push-2 { + left: 16.66667%; + } + + .col-md-push-3 { + left: 25%; + } + + .col-md-push-4 { + left: 33.33333%; + } + + .col-md-push-5 { + left: 41.66667%; + } + + .col-md-push-6 { + left: 50%; + } + + .col-md-push-7 { + left: 58.33333%; + } + + .col-md-push-8 { + left: 66.66667%; + } + + .col-md-push-9 { + left: 75%; + } + + .col-md-push-10 { + left: 83.33333%; + } + + .col-md-push-11 { + left: 91.66667%; + } + + .col-md-push-12 { + left: 100%; + } + + .col-md-offset-0 { + margin-left: 0%; + } + + .col-md-offset-1 { + margin-left: 8.33333%; + } + + .col-md-offset-2 { + margin-left: 16.66667%; + } + + .col-md-offset-3 { + margin-left: 25%; + } + + .col-md-offset-4 { + margin-left: 33.33333%; + } + + .col-md-offset-5 { + margin-left: 41.66667%; + } + + .col-md-offset-6 { + margin-left: 50%; + } + + .col-md-offset-7 { + margin-left: 58.33333%; + } + + .col-md-offset-8 { + margin-left: 66.66667%; + } + + .col-md-offset-9 { + margin-left: 75%; + } + + .col-md-offset-10 { + margin-left: 83.33333%; + } + + .col-md-offset-11 { + margin-left: 91.66667%; + } + + .col-md-offset-12 { + margin-left: 100%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + + .col-lg-1 { + width: 8.33333%; + } + + .col-lg-2 { + width: 16.66667%; + } + + .col-lg-3 { + width: 25%; + } + + .col-lg-4 { + width: 33.33333%; + } + + .col-lg-5 { + width: 41.66667%; + } + + .col-lg-6 { + width: 50%; + } + + .col-lg-7 { + width: 58.33333%; + } + + .col-lg-8 { + width: 66.66667%; + } + + .col-lg-9 { + width: 75%; + } + + .col-lg-10 { + width: 83.33333%; + } + + .col-lg-11 { + width: 91.66667%; + } + + .col-lg-12 { + width: 100%; + } + + .col-lg-pull-0 { + right: auto; + } + + .col-lg-pull-1 { + right: 8.33333%; + } + + .col-lg-pull-2 { + right: 16.66667%; + } + + .col-lg-pull-3 { + right: 25%; + } + + .col-lg-pull-4 { + right: 33.33333%; + } + + .col-lg-pull-5 { + right: 41.66667%; + } + + .col-lg-pull-6 { + right: 50%; + } + + .col-lg-pull-7 { + right: 58.33333%; + } + + .col-lg-pull-8 { + right: 66.66667%; + } + + .col-lg-pull-9 { + right: 75%; + } + + .col-lg-pull-10 { + right: 83.33333%; + } + + .col-lg-pull-11 { + right: 91.66667%; + } + + .col-lg-pull-12 { + right: 100%; + } + + .col-lg-push-0 { + left: auto; + } + + .col-lg-push-1 { + left: 8.33333%; + } + + .col-lg-push-2 { + left: 16.66667%; + } + + .col-lg-push-3 { + left: 25%; + } + + .col-lg-push-4 { + left: 33.33333%; + } + + .col-lg-push-5 { + left: 41.66667%; + } + + .col-lg-push-6 { + left: 50%; + } + + .col-lg-push-7 { + left: 58.33333%; + } + + .col-lg-push-8 { + left: 66.66667%; + } + + .col-lg-push-9 { + left: 75%; + } + + .col-lg-push-10 { + left: 83.33333%; + } + + .col-lg-push-11 { + left: 91.66667%; + } + + .col-lg-push-12 { + left: 100%; + } + + .col-lg-offset-0 { + margin-left: 0%; + } + + .col-lg-offset-1 { + margin-left: 8.33333%; + } + + .col-lg-offset-2 { + margin-left: 16.66667%; + } + + .col-lg-offset-3 { + margin-left: 25%; + } + + .col-lg-offset-4 { + margin-left: 33.33333%; + } + + .col-lg-offset-5 { + margin-left: 41.66667%; + } + + .col-lg-offset-6 { + margin-left: 50%; + } + + .col-lg-offset-7 { + margin-left: 58.33333%; + } + + .col-lg-offset-8 { + margin-left: 66.66667%; + } + + .col-lg-offset-9 { + margin-left: 75%; + } + + .col-lg-offset-10 { + margin-left: 83.33333%; + } + + .col-lg-offset-11 { + margin-left: 91.66667%; + } + + .col-lg-offset-12 { + margin-left: 100%; + } +} +table { + background-color: transparent; +} + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; +} + +th { + text-align: left; +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > thead > tr > td, +.table > tbody > tr > th, +.table > tbody > tr > td, +.table > tfoot > tr > th, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > th, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} + +.table-condensed > thead > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 5px; +} + +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > th, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > th, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} + +table col[class*="col-"] { + position: static; + float: none; + display: table-column; +} + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} + +.table > thead > tr > td.active, +.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} + +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} + +.table > thead > tr > td.success, +.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} + +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} + +.table > thead > tr > td.info, +.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} + +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} + +.table > thead > tr > td.warning, +.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} + +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} + +.table > thead > tr > td.danger, +.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} + +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} + +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} + +input[type="file"] { + display: block; +} + +input[type="range"] { + display: block; + width: 100%; +} + +select[multiple], +select[size] { + height: auto; +} + +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +output { + display: block; + padding-top: 11px; + font-size: 14px; + line-height: 1.42857; + color: #555555; +} + +.form-control { + display: block; + width: 100%; + height: 42px; + padding: 10px 20px; + font-size: 14px; + line-height: 1.42857; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; +} +.form-control[disabled], fieldset[disabled] .form-control { + cursor: not-allowed; +} + +textarea.form-control { + height: auto; +} + +input[type="search"] { + -webkit-appearance: none; +} + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 42px; + } + input[type="date"].input-sm, .input-group-sm > input[type="date"].form-control, + .input-group-sm > input[type="date"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="date"].btn, .input-group-sm input[type="date"], + input[type="time"].input-sm, + .input-group-sm > input[type="time"].form-control, + .input-group-sm > input[type="time"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="time"].btn, .input-group-sm + input[type="time"], + input[type="datetime-local"].input-sm, + .input-group-sm > input[type="datetime-local"].form-control, + .input-group-sm > input[type="datetime-local"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, .input-group-sm + input[type="datetime-local"], + input[type="month"].input-sm, + .input-group-sm > input[type="month"].form-control, + .input-group-sm > input[type="month"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="month"].btn, .input-group-sm + input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, + .input-group-lg > input[type="date"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="date"].btn, .input-group-lg input[type="date"], + input[type="time"].input-lg, + .input-group-lg > input[type="time"].form-control, + .input-group-lg > input[type="time"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="time"].btn, .input-group-lg + input[type="time"], + input[type="datetime-local"].input-lg, + .input-group-lg > input[type="datetime-local"].form-control, + .input-group-lg > input[type="datetime-local"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, .input-group-lg + input[type="datetime-local"], + input[type="month"].input-lg, + .input-group-lg > input[type="month"].form-control, + .input-group-lg > input[type="month"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="month"].btn, .input-group-lg + input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} + +input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], +input[type="checkbox"][disabled], +input[type="checkbox"].disabled, fieldset[disabled] +input[type="checkbox"] { + cursor: not-allowed; +} + +.radio-inline.disabled, fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, fieldset[disabled] +.checkbox-inline { + cursor: not-allowed; +} + +.radio.disabled label, fieldset[disabled] .radio label, +.checkbox.disabled label, fieldset[disabled] +.checkbox label { + cursor: not-allowed; +} + +.form-control-static { + padding-top: 11px; + padding-bottom: 11px; + margin-bottom: 0; + min-height: 34px; +} +.form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, +.input-group-lg > .form-control-static.input-group-addon, +.input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, +.input-group-sm > .form-control-static.input-group-addon, +.input-group-sm > .input-group-btn > .form-control-static.btn { + padding-left: 0; + padding-right: 0; +} + +.input-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +select.input-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn { + height: 30px; + line-height: 30px; +} + +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, +select[multiple].input-sm, +.input-group-sm > select[multiple].form-control, +.input-group-sm > select[multiple].input-group-addon, +.input-group-sm > .input-group-btn > select[multiple].btn { + height: auto; +} + +.form-group-sm .form-control { + height: 30px; + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 20px; + font-size: 12px; + line-height: 1.5; +} + +.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; + border-radius: 6px; +} + +select.input-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn { + height: 46px; + line-height: 46px; +} + +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, +select[multiple].input-lg, +.input-group-lg > select[multiple].form-control, +.input-group-lg > select[multiple].input-group-addon, +.input-group-lg > .input-group-btn > select[multiple].btn { + height: auto; +} + +.form-group-lg .form-control { + height: 46px; + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 20px; + font-size: 18px; + line-height: 1.33333; +} + +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 52.5px; +} + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 42px; + height: 42px; + line-height: 42px; + text-align: center; + pointer-events: none; +} + +.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} + +.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; +} +.has-success .form-control-feedback { + color: #3c763d; +} + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; +} +.has-error .form-control-feedback { + color: #a94442; +} + +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} + +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} + +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 11px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 31px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +.form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; +} +.form-horizontal .form-group:after { + clear: both; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 11px; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.33333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 10px 20px; + font-size: 14px; + line-height: 1.42857; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, .btn:focus, .btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none; +} + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, .btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + background-image: none; +} +.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + background-image: none; +} +.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + background-image: none; +} +.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + background-image: none; +} +.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, .btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + background-image: none; +} +.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + background-image: none; +} +.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} + +.btn-link { + color: #337ab7; + font-weight: normal; + border-radius: 0; +} +.btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { + border-color: transparent; +} +.btn-link:hover, .btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; + border-radius: 6px; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-xs, .btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} + +.collapse { + display: none; +} +.collapse.in { + display: block; +} + +tr.collapse.in { + display: table-row; +} + +tbody.collapse.in { + display: table-row-group; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle:focus { + outline: 0; +} + +.dropdown-menu { + position: absolute; + top: auto; + left: 0; + z-index: 1000; + display: none; + float: none; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #337ab7; +} + +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #777777; +} +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} + +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} + +.dropdown-menu-right { + left: auto; + right: 0; +} + +.dropdown-menu-left { + left: 0; + right: auto; +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857; + color: #777777; + white-space: nowrap; +} + +/* +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +*/ + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 2; +} + +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} + +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar:before, .btn-toolbar:after { + content: " "; + display: table; +} +.btn-toolbar:after { + clear: both; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group > .btn-group { + float: left; +} + +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} + +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn .caret { + margin-left: 0; +} + +.btn-lg .caret, .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} + +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret { + border-width: 0 5px 5px; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; +} +.btn-group-vertical > .btn-group:after { + clear: both; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 4px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} + +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} + +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} + +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} + +.input-group-addon { + padding: 10px 20px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 20px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 10px 20px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} + +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} + +.input-group-addon:first-child { + border-right: 0; +} + +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} + +.input-group-addon:last-child { + border-left: 0; +} + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} + +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav:before, .nav:after { + content: " "; + display: table; +} +.nav:after { + clear: both; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #777777; +} +.nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; +} +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #555555; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} + +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} + +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} + +.nav-justified, .nav-tabs.nav-justified { + width: 100%; +} +.nav-justified > li, .nav-tabs.nav-justified > li { + float: none; +} +.nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar { + position: relative; + min-height: 55px; + margin-bottom: 20px; + border: 1px solid transparent; +} +.navbar:before, .navbar:after { + content: " "; + display: table; +} +.navbar:after { + clear: both; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} + +.navbar-header:before, .navbar-header:after { + content: " "; + display: table; +} +.navbar-header:after { + clear: both; +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse:before, .navbar-collapse:after { + content: " "; + display: table; +} +.navbar-collapse:after { + clear: both; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} + +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} + +.container > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-header, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} + +.navbar-brand { + float: left; + padding: 17.5px 15px; + font-size: 18px; + line-height: 20px; + height: 55px; +} +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} + +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 10.5px; + margin-bottom: 10.5px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} + +.navbar-nav { + margin: 8.75px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 17.5px; + padding-bottom: 17.5px; + } +} + +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 6.5px; + margin-bottom: 6.5px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.navbar-btn { + margin-top: 6.5px; + margin-bottom: 6.5px; +} +.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { + margin-top: 12.5px; + margin-bottom: 12.5px; +} +.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { + margin-top: 16.5px; + margin-bottom: 16.5px; +} + +.navbar-text { + margin-top: 17.5px; + margin-bottom: 17.5px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } +} + +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} + +.navbar-inverse { + background-color: #222; + border-color: #090909; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #090909; +} +.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #090909; + color: #fff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #090909; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/ "; + padding: 0 5px; + color: #ccc; +} +.breadcrumb > .active { + color: #777777; +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 10px 20px; + line-height: 1.42857; + text-decoration: none; + color: #337ab7; + background-color: #fff; + border: 1px solid #ddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination > li > a:hover, .pagination > li > a:focus, +.pagination > li > span:hover, +.pagination > li > span:focus { + z-index: 3; + color: #23527c; + background-color: #eeeeee; + border-color: #ddd; +} +.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, +.pagination > .active > span, +.pagination > .active > span:hover, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777777; + background-color: #fff; + border-color: #ddd; + cursor: not-allowed; +} + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 20px; + font-size: 18px; + line-height: 1.33333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 20px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager:before, .pager:after { + content: " "; + display: table; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777777; + background-color: #fff; + cursor: not-allowed; +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.label-default { + background-color: #777777; +} +.label-default[href]:hover, .label-default[href]:focus { + background-color: #5e5e5e; +} + +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, .label-primary[href]:focus { + background-color: #286090; +} + +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, .label-success[href]:focus { + background-color: #449d44; +} + +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; +} + +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, .label-warning[href]:focus { + background-color: #ec971f; +} + +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, .label-danger[href]:focus { + background-color: #c9302c; +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #fff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #777777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, .btn-group-xs > .btn .badge, .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +.list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, .container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} + +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} + +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} + +.alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} + +.alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; +} + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.media-body { + width: 10000px; +} + +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} + +.media-right, +.media > .pull-right { + padding-left: 10px; +} + +.media-left, +.media > .pull-left { + padding-right: 10px; +} + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} + +.media-middle { + vertical-align: middle; +} + +.media-bottom { + vertical-align: bottom; +} + +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.media-list { + padding-left: 0; + list-style: none; +} + +.list-group { + margin-bottom: 20px; + padding-left: 0; +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, a.list-group-item:focus, +button.list-group-item:hover, +button.list-group-item:focus { + text-decoration: none; + color: #555; + background-color: #f5f5f5; +} + +button.list-group-item { + width: 100%; + text-align: left; +} + +.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { + background-color: #eeeeee; + color: #777777; + cursor: not-allowed; +} +.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { + color: #777777; +} +.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, a.list-group-item-success:focus, +button.list-group-item-success:hover, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, +button.list-group-item-success.active, +button.list-group-item-success.active:hover, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, a.list-group-item-info:focus, +button.list-group-item-info:hover, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, +button.list-group-item-info.active, +button.list-group-item-info.active:hover, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, a.list-group-item-warning:focus, +button.list-group-item-warning:hover, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, +button.list-group-item-warning.active, +button.list-group-item-warning.active:hover, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, a.list-group-item-danger:focus, +button.list-group-item-danger:hover, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, +button.list-group-item-danger.active, +button.list-group-item-danger.active:hover, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.panel-body { + padding: 15px; +} +.panel-body:before, .panel-body:after { + content: " "; + display: table; +} +.panel-body:after { + clear: both; +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} + +.list-group + .panel-footer { + border-top-width: 0; +} + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} + +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} + +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} + +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} + +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} + +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} + +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} + +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; +} + +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} + +.embed-responsive-4by3 { + padding-bottom: 75%; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-lg { + padding: 24px; + border-radius: 6px; +} + +.well-sm { + padding: 9px; + border-radius: 3px; +} + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.modal-open { + overflow: hidden; +} + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +.modal-content { + position: relative; + background-color: #fff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857px; +} + +.modal-header .close { + margin-top: -2px; +} + +.modal-title { + margin: 0; + line-height: 1.42857; +} + +.modal-body { + position: relative; + padding: 15px; +} + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer:before, .modal-footer:after { + content: " "; + display: table; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} + +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover > .arrow { + border-width: 11px; +} + +.popover > .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #fff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #fff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #fff; + bottom: -10px; +} + +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: transparent; +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; +} + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} + +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, .clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.pull-right { + float: right !important; +} + +.pull-left { + float: left !important; +} + +.hide { + display: none !important; +} + +.show { + display: block !important; +} + +.invisible { + visibility: hidden; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.hidden { + display: none !important; +} + +.affix { + position: fixed; +} + +@-ms-viewport { + width: device-width; +} +.visible-xs { + display: none !important; +} + +.visible-sm { + display: none !important; +} + +.visible-md { + display: none !important; +} + +.visible-lg { + display: none !important; +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + + table.visible-xs { + display: table !important; + } + + tr.visible-xs { + display: table-row !important; + } + + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + + table.visible-sm { + display: table !important; + } + + tr.visible-sm { + display: table-row !important; + } + + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + + table.visible-md { + display: table !important; + } + + tr.visible-md { + display: table-row !important; + } + + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + + table.visible-lg { + display: table !important; + } + + tr.visible-lg { + display: table-row !important; + } + + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} + +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: block !important; + } + + table.visible-print { + display: table !important; + } + + tr.visible-print { + display: table-row !important; + } + + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} + +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} + +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} + +@media print { + .hidden-print { + display: none !important; + } +} + +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/blog/assets/css/bootstrap.css.map b/blog/assets/css/bootstrap.css.map new file mode 100644 index 0000000..b8a3c00 --- /dev/null +++ b/blog/assets/css/bootstrap.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";;;;;;;AAQA,IAAK;EACH,WAAW,EAAE,UAAU;EACvB,oBAAoB,EAAE,IAAI;EAC1B,wBAAwB,EAAE,IAAI;;;AAOhC,IAAK;EACH,MAAM,EAAE,CAAC;;;AAaX;;;;;;;;;;;;OAYQ;EACN,OAAO,EAAE,KAAK;;;AAQhB;;;KAGM;EACJ,OAAO,EAAE,YAAY;EACrB,cAAc,EAAE,QAAQ;;;AAQ1B,qBAAsB;EACpB,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,CAAC;;;AAQX;QACS;EACP,OAAO,EAAE,IAAI;;;AAUf,CAAE;EACA,gBAAgB,EAAE,WAAW;;;AAQ/B;OACQ;EACN,OAAO,EAAE,CAAC;;;AAUZ,WAAY;EACV,aAAa,EAAE,UAAU;;;AAO3B;MACO;EACL,WAAW,EAAE,IAAI;;;AAOnB,GAAI;EACF,UAAU,EAAE,MAAM;;;AAQpB,EAAG;EACD,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,QAAQ;;;AAOlB,IAAK;EACH,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;;;AAOb,KAAM;EACJ,SAAS,EAAE,GAAG;;;AAOhB;GACI;EACF,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,QAAQ;;;AAG1B,GAAI;EACF,GAAG,EAAE,MAAM;;;AAGb,GAAI;EACF,MAAM,EAAE,OAAO;;;AAUjB,GAAI;EACF,MAAM,EAAE,CAAC;;;AAOX,cAAe;EACb,QAAQ,EAAE,MAAM;;;AAUlB,MAAO;EACL,MAAM,EAAE,QAAQ;;;AAOlB,EAAG;EACD,UAAU,EAAE,WAAW;EACvB,MAAM,EAAE,CAAC;;;AAOX,GAAI;EACF,QAAQ,EAAE,IAAI;;;AAOhB;;;IAGK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAE,GAAG;;;AAkBhB;;;;QAIS;EACP,KAAK,EAAE,OAAO;EACd,IAAI,EAAE,OAAO;EACb,MAAM,EAAE,CAAC;;;AAOX,MAAO;EACL,QAAQ,EAAE,OAAO;;;AAUnB;MACO;EACL,cAAc,EAAE,IAAI;;;AAWtB;;;oBAGqB;EACnB,kBAAkB,EAAE,MAAM;EAC1B,MAAM,EAAE,OAAO;;;AAOjB;oBACqB;EACnB,MAAM,EAAE,OAAO;;;AAOjB;uBACwB;EACtB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AAQZ,KAAM;EACJ,WAAW,EAAE,MAAM;;;AAWrB;mBACoB;EAClB,UAAU,EAAE,UAAU;EACtB,OAAO,EAAE,CAAC;;;AASZ;+CACgD;EAC9C,MAAM,EAAE,IAAI;;;AAQd,oBAAqB;EACnB,kBAAkB,EAAE,SAAS;EAC7B,UAAU,EAAE,WAAW;;;AASzB;+CACgD;EAC9C,kBAAkB,EAAE,IAAI;;;AAO1B,QAAS;EACP,MAAM,EAAE,iBAAiB;EACzB,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,qBAAqB;;;AAQhC,MAAO;EACL,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;;AAOZ,QAAS;EACP,QAAQ,EAAE,IAAI;;;AAQhB,QAAS;EACP,WAAW,EAAE,IAAI;;;AAUnB,KAAM;EACJ,eAAe,EAAE,QAAQ;EACzB,cAAc,EAAE,CAAC;;;AAGnB;EACG;EACD,OAAO,EAAE,CAAC;;;;AC/ZZ,YAAa;EACT;;SAEQ;IACJ,UAAU,EAAE,sBAAsB;IAClC,KAAK,EAAE,eAAe;IACtB,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,eAAe;;;EAGhC;WACU;IACN,eAAe,EAAE,SAAS;;;EAG9B,aAAc;IACV,OAAO,EAAE,mBAAmB;;;EAGhC,iBAAkB;IACd,OAAO,EAAE,oBAAoB;;;EAKjC;8BAC6B;IACzB,OAAO,EAAE,EAAE;;;EAGf;YACW;IACP,MAAM,EAAE,cAAc;IACtB,iBAAiB,EAAE,KAAK;;;EAG5B,KAAM;IACF,OAAO,EAAE,kBAAkB;;;EAG/B;KACI;IACA,iBAAiB,EAAE,KAAK;;;EAG5B,GAAI;IACA,SAAS,EAAE,eAAe;;;EAG9B;;IAEG;IACC,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;;;EAGb;IACG;IACC,gBAAgB,EAAE,KAAK;;;EAM3B,OAAQ;IACJ,OAAO,EAAE,IAAI;;;EAIb;yBAAS;IACL,gBAAgB,EAAE,eAAe;;;EAGzC,MAAO;IACH,MAAM,EAAE,cAAc;;;EAG1B,MAAO;IACH,eAAe,EAAE,mBAAmB;;EAEpC;WACG;IACC,gBAAgB,EAAE,eAAe;;;EAIrC;oBACG;IACC,MAAM,EAAE,yBAAyB;;;ACrF7C,CAAE;ECgEA,kBAAkB,ED/DE,UAAU;ECgE3B,eAAe,EDhEE,UAAU;ECiEtB,UAAU,EDjEE,UAAU;;;AAEhC;OACQ;EC4DN,kBAAkB,ED3DE,UAAU;EC4D3B,eAAe,ED5DE,UAAU;EC6DtB,UAAU,ED7DE,UAAU;;;AAMhC,IAAK;EACH,SAAS,EAAE,IAAI;EACf,2BAA2B,EAAE,WAAa;;;AAG5C,IAAK;EACH,WAAW,EEsBa,8CAAuB;EFrB/C,SAAS,EEuBe,IAAI;EFtB5B,WAAW,EEkCa,OAAW;EFjCnC,KAAK,EE6yBuB,OAAU;EF5yBtC,gBAAgB,EEgtBY,IAAQ;;;AF5sBtC;;;QAGS;EACP,WAAW,EAAE,OAAO;EACpB,SAAS,EAAE,OAAO;EAClB,WAAW,EAAE,OAAO;;;AAMtB,CAAE;EACA,KAAK,EE6tBuB,OAAW;EF5tBvC,eAAe,EAAE,IAAI;;AAErB,gBACQ;EACN,KAAK,EEqZ8B,OAAiB;EFpZpD,eAAe,EEhBK,SAAS;;AFmB/B,OAAQ;EGrDR,OAAO,EAAE,WAAW;EAEpB,OAAO,EAAE,iCAAiC;EAC1C,cAAc,EAAE,IAAI;;;AH6DtB,MAAO;EACL,MAAM,EAAE,CAAC;;;AAMX,GAAI;EACF,cAAc,EAAE,MAAM;;;AAIxB,eAAgB;EIvEd,OAAO,EADuB,KAAK;EAEnC,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;;;AJ0Ed,YAAa;EACX,aAAa,EEwBa,GAAG;;;AFlB/B,cAAe;EACb,OAAO,EEgpBqB,GAAG;EF/oB/B,WAAW,EE/Ba,OAAW;EFgCnC,gBAAgB,EEgpBY,IAAQ;EF/oBpC,MAAM,EAAE,cAA2B;EACnC,aAAa,EEkpBe,GAAmB;ED1jB/C,kBAAkB,EAAE,oBAAW;EAC1B,aAAa,EAAE,oBAAW;EACvB,UAAU,EAAE,oBAAW;EGlL/B,OAAO,EJ4FiB,YAAY;EI3FpC,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;;;AJ8Fd,WAAY;EACV,aAAa,EAAE,GAAG;;;AAMpB,EAAG;EACD,UAAU,EE4PuB,IAAqB;EF3PtD,aAAa,EE2PoB,IAAqB;EF1PtD,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,iBAAoB;;;AAQlC,QAAS;EACP,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,MAAM;EAChB,IAAI,EAAE,gBAAa;EACnB,MAAM,EAAE,CAAC;;;AAQT,mDACQ;EACN,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,OAAO;EACjB,IAAI,EAAE,IAAI;;;AAWd,eAAgB;EACd,MAAM,EAAE,OAAO;;;AKvJjB;4BAC6B;EAC3B,WAAW,EH0Da,OAAO;EGzD/B,WAAW,EH0Da,GAAG;EGzD3B,WAAW,EH0Da,GAAG;EGzD3B,KAAK,EH0DmB,OAAO;;AGxD/B;;;;;;;;;;;;;UACO;EACL,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,CAAC;EACd,KAAK,EH00BqB,OAAW;;;AGt0BzC;;OAEQ;EACN,UAAU,EHmVuB,IAAqB;EGlVtD,aAAa,EAAE,IAA2B;;AAE1C;;;;;;;;UACO;EACL,SAAS,EAAE,GAAG;;;AAGlB;;OAEQ;EACN,UAAU,EAAE,IAA2B;EACvC,aAAa,EAAE,IAA2B;;AAE1C;;;;;;;;UACO;EACL,SAAS,EAAE,GAAG;;;AAIlB,OAAQ;EAAE,SAAS,EHSO,IAA8B;;;AGRxD,OAAQ;EAAE,SAAS,EHSO,IAA+B;;;AGRzD,OAAQ;EAAE,SAAS,EHSO,IAA6B;;;AGRvD,OAAQ;EAAE,SAAS,EHSO,IAA8B;;;AGRxD,OAAQ;EAAE,SAAS,EHSO,IAAe;;;AGRzC,OAAQ;EAAE,SAAS,EHSO,IAA8B;;;AGHxD,CAAE;EACA,MAAM,EAAE,QAA+B;;;AAGzC,KAAM;EACJ,aAAa,EH+SoB,IAAqB;EG9StD,SAAS,EAAE,IAA+B;EAC1C,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,GAAG;;AAEhB,yBAAmC;EANrC,KAAM;IAOF,SAAS,EAAE,IAAuB;;;;AAStC;MACO;EACL,SAAS,EAAE,GAAkD;;;AAG/D;KACM;EACJ,gBAAgB,EH6oBY,OAAiB;EG5oB7C,OAAO,EAAE,IAAI;;;AAIf,UAAqB;EAAE,UAAU,EAAE,IAAI;;;AACvC,WAAqB;EAAE,UAAU,EAAE,KAAK;;;AACxC,YAAqB;EAAE,UAAU,EAAE,MAAM;;;AACzC,aAAqB;EAAE,UAAU,EAAE,OAAO;;;AAC1C,YAAqB;EAAE,WAAW,EAAE,MAAM;;;AAG1C,eAAqB;EAAE,cAAc,EAAE,SAAS;;;AAChD,4BAAqB;EAAE,cAAc,EAAE,SAAS;;;AAChD,gBAAqB;EAAE,cAAc,EAAE,UAAU;;;AAGjD,WAAY;EACV,KAAK,EHuvBuB,OAAW;;;AIz1BvC,aAAW;EACT,KAAK,EJwwBqB,OAAW;;;AItwBvC;oBACkB;EAChB,KAAK,EAAE,OAAmB;;;AAL5B,aAAW;EACT,KAAK,EJktBqB,OAAmB;;;AIhtB/C;oBACkB;EAChB,KAAK,EAAE,OAAmB;;;AAL5B,UAAW;EACT,KAAK,EJstBqB,OAAgB;;;AIptB5C;iBACkB;EAChB,KAAK,EAAE,OAAmB;;;AAL5B,aAAW;EACT,KAAK,EJ0tBqB,OAAmB;;;AIxtB/C;oBACkB;EAChB,KAAK,EAAE,OAAmB;;;AAL5B,YAAW;EACT,KAAK,EJ8tBqB,OAAkB;;;AI5tB9C;mBACkB;EAChB,KAAK,EAAE,OAAmB;;;AD6G9B,WAAY;EAGV,KAAK,EAAE,IAAI;;;AErHX,WAAW;EACT,gBAAgB,ELwwBU,OAAW;;;AKtwBvC;kBACkB;EAChB,gBAAgB,EAAE,OAAmB;;;AALvC,WAAW;EACT,gBAAgB,ELotBU,OAAiB;;;AKltB7C;kBACkB;EAChB,gBAAgB,EAAE,OAAmB;;;AALvC,QAAW;EACT,gBAAgB,ELwtBU,OAAc;;;AKttB1C;eACkB;EAChB,gBAAgB,EAAE,OAAmB;;;AALvC,WAAW;EACT,gBAAgB,EL4tBU,OAAiB;;;AK1tB7C;kBACkB;EAChB,gBAAgB,EAAE,OAAmB;;;AALvC,UAAW;EACT,gBAAgB,ELguBU,OAAgB;;;AK9tB5C;iBACkB;EAChB,gBAAgB,EAAE,OAAmB;;;AFgIzC,YAAa;EACX,cAAc,EAAE,GAAiC;EACjD,MAAM,EAAE,WAAmD;EAC3D,aAAa,EAAE,iBAAmC;;;AAQpD;EACG;EACD,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,IAA2B;;AAC1C;;;KACG;EACD,aAAa,EAAE,CAAC;;;AAYpB,cAAe;EAJb,YAAY,EAAE,CAAC;EACf,UAAU,EAAE,IAAI;;;AASlB,YAAa;EAVX,YAAY,EAAE,CAAC;EACf,UAAU,EAAE,IAAI;EAWhB,WAAW,EAAE,IAAI;;AAEjB,iBAAK;EACH,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,GAAG;EACjB,aAAa,EAAE,GAAG;;;AAKtB,EAAG;EACD,UAAU,EAAE,CAAC;EACb,aAAa,EHmLoB,IAAqB;;;AGjLxD;EACG;EACD,WAAW,EH/Ha,OAAW;;;AGiIrC,EAAG;EACD,WAAW,EAAE,IAAI;;;AAEnB,EAAG;EACD,WAAW,EAAE,CAAC;;;AGvLd,iDACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,uBAAQ;EACN,KAAK,EAAE,IAAI;;AH8Lb,yBAA2C;EACzC,iBAAG;IACD,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,KAA4B;IACnC,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,KAAK;IIlNrB,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,QAAQ;IACvB,WAAW,EAAE,MAAM;;EJmNjB,iBAAG;IACD,WAAW,EH2oBa,KAA4B;;;;AGjoB1D;yBAE0B;EACxB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,kBAA6B;;;AAE9C,WAAY;EACV,SAAS,EAAE,GAAG;;;AAKhB,UAAW;EACT,OAAO,EAAE,SAAiD;EAC1D,MAAM,EAAE,QAAyB;EACjC,SAAS,EH4mBoB,MAAsB;EG3mBnD,WAAW,EAAE,iBAAkC;;AAK7C;;wBAAa;EACX,aAAa,EAAE,CAAC;;AAMpB;;iBAEO;EACL,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,GAAG;EACd,WAAW,EHtMW,OAAW;EGuMjC,KAAK,EHulBqB,OAAW;;AGrlBrC;;wBAAS;EACP,OAAO,EAAE,aAAa;;;AAQ5B;qBACsB;EACpB,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,CAAC;EACf,YAAY,EAAE,iBAAkC;EAChD,WAAW,EAAE,CAAC;EACd,UAAU,EAAE,KAAK;;AAMf;;;;;mCAAS;EAAE,OAAO,EAAE,EAAE;;AACtB;;;;;kCAAQ;EACN,OAAO,EAAE,aAAa;;;AAM5B,OAAQ;EACN,aAAa,EHuEoB,IAAqB;EGtEtD,UAAU,EAAE,MAAM;EAClB,WAAW,EHzOa,OAAW;;;AQzDrC;;;IAGK;EACH,WAAW,ERsCa,iDAAiD;;;AQlC3E,IAAK;EACH,OAAO,EAAE,OAAO;EAChB,SAAS,EAAE,GAAG;EACd,KAAK,ERmzBuB,OAAO;EQlzBnC,gBAAgB,ERmzBY,OAAO;EQlzBnC,aAAa,ER0Fa,GAAG;;;AQtF/B,GAAI;EACF,OAAO,EAAE,OAAO;EAChB,SAAS,EAAE,GAAG;EACd,KAAK,ER6yBuB,IAAI;EQ5yBhC,gBAAgB,ER6yBY,IAAI;EQ5yBhC,aAAa,ERmFa,GAAG;EQlF7B,UAAU,EAAE,kCAA8B;;AAE1C,OAAI;EACF,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,IAAI;;;AAKpB,GAAI;EACF,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,KAAiC;EAC1C,MAAM,EAAE,QAA+B;EACvC,SAAS,EAAE,IAAqB;EAChC,WAAW,ERkBa,OAAW;EQjBnC,UAAU,EAAE,SAAS;EACrB,SAAS,EAAE,UAAU;EACrB,KAAK,ER2xBuB,OAAU;EQ1xBtC,gBAAgB,ERyxBY,OAAO;EQxxBnC,MAAM,EAAE,cAA2B;EACnC,aAAa,ER0Da,GAAG;;AQvD7B,QAAK;EACH,OAAO,EAAE,CAAC;EACV,SAAS,EAAE,OAAO;EAClB,KAAK,EAAE,OAAO;EACd,WAAW,EAAE,QAAQ;EACrB,gBAAgB,EAAE,WAAW;EAC7B,aAAa,EAAE,CAAC;;;AAKpB,eAAgB;EACd,UAAU,ER2wBkB,KAAK;EQ1wBjC,UAAU,EAAE,MAAM;;;AC1DpB,UAAW;ECHT,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;EACjB,YAAY,EAAG,IAAa;EAC5B,aAAa,EAAE,IAAa;;AJI5B,mCACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,gBAAQ;EACN,KAAK,EAAE,IAAI;;AGPb,yBAAmC;EAHrC,UAAW;IAIP,KAAK,ET6UsB,KAAiB;;;AS3U9C,yBAAmC;EANrC,UAAW;IAOP,KAAK,ET+UsB,KAAkB;;;AS7U/C,0BAAmC;EATrC,UAAW;IAUP,KAAK,ETiVsB,MAAwB;;;;ASvUvD,gBAAiB;ECvBf,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;EACjB,YAAY,EAAG,IAAa;EAC5B,aAAa,EAAE,IAAa;;AJI5B,+CACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,sBAAQ;EACN,KAAK,EAAE,IAAI;;;AGmBf,IAAK;ECvBH,WAAW,EAAG,KAAoB;EAClC,YAAY,EAAE,KAAqB;;AJHnC,uBACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,UAAQ;EACN,KAAK,EAAE,IAAI;;;AKTb,0hBAAS;EACP,QAAQ,EAAE,QAAQ;EAElB,UAAU,EAAE,GAAG;EAEf,YAAY,EAAG,IAA8B;EAC7C,aAAa,EAAE,IAA+B;;;AAUhD,qIAAS;EACP,KAAK,EAAE,IAAI;;;AAOX,SAAyB;EACvB,KAAK,EAAE,QAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,GAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,GAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,SAAyB;EACvB,KAAK,EAAE,GAAoC;;;AAD7C,UAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,UAAyB;EACvB,KAAK,EAAE,SAAoC;;;AAD7C,UAAyB;EACvB,KAAK,EAAE,IAAoC;;;AAmB7C,cAAsB;EACpB,KAAK,EAAE,IAAI;;;AANb,cAA8B;EAC5B,KAAK,EAAE,QAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,GAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,GAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,cAA8B;EAC5B,KAAK,EAAE,GAAoC;;;AAD7C,eAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,eAA8B;EAC5B,KAAK,EAAE,SAAoC;;;AAD7C,eAA8B;EAC5B,KAAK,EAAE,IAAoC;;;AAN7C,cAAsB;EACpB,IAAI,EAAE,IAAI;;;AANZ,cAA8B;EAC5B,IAAI,EAAE,QAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,GAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,GAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,cAA8B;EAC5B,IAAI,EAAE,GAAoC;;;AAD5C,eAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,eAA8B;EAC5B,IAAI,EAAE,SAAoC;;;AAD5C,eAA8B;EAC5B,IAAI,EAAE,IAAoC;;;AAmB5C,gBAAgC;EAC9B,WAAW,EAAE,EAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,QAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,GAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,GAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,gBAAgC;EAC9B,WAAW,EAAE,GAAoC;;;AADnD,iBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,iBAAgC;EAC9B,WAAW,EAAE,SAAoC;;;AADnD,iBAAgC;EAC9B,WAAW,EAAE,IAAoC;;;AFGvD,yBAAmC;EErCjC,qIAAS;IACP,KAAK,EAAE,IAAI;;;EAOX,SAAyB;IACvB,KAAK,EAAE,QAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,IAAoC;;;EAmB7C,cAAsB;IACpB,KAAK,EAAE,IAAI;;;EANb,cAA8B;IAC5B,KAAK,EAAE,QAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,IAAoC;;;EAN7C,cAAsB;IACpB,IAAI,EAAE,IAAI;;;EANZ,cAA8B;IAC5B,IAAI,EAAE,QAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,IAAoC;;;EAmB5C,gBAAgC;IAC9B,WAAW,EAAE,EAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,QAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,IAAoC;;;AFYvD,yBAAmC;EE9CjC,qIAAS;IACP,KAAK,EAAE,IAAI;;;EAOX,SAAyB;IACvB,KAAK,EAAE,QAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,IAAoC;;;EAmB7C,cAAsB;IACpB,KAAK,EAAE,IAAI;;;EANb,cAA8B;IAC5B,KAAK,EAAE,QAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,IAAoC;;;EAN7C,cAAsB;IACpB,IAAI,EAAE,IAAI;;;EANZ,cAA8B;IAC5B,IAAI,EAAE,QAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,IAAoC;;;EAmB5C,gBAAgC;IAC9B,WAAW,EAAE,EAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,QAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,IAAoC;;;AFqBvD,0BAAmC;EEvDjC,qIAAS;IACP,KAAK,EAAE,IAAI;;;EAOX,SAAyB;IACvB,KAAK,EAAE,QAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,SAAyB;IACvB,KAAK,EAAE,GAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,SAAoC;;;EAD7C,UAAyB;IACvB,KAAK,EAAE,IAAoC;;;EAmB7C,cAAsB;IACpB,KAAK,EAAE,IAAI;;;EANb,cAA8B;IAC5B,KAAK,EAAE,QAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,cAA8B;IAC5B,KAAK,EAAE,GAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,SAAoC;;;EAD7C,eAA8B;IAC5B,KAAK,EAAE,IAAoC;;;EAN7C,cAAsB;IACpB,IAAI,EAAE,IAAI;;;EANZ,cAA8B;IAC5B,IAAI,EAAE,QAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,cAA8B;IAC5B,IAAI,EAAE,GAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,SAAoC;;;EAD5C,eAA8B;IAC5B,IAAI,EAAE,IAAoC;;;EAmB5C,gBAAgC;IAC9B,WAAW,EAAE,EAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,QAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,gBAAgC;IAC9B,WAAW,EAAE,GAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,SAAoC;;;EADnD,iBAAgC;IAC9B,WAAW,EAAE,IAAoC;;;ACvDvD,KAAM;EACJ,gBAAgB,EZgIc,WAAW;;;AY9H3C,OAAQ;EACN,WAAW,EZwHmB,GAAG;EYvHjC,cAAc,EZuHgB,GAAG;EYtHjC,KAAK,EZk1BuB,OAAW;EYj1BvC,UAAU,EAAE,IAAI;;;AAElB,EAAG;EACD,UAAU,EAAE,IAAI;;;AAMlB,MAAO;EACL,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,IAAI;EACf,aAAa,EZqVoB,IAAqB;;AY/UlD;;;;;wBACK;EACH,OAAO,EZiGiB,GAAG;EYhG3B,WAAW,EZ8BO,OAAW;EY7B7B,cAAc,EAAE,GAAG;EACnB,UAAU,EAAE,cAA6B;;AAK/C,wBAAkB;EAChB,cAAc,EAAE,MAAM;EACtB,aAAa,EAAE,cAA6B;;AAO1C;;;;;gDACK;EACH,UAAU,EAAE,CAAC;;AAKnB,sBAAgB;EACd,UAAU,EAAE,cAA6B;;AAI3C,aAAO;EACL,gBAAgB,EZirBU,IAAQ;;;AYrqBhC;;;;;kCACK;EACH,OAAO,EZuDiB,GAAG;;;AY5CnC,eAAgB;EACd,MAAM,EAAE,cAA6B;;AAKjC;;;;;iCACK;EACH,MAAM,EAAE,cAA6B;;AAKzC;iCACK;EACH,mBAAmB,EAAE,GAAG;;;AAW5B,4CAA8B;EAC5B,gBAAgB,EZsBY,OAAO;;;AYZrC,+BAAmB;EACjB,gBAAgB,EZcY,OAAe;;;AYL/C,wBAAyB;EACvB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,YAAY;;;AAKnB;uBAAiB;EACf,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,UAAU;;;ACzIrB;;;;;;;;;+BAGiB;EACf,gBAAgB,Eb+HU,OAAe;;;AaxH3C;gLAIuB;EACrB,gBAAgB,EAAE,OAAuB;;;AAhB3C;;;;;;;;;gCAGiB;EACf,gBAAgB,Eb6sBQ,OAAiB;;;AatsB3C;oLAIuB;EACrB,gBAAgB,EAAE,OAAuB;;;AAhB3C;;;;;;;;;6BAGiB;EACf,gBAAgB,EbitBQ,OAAc;;;Aa1sBxC;wKAIuB;EACrB,gBAAgB,EAAE,OAAuB;;;AAhB3C;;;;;;;;;gCAGiB;EACf,gBAAgB,EbqtBQ,OAAiB;;;Aa9sB3C;oLAIuB;EACrB,gBAAgB,EAAE,OAAuB;;;AAhB3C;;;;;;;;;+BAGiB;EACf,gBAAgB,EbytBQ,OAAgB;;;AaltB1C;gLAIuB;EACrB,gBAAgB,EAAE,OAAuB;;;ADkJ/C,iBAAkB;EAChB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,KAAK;;AAEjB,oCAA8C;EAJhD,iBAAkB;IAKd,KAAK,EAAE,IAAI;IACX,aAAa,EAAE,IAA8B;IAC7C,UAAU,EAAE,MAAM;IAClB,kBAAkB,EAAE,wBAAwB;IAC5C,MAAM,EAAE,cAA6B;;EAGrC,0BAAS;IACP,aAAa,EAAE,CAAC;;EAOZ;;;;;8CACK;IACH,WAAW,EAAE,MAAM;;EAO3B,mCAAkB;IAChB,MAAM,EAAE,CAAC;;EAOL;;;;;mEACiB;IACf,WAAW,EAAE,CAAC;;EAEhB;;;;;kEACgB;IACd,YAAY,EAAE,CAAC;;EAWjB;;;kEACK;IACH,aAAa,EAAE,CAAC;;;;AEzN5B,QAAS;EACP,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,CAAC;EAIT,SAAS,EAAE,CAAC;;;AAGd,MAAO;EACL,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,CAAC;EACV,aAAa,EdsVoB,IAAqB;EcrVtD,SAAS,EAAE,IAAuB;EAClC,WAAW,EAAE,OAAO;EACpB,KAAK,EdizBuB,OAAU;EchzBtC,MAAM,EAAE,CAAC;EACT,aAAa,EAAE,iBAA8B;;;AAG/C,KAAM;EACJ,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,IAAI;;;AAWnB,oBAAqB;Ef4BnB,kBAAkB,Ee3BE,UAAU;Ef4B3B,eAAe,Ee5BE,UAAU;Ef6BtB,UAAU,Ee7BE,UAAU;;;AAIhC;sBACuB;EACrB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;;;AAGrB,kBAAmB;EACjB,OAAO,EAAE,KAAK;;;AAIhB,mBAAoB;EAClB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;;;AAIb;YACa;EACX,MAAM,EAAE,IAAI;;;AAId;;4BAE6B;EbzE3B,OAAO,EAAE,WAAW;EAEpB,OAAO,EAAE,iCAAiC;EAC1C,cAAc,EAAE,IAAI;;;Aa2EtB,MAAO;EACL,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,IAA4B;EACzC,SAAS,EdlCe,IAAI;EcmC5B,WAAW,EdvBa,OAAW;EcwBnC,KAAK,Ed+VqC,OAAK;;;AcrUjD,aAAc;EACZ,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EdiG0B,IAAwD;EchGxF,OAAO,EAAE,SAA+C;EACxD,SAAS,EdnEe,IAAI;EcoE5B,WAAW,EdxDa,OAAW;EcyDnC,KAAK,Ed8TqC,OAAK;Ec7T/C,gBAAgB,EdmEe,IAAI;EclEnC,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,cAAuB;EAC/B,aAAa,Ed4EkB,GAAmB;EDpIlD,kBAAkB,EAAE,oCAAO;EACnB,UAAU,EAAE,oCAAO;EAoH3B,kBAAkB,EAAE,4DAAW;EAC1B,aAAa,EAAE,4DAAW;EACvB,UAAU,EAAE,4DAAW;;AgBnI/B,mBAAQ;EACN,YAAY,EfsJiB,OAAO;EerJpC,OAAO,EAAE,CAAC;EhBUZ,kBAAkB,EAAE,sEAAO;EACnB,UAAU,EAAE,sEAAO;;AAiC3B,+BAAoB;EAClB,KAAK,EC2GwB,IAAI;ED1GjC,OAAO,EAAE,CAAC;;AAEZ,mCAAwB;EAAE,KAAK,ECwGA,IAAI;;ADvGnC,wCAA8B;EAAE,KAAK,ECuGN,IAAI;;AcvEnC,kFAEqB;EACnB,gBAAgB,EdytBU,OAAa;EcxtBvC,OAAO,EAAE,CAAC;;AAGZ,yDACqB;EACnB,MAAM,EdmFuB,WAAW;;;Ac5E5C,qBAAsB;EACpB,MAAM,EAAE,IAAI;;;AAWd,oBAAqB;EACnB,kBAAkB,EAAE,IAAI;;;AAa1B,qDAAsD;EAKlD;;;kCAAe;IACb,WAAW,Ed0BiB,IAAwD;;EcvBtF;;;;;;;;;;;;;;;;;qBACkB;IAChB,WAAW,EdyBiB,IAAgF;;EctB9G;;;;;;;;;;;;;;;;;qBACkB;IAChB,WAAW,EdkBiB,IAA+E;;;AcPjH,WAAY;EACV,aAAa,EdWkB,IAAI;;;AcHrC;SACU;EACR,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;;AAEnB;eAAM;EACJ,UAAU,Ed4IqB,IAAqB;Ec3IpD,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,CAAC;EAChB,WAAW,EAAE,MAAM;EACnB,MAAM,EAAE,OAAO;;;AAGnB;;;uCAGwC;EACtC,QAAQ,EAAE,QAAQ;EAClB,WAAW,EAAE,KAAK;EAClB,UAAU,EAAE,MAAM;;;AAGpB;qBACsB;EACpB,UAAU,EAAE,IAAI;;;AAIlB;gBACiB;EACf,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,CAAC;EAChB,cAAc,EAAE,MAAM;EACtB,WAAW,EAAE,MAAM;EACnB,MAAM,EAAE,OAAO;;;AAEjB;mCACoC;EAClC,UAAU,EAAE,CAAC;EACb,WAAW,EAAE,IAAI;;;AASjB;;;sBAEqB;EACnB,MAAM,EdzCuB,WAAW;;;Ac+C1C;;gBACqB;EACnB,MAAM,EdjDuB,WAAW;;;AcyDxC;;eAAM;EACJ,MAAM,Ed1DqB,WAAW;;;AcqE5C,oBAAqB;EAEnB,WAAW,EAAE,IAA4B;EACzC,cAAc,EAAE,IAA4B;EAE5C,aAAa,EAAE,CAAC;EAChB,UAAU,EAAE,IAAyC;;AAErD;;;;6DACW;EACT,YAAY,EAAE,CAAC;EACf,aAAa,EAAE,CAAC;;;ACjPlB;;yCAAW;EACT,MAAM,EfkJwB,IAAgF;EejJ9G,OAAO,EAAE,QAAqC;EAC9C,SAAS,EfpBa,IAA8B;EeqBpD,WAAW,EfiCa,GAAG;EehC3B,aAAa,EfiIgB,GAAoB;;;Ae9HnD;;+CAAiB;EACf,MAAM,Ef0IwB,IAAgF;EezI9G,WAAW,EfyImB,IAAgF;;;AetIhH;;;;;;yDAC2B;EACzB,MAAM,EAAE,IAAI;;;ADiPd,4BAAc;EACZ,MAAM,Ed9GwB,IAAgF;Ec+G9G,OAAO,EAAE,QAAiD;EAC1D,SAAS,EdpRa,IAA8B;EcqRpD,WAAW,Ed/Na,GAAG;EcgO3B,aAAa,Ed/HgB,GAAoB;;AciInD,kCAAoB;EAClB,MAAM,EdrHwB,IAAgF;EcsH9G,WAAW,EdtHmB,IAAgF;;AcwHhH;4CAC8B;EAC5B,MAAM,EAAE,IAAI;;AAEd,mCAAqB;EACnB,MAAM,Ed7HwB,IAAgF;Ec8H9G,UAAU,EAAE,IAA0C;EACtD,OAAO,EAAE,QAAuD;EAChE,SAAS,EdpSa,IAA8B;EcqSpD,WAAW,Ed/Oa,GAAG;;;AerC7B;;yCAAW;EACT,MAAM,EfgJwB,IAA+E;Ee/I7G,OAAO,EAAE,SAAqC;EAC9C,SAAS,EfrBa,IAA8B;EesBpD,WAAW,EfgCa,OAAS;Ee/BjC,aAAa,Ef+HgB,GAAoB;;;Ae5HnD;;+CAAiB;EACf,MAAM,EfwIwB,IAA+E;EevI7G,WAAW,EfuImB,IAA+E;;;AepI/G;;;;;;yDAC2B;EACzB,MAAM,EAAE,IAAI;;;AD2Qd,4BAAc;EACZ,MAAM,Ed1IwB,IAA+E;Ec2I7G,OAAO,EAAE,SAAiD;EAC1D,SAAS,Ed/Sa,IAA8B;EcgTpD,WAAW,Ed1Pa,OAAS;Ec2PjC,aAAa,Ed3JgB,GAAoB;;Ac6JnD,kCAAoB;EAClB,MAAM,EdjJwB,IAA+E;EckJ7G,WAAW,EdlJmB,IAA+E;;AcoJ/G;4CAC8B;EAC5B,MAAM,EAAE,IAAI;;AAEd,mCAAqB;EACnB,MAAM,EdzJwB,IAA+E;Ec0J7G,UAAU,EAAE,IAA0C;EACtD,OAAO,EAAE,SAAuD;EAChE,SAAS,Ed/Ta,IAA8B;EcgUpD,WAAW,Ed1Qa,OAAS;;;AcmRrC,aAAc;EAEZ,QAAQ,EAAE,QAAQ;;AAGlB,2BAAc;EACZ,aAAa,EAAE,MAA2B;;;AAI9C,sBAAuB;EACrB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,KAAK;EACd,KAAK,EdxL2B,IAAwD;EcyLxF,MAAM,EdzL0B,IAAwD;Ec0LxF,WAAW,Ed1LqB,IAAwD;Ec2LxF,UAAU,EAAE,MAAM;EAClB,cAAc,EAAE,IAAI;;;AAEtB;;;;qDAEsD;EACpD,KAAK,Ed/L2B,IAA+E;EcgM/G,MAAM,EdhM0B,IAA+E;EciM/G,WAAW,EdjMqB,IAA+E;;;AcmMjH;;;;qDAEsD;EACpD,KAAK,EdpM2B,IAAgF;EcqMhH,MAAM,EdrM0B,IAAgF;EcsMhH,WAAW,EdtMqB,IAAgF;;;AelNhH;;;;;yJASyB;EACvB,KAAK,EfssBqB,OAAmB;;AensB/C,0BAAc;EACZ,YAAY,EfksBc,OAAmB;EDnpB/C,kBAAkB,EAAE,oCAAO;EACnB,UAAU,EAAE,oCAAO;;AgB9CzB,gCAAQ;EACN,YAAY,EAAE,OAA0B;EhB4C5C,kBAAkB,EAAE,qDAAO;EACnB,UAAU,EAAE,qDAAO;;AgBvC3B,+BAAmB;EACjB,KAAK,EfwrBqB,OAAmB;EevrB7C,YAAY,EfurBc,OAAmB;EetrB7C,gBAAgB,EfwrBU,OAAiB;;AerrB7C,mCAAuB;EACrB,KAAK,EfkrBqB,OAAmB;;;AehtB/C;;;;;yJASyB;EACvB,KAAK,Ef8sBqB,OAAmB;;Ae3sB/C,0BAAc;EACZ,YAAY,Ef0sBc,OAAmB;ED3pB/C,kBAAkB,EAAE,oCAAO;EACnB,UAAU,EAAE,oCAAO;;AgB9CzB,gCAAQ;EACN,YAAY,EAAE,OAA0B;EhB4C5C,kBAAkB,EAAE,qDAAO;EACnB,UAAU,EAAE,qDAAO;;AgBvC3B,+BAAmB;EACjB,KAAK,EfgsBqB,OAAmB;Ee/rB7C,YAAY,Ef+rBc,OAAmB;Ee9rB7C,gBAAgB,EfgsBU,OAAiB;;Ae7rB7C,mCAAuB;EACrB,KAAK,Ef0rBqB,OAAmB;;;AextB/C;;;;;+IASyB;EACvB,KAAK,EfktBqB,OAAkB;;Ae/sB9C,wBAAc;EACZ,YAAY,Ef8sBc,OAAkB;ED/pB9C,kBAAkB,EAAE,oCAAO;EACnB,UAAU,EAAE,oCAAO;;AgB9CzB,8BAAQ;EACN,YAAY,EAAE,OAA0B;EhB4C5C,kBAAkB,EAAE,qDAAO;EACnB,UAAU,EAAE,qDAAO;;AgBvC3B,6BAAmB;EACjB,KAAK,EfosBqB,OAAkB;EensB5C,YAAY,EfmsBc,OAAkB;EelsB5C,gBAAgB,EfosBU,OAAgB;;AejsB5C,iCAAuB;EACrB,KAAK,Ef8rBqB,OAAkB;;;AcnT9C,4CAA2B;EACxB,GAAG,EAAE,IAA2B;;AAEnC,oDAAmC;EAChC,GAAG,EAAE,CAAC;;;AAUX,WAAY;EACV,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,IAAI;EACnB,KAAK,EAAE,OAAyB;;;AAmBhC,yBAAmC;EAEjC,wBAAY;IACV,OAAO,EAAE,YAAY;IACrB,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM;;EAIxB,0BAAc;IACZ,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,IAAI;IACX,cAAc,EAAE,MAAM;;EAIxB,iCAAqB;IACnB,OAAO,EAAE,YAAY;;EAGvB,yBAAa;IACX,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM;;EAEtB;;yCAEc;IACZ,KAAK,EAAE,IAAI;;EAKf,yCAA6B;IAC3B,KAAK,EAAE,IAAI;;EAGb,2BAAe;IACb,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM;;EAKxB;wBACU;IACR,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM;;EAEtB;8BAAM;IACJ,YAAY,EAAE,CAAC;;EAGnB;+CACiC;IAC/B,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,CAAC;;EAIhB,iDAAqC;IACnC,GAAG,EAAE,CAAC;;;;AAqBV;;;iCAGiB;EACf,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,CAAC;EAChB,WAAW,EAAE,IAA4B;;AAI3C;0BACU;EACR,UAAU,EAAE,IAAsD;;AAIpE,4BAAY;EJziBZ,WAAW,EAAG,KAAoB;EAClC,YAAY,EAAE,KAAqB;;AJHnC,uEACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,kCAAQ;EACN,KAAK,EAAE,IAAI;;AQ2iBb,yBAAmC;EACjC,+BAAe;IACb,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,IAA4B;;;AAQ7C,qDAAqC;EACnC,KAAK,EAAE,IAA+B;;AAQtC,yBAAmC;EACjC,8CAAe;IACb,WAAW,EAAE,UAAoD;IACjE,SAAS,EdliBS,IAA8B;;;AcuiBpD,yBAAmC;EACjC,8CAAe;IACb,WAAW,EAAE,GAA6B;IAC1C,SAAS,EdziBS,IAA8B;;;;AgB7CxD,IAAK;EACH,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,CAAC;EAChB,WAAW,EhB0IoB,MAAM;EgBzIrC,UAAU,EAAE,MAAM;EAClB,cAAc,EAAE,MAAM;EACtB,YAAY,EAAE,YAAY;EAC1B,MAAM,EAAE,OAAO;EACf,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,qBAAqB;EAC7B,WAAW,EAAE,MAAM;EC6CnB,OAAO,EAAE,SAAqC;EAC9C,SAAS,EjBbe,IAAI;EiBc5B,WAAW,EjBFa,OAAW;EiBGnC,aAAa,EjBgHkB,GAAmB;EDuClD,mBAAmB,EiBrME,IAAI;EjBsMtB,gBAAgB,EiBtME,IAAI;EjBuMrB,eAAe,EiBvME,IAAI;EjBwMjB,WAAW,EiBxME,IAAI;;AAKvB,kGACQ;EftBV,OAAO,EAAE,WAAW;EAEpB,OAAO,EAAE,iCAAiC;EAC1C,cAAc,EAAE,IAAI;;AewBpB,kCAEQ;EACN,KAAK,EhBqHwB,IAAI;EgBpHjC,eAAe,EAAE,IAAI;;AAGvB,wBACS;EACP,OAAO,EAAE,CAAC;EACV,gBAAgB,EAAE,IAAI;EjB2BxB,kBAAkB,EAAE,oCAAO;EACnB,UAAU,EAAE,oCAAO;;AiBxB3B,sDAEqB;EACnB,MAAM,EhBuLuB,WAAW;EkBpO1C,OAAO,EF8CY,IAAG;EE3CtB,MAAM,EAAE,iBAA0B;EnB8DlC,kBAAkB,EAAE,IAAO;EACnB,UAAU,EAAE,IAAO;;;AiBZ3B,wCACqB;EACnB,cAAc,EAAE,IAAI;;;AAQxB,YAAa;EC7DX,KAAK,EjBiJ0B,IAAI;EiBhJnC,gBAAgB,EjBiJe,IAAI;EiBhJnC,YAAY,EjBiJmB,IAAI;;AiB/InC,sCACQ;EACN,KAAK,EjB2IwB,IAAI;EiB1IjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,kBAAQ;EACN,KAAK,EjBsIwB,IAAI;EiBrIjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,8EAE0B;EACxB,KAAK,EjB+HwB,IAAI;EiB9HjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAEtC,oSAEQ;EACN,KAAK,EjBwHsB,IAAI;EiBvH/B,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAG1C,8EAE0B;EACxB,gBAAgB,EAAE,IAAI;;AAKtB,8jBAKS;EACP,gBAAgB,EjBsGW,IAAI;EiBrG3B,YAAY,EjBsGW,IAAI;;AiBlGnC,mBAAO;EACL,KAAK,EjBgGwB,IAAI;EiB/FjC,gBAAgB,EjB8Fa,IAAI;;;AgBjFrC,YAAa;EChEX,KAAK,EjBqJ0B,IAAI;EiBpJnC,gBAAgB,EjBswBY,OAAW;EiBrwBvC,YAAY,EjBqJmB,OAA2B;;AiBnJ1D,sCACQ;EACN,KAAK,EjB+IwB,IAAI;EiB9IjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,kBAAQ;EACN,KAAK,EjB0IwB,IAAI;EiBzIjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,8EAE0B;EACxB,KAAK,EjBmIwB,IAAI;EiBlIjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAEtC,oSAEQ;EACN,KAAK,EjB4HsB,IAAI;EiB3H/B,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAG1C,8EAE0B;EACxB,gBAAgB,EAAE,IAAI;;AAKtB,8jBAKS;EACP,gBAAgB,EjB2tBQ,OAAW;EiB1tB/B,YAAY,EjB0GW,OAA2B;;AiBtG1D,mBAAO;EACL,KAAK,EjBqtBqB,OAAW;EiBptBrC,gBAAgB,EjBkGa,IAAI;;;AgBjFrC,YAAa;ECpEX,KAAK,EjByJ0B,IAAI;EiBxJnC,gBAAgB,EjB+oBY,OAAc;EiB9oB1C,YAAY,EjByJmB,OAA2B;;AiBvJ1D,sCACQ;EACN,KAAK,EjBmJwB,IAAI;EiBlJjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,kBAAQ;EACN,KAAK,EjB8IwB,IAAI;EiB7IjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,8EAE0B;EACxB,KAAK,EjBuIwB,IAAI;EiBtIjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAEtC,oSAEQ;EACN,KAAK,EjBgIsB,IAAI;EiB/H/B,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAG1C,8EAE0B;EACxB,gBAAgB,EAAE,IAAI;;AAKtB,8jBAKS;EACP,gBAAgB,EjBomBQ,OAAc;EiBnmBlC,YAAY,EjB8GW,OAA2B;;AiB1G1D,mBAAO;EACL,KAAK,EjB8lBqB,OAAc;EiB7lBxC,gBAAgB,EjBsGa,IAAI;;;AgBjFrC,SAAU;ECxER,KAAK,EjB6J0B,IAAI;EiB5JnC,gBAAgB,EjBqpBY,OAAW;EiBppBvC,YAAY,EjB6JmB,OAAwB;;AiB3JvD,gCACQ;EACN,KAAK,EjBuJwB,IAAI;EiBtJjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,eAAQ;EACN,KAAK,EjBkJwB,IAAI;EiBjJjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,qEAE0B;EACxB,KAAK,EjB2IwB,IAAI;EiB1IjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAEtC,yQAEQ;EACN,KAAK,EjBoIsB,IAAI;EiBnI/B,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAG1C,qEAE0B;EACxB,gBAAgB,EAAE,IAAI;;AAKtB,wgBAKS;EACP,gBAAgB,EjB0mBQ,OAAW;EiBzmB/B,YAAY,EjBkHW,OAAwB;;AiB9GvD,gBAAO;EACL,KAAK,EjBomBqB,OAAW;EiBnmBrC,gBAAgB,EjB0Ga,IAAI;;;AgBjFrC,YAAa;EC5EX,KAAK,EjBiK0B,IAAI;EiBhKnC,gBAAgB,EjBipBY,OAAc;EiBhpB1C,YAAY,EjBiKmB,OAA2B;;AiB/J1D,sCACQ;EACN,KAAK,EjB2JwB,IAAI;EiB1JjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,kBAAQ;EACN,KAAK,EjBsJwB,IAAI;EiBrJjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,8EAE0B;EACxB,KAAK,EjB+IwB,IAAI;EiB9IjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAEtC,oSAEQ;EACN,KAAK,EjBwIsB,IAAI;EiBvI/B,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAG1C,8EAE0B;EACxB,gBAAgB,EAAE,IAAI;;AAKtB,8jBAKS;EACP,gBAAgB,EjBsmBQ,OAAc;EiBrmBlC,YAAY,EjBsHW,OAA2B;;AiBlH1D,mBAAO;EACL,KAAK,EjBgmBqB,OAAc;EiB/lBxC,gBAAgB,EjB8Ga,IAAI;;;AgBjFrC,WAAY;EChFV,KAAK,EjBqK0B,IAAI;EiBpKnC,gBAAgB,EjBmpBY,OAAa;EiBlpBzC,YAAY,EjBqKmB,OAA0B;;AiBnKzD,oCACQ;EACN,KAAK,EjB+JwB,IAAI;EiB9JjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,iBAAQ;EACN,KAAK,EjB0JwB,IAAI;EiBzJjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAExC,2EAE0B;EACxB,KAAK,EjBmJwB,IAAI;EiBlJjC,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAEtC,2RAEQ;EACN,KAAK,EjB4IsB,IAAI;EiB3I/B,gBAAgB,EAAE,OAAwB;EACtC,YAAY,EAAE,OAAoB;;AAG1C,2EAE0B;EACxB,gBAAgB,EAAE,IAAI;;AAKtB,4iBAKS;EACP,gBAAgB,EjBwmBQ,OAAa;EiBvmBjC,YAAY,EjB0HW,OAA0B;;AiBtHzD,kBAAO;EACL,KAAK,EjBkmBqB,OAAa;EiBjmBvC,gBAAgB,EjBkHa,IAAI;;;AgB5ErC,SAAU;EACR,KAAK,EhB6qBuB,OAAW;EgB5qBvC,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,CAAC;;AAEhB,gGAIqB;EACnB,gBAAgB,EAAE,WAAW;EjBrC/B,kBAAkB,EAAE,IAAO;EACnB,UAAU,EAAE,IAAO;;AiBuC3B,6DAGS;EACP,YAAY,EAAE,WAAW;;AAE3B,gCACQ;EACN,KAAK,EhBsV8B,OAAiB;EgBrVpD,eAAe,EhB/EK,SAAS;EgBgF7B,gBAAgB,EAAE,WAAW;;AAI7B,4HACQ;EACN,KAAK,EhBiuBmB,OAAW;EgBhuBnC,eAAe,EAAE,IAAI;;;AAS3B,6BAAQ;ECvEN,OAAO,EAAE,SAAqC;EAC9C,SAAS,EjBZe,IAA8B;EiBatD,WAAW,EjByCe,OAAS;EiBxCnC,aAAa,EjBiHkB,GAAoB;;;AgBzCrD,6BAAQ;EC3EN,OAAO,EAAE,QAAqC;EAC9C,SAAS,EjBXe,IAA8B;EiBYtD,WAAW,EjB0Ce,GAAG;EiBzC7B,aAAa,EjBkHkB,GAAoB;;;AgBtCrD,6BAAQ;EC/EN,OAAO,EAAE,OAAqC;EAC9C,SAAS,EjBXe,IAA8B;EiBYtD,WAAW,EjB0Ce,GAAG;EiBzC7B,aAAa,EjBkHkB,GAAoB;;;AgB9BrD,UAAW;EACT,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;;;AAIb,uBAAwB;EACtB,UAAU,EAAE,GAAG;;;AAOf;;8BAAY;EACV,KAAK,EAAE,IAAI;;;AG5Jf,KAAM;EACJ,OAAO,EAAE,CAAC;EpB+KV,kBAAkB,EAAE,oBAAW;EAC1B,aAAa,EAAE,oBAAW;EACvB,UAAU,EAAE,oBAAW;;AoB/K/B,QAAK;EACH,OAAO,EAAE,CAAC;;;AAId,SAAU;EACR,OAAO,EAAE,IAAI;;AAEb,YAAU;EAAE,OAAO,EAAE,KAAK;;;AAK5B,cAAkB;EAAE,OAAO,EAAE,SAAS;;;AAEtC,iBAAkB;EAAE,OAAO,EAAE,eAAe;;;AAE5C,WAAY;EACV,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,MAAM;EpB8JhB,2BAA2B,EAAE,kBAAoB;EACzC,mBAAmB,EAAE,kBAAoB;EAOjD,2BAA2B,EAAE,KAAoB;EACzC,mBAAmB,EAAE,KAAoB;EAGjD,kCAAkC,EoBvKE,IAAI;EpBwKhC,0BAA0B,EoBxKE,IAAI;;;AC7B1C,MAAO;EACL,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,MAAM;EACtB,UAAU,EAAI,UAAwB;EACtC,UAAU,EAAI,YAA0B;EACxC,YAAY,EAAE,qBAAmC;EACjD,WAAW,EAAG,qBAAmC;;;AAInD;SACU;EACR,QAAQ,EAAE,QAAQ;;;AAIpB,sBAAuB;EACrB,OAAO,EAAE,CAAC;;;AAIZ,cAAe;EACb,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,CAAC;EACP,OAAO,EpBmPkB,IAAI;EoBlP7B,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,KAAK;EAChB,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,IAAI;EAChB,SAAS,EpBUe,IAAI;EoBT5B,UAAU,EAAE,IAAI;EAChB,gBAAgB,EpBoMe,IAAI;EoBnMnC,MAAM,EAAE,cAAmC;EAC3C,MAAM,EAAE,6BAA0B;EAClC,aAAa,EpB+Da,GAAG;EDzC7B,kBAAkB,EAAE,+BAAO;EACnB,UAAU,EAAE,+BAAO;EqBrB3B,eAAe,EAAE,WAAW;;AAK5B,yBAAa;EACX,KAAK,EAAE,CAAC;EACR,IAAI,EAAE,IAAI;;AAIZ,uBAAS;ECtDT,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,KAAmC;EAC3C,QAAQ,EAAE,MAAM;EAChB,gBAAgB,ErB6Oe,OAAO;;AoBrLtC,uBAAS;EACP,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,WAAW,EpBNW,OAAW;EoBOjC,KAAK,EpBqwBqB,OAAU;EoBpwBpC,WAAW,EAAE,MAAM;;;AAMrB,4DACQ;EACN,eAAe,EAAE,IAAI;EACrB,KAAK,EpB0KwB,OAAsB;EoBzKnD,gBAAgB,EpB2Ka,OAAO;;;AoBrKtC,oGAEQ;EACN,KAAK,EpBmlBuB,IAAuB;EoBllBnD,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,CAAC;EACV,gBAAgB,EpBgrBU,OAAW;;;AoBvqBvC,0GAEQ;EACN,KAAK,EpBovBqB,OAAW;;AoBhvBvC,0EACQ;EACN,eAAe,EAAE,IAAI;EACrB,gBAAgB,EAAE,WAAW;EAC7B,gBAAgB,EAAE,IAAI;EE3GxB,MAAM,EAAE,2DAA2D;EF6GjE,MAAM,EpBoHuB,WAAW;;;AoB7G1C,sBAAiB;EACf,OAAO,EAAE,KAAK;;AAIhB,SAAI;EACF,OAAO,EAAE,CAAC;;;AAQd,oBAAqB;EACnB,IAAI,EAAE,IAAI;EACV,KAAK,EAAE,CAAC;;;AAQV,mBAAoB;EAClB,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,IAAI;;;AAIb,gBAAiB;EACf,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,QAAQ;EACjB,SAAS,EpBtGe,IAA8B;EoBuGtD,WAAW,EpB7Fa,OAAW;EoB8FnC,KAAK,EpBgsBuB,OAAW;EoB/rBvC,WAAW,EAAE,MAAM;;;AAIrB,kBAAmB;EACjB,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,GAAG,EAAE,CAAC;EACN,OAAO,EAAE,GAAuB;;;AAIlC,4BAA6B;EAC3B,KAAK,EAAE,CAAC;EACR,IAAI,EAAE,IAAI;;;AAWV;qCAAO;EACL,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,UAAwB;EACvC,aAAa,EAAE,YAA0B;EACzC,OAAO,EAAE,EAAE;;AAGb;6CAAe;EACb,GAAG,EAAE,IAAI;EACT,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;;;AAStB,yBAA2C;EAEvC,4BAAe;IACb,KAAK,EAAE,CAAC;IAAE,IAAI,EAAE,IAAI;;EAItB,iCAAoB;IAClB,IAAI,EAAE,CAAC;IAAE,KAAK,EAAE,IAAI;;;AG/M1B;mBACoB;EAClB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,cAAc,EAAE,MAAM;;AACtB;0BAAO;EACL,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;;AAEX;;;;iCAGS;EACP,OAAO,EAAE,CAAC;;;AAOd;;;kCAGwB;EACtB,WAAW,EAAE,IAAI;;;AAKrB,YAAa;EACX,WAAW,EAAE,IAAI;;AjBtBjB,uCACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,kBAAQ;EACN,KAAK,EAAE,IAAI;;AiBmBb;;yBAEa;EACX,KAAK,EAAE,IAAI;;AAEb;;2BAEe;EACb,WAAW,EAAE,GAAG;;;AAIpB,0EAA2E;EACzE,aAAa,EAAE,CAAC;;;AAIlB,6BAA8B;EAC5B,WAAW,EAAE,CAAC;;AACd,oEAAyC;EClDzC,0BAA0B,EDmDK,CAAC;EClD7B,uBAAuB,EDkDK,CAAC;;;AAIlC;+CACgD;EChD9C,yBAAyB,EDiDG,CAAC;EChD1B,sBAAsB,EDgDG,CAAC;;;AAI/B,uBAAwB;EACtB,KAAK,EAAE,IAAI;;;AAEb,iEAAkE;EAChE,aAAa,EAAE,CAAC;;;AAGhB;uEACmB;ECrEnB,0BAA0B,EDsEK,CAAC;ECrE7B,uBAAuB,EDqEK,CAAC;;;AAGlC,uEAAwE;ECjEtE,yBAAyB,EDkEG,CAAC;ECjE1B,sBAAsB,EDiEG,CAAC;;;AAI/B;gCACiC;EAC/B,OAAO,EAAE,CAAC;;;AAiBZ,oCAAqC;EACnC,YAAY,EAAE,GAAG;EACjB,aAAa,EAAE,GAAG;;;AAEpB,0FAAwC;EACtC,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;;AAKrB,gCAAiC;ExB/C/B,kBAAkB,EAAE,oCAAO;EACnB,UAAU,EAAE,oCAAO;;AwBkD3B,yCAAW;ExBnDX,kBAAkB,EAAE,IAAO;EACnB,UAAU,EAAE,IAAO;;;AwByD7B,WAAY;EACV,WAAW,EAAE,CAAC;;;AAGhB,2CAAe;EACb,YAAY,EAAE,SAAuC;EACrD,mBAAmB,EAAE,CAAC;;;AAGxB,2DAAuB;EACrB,YAAY,EAAE,SAAuC;;;AAQrD;;uCAEoB;EAClB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,IAAI;;AjBzIjB,+EACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,sCAAQ;EACN,KAAK,EAAE,IAAI;;AiByIX,uCAAO;EACL,KAAK,EAAE,IAAI;;AAIf;;;6CAG0B;EACxB,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,CAAC;;;AAKhB,6DAAqC;EACnC,aAAa,EAAE,CAAC;;AAElB,uDAA+B;EAC7B,uBAAuB,EvBGM,GAAmB;EwBvKlD,0BAA0B,EDqKM,CAAC;ECpKhC,yBAAyB,EDoKM,CAAC;;AAEjC,uDAA+B;EAC7B,yBAAyB,EvBDI,GAAmB;EwB/KlD,uBAAuB,EDiLM,CAAC;EChL7B,sBAAsB,EDgLM,CAAC;;;AAGhC,0EAA2E;EACzE,aAAa,EAAE,CAAC;;;AAGhB;gFACmB;ECjLnB,0BAA0B,EDkLM,CAAC;ECjLhC,yBAAyB,EDiLM,CAAC;;;AAGnC,gFAAiF;EC7L/E,uBAAuB,ED8LI,CAAC;EC7L3B,sBAAsB,ED6LI,CAAC;;;AAO9B,oBAAqB;EACnB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,YAAY,EAAE,KAAK;EACnB,eAAe,EAAE,QAAQ;;AACzB;iCACa;EACX,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,UAAU;EACnB,KAAK,EAAE,EAAE;;AAEX,sCAAkB;EAChB,KAAK,EAAE,IAAI;;AAGb,gDAA4B;EAC1B,IAAI,EAAE,IAAI;;;AAoBV;;;kEACuB;EACrB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,gBAAa;EACnB,cAAc,EAAE,IAAI;;;AE1O1B,YAAa;EACX,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,eAAe,EAAE,QAAQ;;AAGzB,2BAAiB;EACf,KAAK,EAAE,IAAI;EACX,YAAY,EAAE,CAAC;EACf,aAAa,EAAE,CAAC;;AAGlB,0BAAc;EAGZ,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;EAKV,KAAK,EAAE,IAAI;EAEX,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,CAAC;;;AAuBpB;;0BAE2B;EACzB,OAAO,EAAE,UAAU;;AAEnB;;6DAAqC;EACnC,aAAa,EAAE,CAAC;;;AAIpB;gBACiB;EACf,KAAK,EAAE,EAAE;EACT,WAAW,EAAE,MAAM;EACnB,cAAc,EAAE,MAAM;;;AAKxB,kBAAmB;EACjB,OAAO,EAAE,SAA+C;EACxD,SAAS,EzBvBe,IAAI;EyBwB5B,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,CAAC;EACd,KAAK,EzByWqC,OAAK;EyBxW/C,UAAU,EAAE,MAAM;EAClB,gBAAgB,EzBwxBY,OAAa;EyBvxBzC,MAAM,EAAE,cAAyC;EACjD,aAAa,EzB4Ba,GAAG;;AyBzB7B;;2DAAW;EACT,OAAO,EAAE,QAAiD;EAC1D,SAAS,EzBjCa,IAA8B;EyBkCpD,aAAa,EzBwBW,GAAG;;AyBtB7B;;2DAAW;EACT,OAAO,EAAE,SAAiD;EAC1D,SAAS,EzBvCa,IAA8B;EyBwCpD,aAAa,EzBkBW,GAAG;;AyBd7B;yCACuB;EACrB,UAAU,EAAE,CAAC;;;AAKjB;;;;;;gEAMiE;EDtG/D,0BAA0B,ECuGG,CAAC;EDtG3B,uBAAuB,ECsGG,CAAC;;;AAEhC,8BAA+B;EAC7B,YAAY,EAAE,CAAC;;;AAEjB;;;;;;kEAMmE;ED1GjE,yBAAyB,EC2GG,CAAC;ED1G1B,sBAAsB,EC0GG,CAAC;;;AAE/B,6BAA8B;EAC5B,WAAW,EAAE,CAAC;;;AAKhB,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGlB,SAAS,EAAE,CAAC;EACZ,WAAW,EAAE,MAAM;;AAInB,uBAAO;EACL,QAAQ,EAAE,QAAQ;;AAClB,8BAAO;EACL,WAAW,EAAE,IAAI;;AAGnB,4FAES;EACP,OAAO,EAAE,CAAC;;AAMZ;yCACa;EACX,YAAY,EAAE,IAAI;;AAIpB;wCACa;EACX,OAAO,EAAE,CAAC;EACV,WAAW,EAAE,IAAI;;;AC3JvB,IAAK;EACH,aAAa,EAAE,CAAC;EAChB,YAAY,EAAE,CAAC;EACf,UAAU,EAAE,IAAI;;ApBEhB,uBACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,UAAQ;EACN,KAAK,EAAE,IAAI;;AoBLb,SAAK;EACH,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;;AAEd,aAAI;EACF,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,OAAO,E1BqZ+B,SAAU;;A0BpZhD,wCACQ;EACN,eAAe,EAAE,IAAI;EACrB,gBAAgB,E1B80BM,OAAa;;A0Bz0BvC,sBAAe;EACb,KAAK,E1B8zBmB,OAAW;;A0B5zBnC,0DACQ;EACN,KAAK,E1B0zBiB,OAAW;E0BzzBjC,eAAe,EAAE,IAAI;EACrB,gBAAgB,EAAE,WAAW;EAC7B,MAAM,E1BiMmB,WAAW;;A0B1LxC,0DAEQ;EACN,gBAAgB,E1BuzBQ,OAAa;E0BtzBrC,YAAY,E1B4tBY,OAAW;;A0BntBvC,iBAAa;ELrDb,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,KAAmC;EAC3C,QAAQ,EAAE,MAAM;EAChB,gBAAgB,EAJS,OAAO;;AK6DhC,mBAAe;EACb,SAAS,EAAE,IAAI;;;AASnB,SAAU;EACR,aAAa,EAAE,cAAgC;;AAC/C,cAAK;EACH,KAAK,EAAE,IAAI;EAEX,aAAa,EAAE,IAAI;;AAGnB,kBAAI;EACF,YAAY,EAAE,GAAG;EACjB,WAAW,E1BtBS,OAAW;E0BuB/B,MAAM,EAAE,qBAAqB;EAC7B,aAAa,EAAE,WAA2C;;AAC1D,wBAAQ;EACN,YAAY,EAAE,oBAA0F;;AAM1G,2FAEQ;EACN,KAAK,E1BoV+B,OAAK;E0BnVzC,gBAAgB,E1B4oBM,IAAQ;E0B3oB9B,MAAM,EAAE,cAAkD;EAC1D,mBAAmB,EAAE,WAAW;EAChC,MAAM,EAAE,OAAO;;;AAerB,eAAK;EACH,KAAK,EAAE,IAAI;;AAGX,mBAAI;EACF,aAAa,E1BmUyB,GAAmB;;A0BjU3D,oBAAK;EACH,WAAW,EAAE,GAAG;;AAKhB,8FAEQ;EACN,KAAK,E1BwiBmB,IAAuB;E0BviB/C,gBAAgB,E1BuoBM,OAAW;;;A0B9nBvC,iBAAK;EACH,KAAK,EAAE,IAAI;;AACX,sBAAK;EACH,UAAU,EAAE,GAAG;EACf,WAAW,EAAE,CAAC;;;AAYpB,uCAAe;EACb,KAAK,EAAE,IAAI;;AAEX,iDAAK;EACH,KAAK,EAAE,IAAI;;AACX,yDAAI;EACF,UAAU,EAAE,MAAM;EAClB,aAAa,EAAE,GAAG;;AAItB,yCAA2B;EACzB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,IAAI;;AAGZ,yBAAmC;EACjC,iDAAK;IACH,OAAO,EAAE,UAAU;IACnB,KAAK,EAAE,EAAE;;EACT,yDAAI;IACF,aAAa,EAAE,CAAC;;;;AASxB,4CAAoB;EAClB,aAAa,EAAE,CAAC;;AAEhB,8DAAS;EAEP,YAAY,EAAE,CAAC;EACf,aAAa,E1BtFW,GAAG;;A0ByF7B;;;;2CAEoB;EAClB,MAAM,EAAE,cAA+C;;AAGzD,yBAAmC;EACjC,8DAAS;IACP,aAAa,EAAE,cAA+C;IAC9D,aAAa,EAAE,WAA2C;;EAE5D;;;;6CAEoB;IAClB,mBAAmB,E1B2hBK,IAAQ;;;;A0BhhBpC,wBAAY;EACV,OAAO,EAAE,IAAI;;AAEf,sBAAU;EACR,OAAO,EAAE,KAAK;;;AASlB,wBAAyB;EAEvB,UAAU,EAAE,IAAI;EF3OhB,uBAAuB,EE6OI,CAAC;EF5O3B,sBAAsB,EE4OI,CAAC;;;ACtO9B,OAAQ;EACN,QAAQ,EAAE,QAAQ;EAClB,UAAU,E3BgWuB,IAAI;E2B/VrC,aAAa,E3BgWoB,IAAqB;E2B/VtD,MAAM,EAAE,qBAAqB;;ArBD7B,6BACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,aAAQ;EACN,KAAK,EAAE,IAAI;;AqBAb,yBAA2C;EAT7C,OAAQ;IAUJ,aAAa,E3B0VkB,GAAmB;;;;AMjWpD,2CACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,oBAAQ;EACN,KAAK,EAAE,IAAI;;AqBcb,yBAA2C;EAH7C,cAAe;IAIX,KAAK,EAAE,IAAI;;;;AAef,gBAAiB;EACf,UAAU,EAAE,OAAO;EACnB,aAAa,E3B4ToB,IAA+B;E2B3ThE,YAAY,E3B2TqB,IAA+B;E2B1ThE,UAAU,EAAE,qBAAqB;EACjC,UAAU,EAAE,sCAAkC;EAE9C,0BAA0B,EAAE,KAAK;;ArB3CjC,+CACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,sBAAQ;EACN,KAAK,EAAE,IAAI;;AqBuCb,mBAAK;EACH,UAAU,EAAE,IAAI;;AAGlB,yBAA2C;EAb7C,gBAAiB;IAcb,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,IAAI;;EAEhB,yBAAW;IACT,OAAO,EAAE,gBAAgB;IACzB,MAAM,EAAE,eAAe;IACvB,cAAc,EAAE,CAAC;IACjB,QAAQ,EAAE,kBAAkB;;EAG9B,mBAAK;IACH,UAAU,EAAE,OAAO;;EAKrB,8GAEuB;IACrB,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;;;;AAOpB;qCAAiB;EACf,UAAU,E3BqRqB,KAAK;;A2BnRpC,6DAAuE;EAHzE;uCAAiB;IAIb,UAAU,EAAE,KAAK;;;;AAYrB;;;mCACmB;EACjB,YAAY,EAAE,KAA2B;EACzC,WAAW,EAAG,KAA2B;;AAEzC,yBAA2C;EAL7C;;;qCACmB;IAKf,YAAY,EAAE,CAAC;IACf,WAAW,EAAG,CAAC;;;;AAarB,kBAAmB;EACjB,OAAO,E3BoJkB,IAAI;E2BnJ7B,YAAY,EAAE,OAAO;;AAErB,yBAA2C;EAJ7C,kBAAmB;IAKf,aAAa,EAAE,CAAC;;;;AAKpB;oBACqB;EACnB,QAAQ,EAAE,KAAK;EACf,KAAK,EAAE,CAAC;EACR,IAAI,EAAE,CAAC;EACP,OAAO,E3B0IkB,IAAI;;A2BvI7B,yBAA2C;EAR7C;sBACqB;IAQjB,aAAa,EAAE,CAAC;;;;AAGpB,iBAAkB;EAChB,GAAG,EAAE,CAAC;EACN,YAAY,EAAE,OAAO;;;AAEvB,oBAAqB;EACnB,MAAM,EAAE,CAAC;EACT,aAAa,EAAE,CAAC;EAChB,YAAY,EAAE,OAAO;;;AAMvB,aAAc;EACZ,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,WAAmD;EAC5D,SAAS,E3BjHe,IAA8B;E2BkHtD,WAAW,E3BuMsB,IAAqB;E2BtMtD,MAAM,E3BqM2B,IAAI;;A2BnMrC,wCACQ;EACN,eAAe,EAAE,IAAI;;AAGvB,mBAAM;EACJ,OAAO,EAAE,KAAK;;AAGhB,yBAA2C;EACzC,4EAC6B;IAC3B,WAAW,EAAE,KAA2B;;;;AAW9C,cAAe;EACb,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,KAAK;EACZ,YAAY,E3B4KqB,IAA+B;E2B3KhE,OAAO,EAAE,QAAQ;EC9LjB,UAAU,EAAE,MAAwC;EACpD,aAAa,EAAE,MAAwC;ED+LvD,gBAAgB,EAAE,WAAW;EAC7B,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,qBAAqB;EAC7B,aAAa,E3B5Fa,GAAG;;A2BgG7B,oBAAQ;EACN,OAAO,EAAE,CAAC;;AAIZ,wBAAU;EACR,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,GAAG;EACX,aAAa,EAAE,GAAG;;AAEpB,oCAAsB;EACpB,UAAU,EAAE,GAAG;;AAGjB,yBAA2C;EA5B7C,cAAe;IA6BX,OAAO,EAAE,IAAI;;;;AAUjB,WAAY;EACV,MAAM,EAAE,YAA4D;;AAEpE,oBAAS;EACP,WAAW,EAAK,IAAI;EACpB,cAAc,EAAE,IAAI;EACpB,WAAW,E3BgIoB,IAAqB;;A2B7HtD,yBAA+C;EAE7C,gCAAqB;IACnB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,CAAC;IACb,gBAAgB,EAAE,WAAW;IAC7B,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,IAAI;;EAChB;mDACiB;IACf,OAAO,EAAE,iBAAiB;;EAE5B,yCAAS;IACP,WAAW,E3B8GgB,IAAqB;;E2B7GhD,gGACQ;IACN,gBAAgB,EAAE,IAAI;;;AAO9B,yBAA2C;EAlC7C,WAAY;IAmCR,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,CAAC;;EAET,gBAAK;IACH,KAAK,EAAE,IAAI;;EACX,oBAAI;IACF,WAAW,E3BgGkB,MAA2C;I2B/FxE,cAAc,E3B+Fe,MAA2C;;;;A2BnFhF,YAAa;EACX,WAAW,EAAE,KAA2B;EACxC,YAAY,EAAE,KAA2B;EACzC,OAAO,EAAE,SAA+B;EACxC,UAAU,EAAE,qBAAqB;EACjC,aAAa,EAAE,qBAAqB;E5B9NpC,kBAAkB,EAAE,wEAAO;EACnB,UAAU,EAAE,wEAAO;E6B/D3B,UAAU,EAAE,KAAwC;EACpD,aAAa,EAAE,KAAwC;;Ad8cvD,yBAAmC;EAEjC,wBAAY;IACV,OAAO,EAAE,YAAY;IACrB,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM;;EAIxB,0BAAc;IACZ,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,IAAI;IACX,cAAc,EAAE,MAAM;;EAIxB,iCAAqB;IACnB,OAAO,EAAE,YAAY;;EAGvB,yBAAa;IACX,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM;;EAEtB;;yCAEc;IACZ,KAAK,EAAE,IAAI;;EAKf,yCAA6B;IAC3B,KAAK,EAAE,IAAI;;EAGb,2BAAe;IACb,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM;;EAKxB;wBACU;IACR,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM;;EAEtB;8BAAM;IACJ,YAAY,EAAE,CAAC;;EAGnB;+CACiC;IAC/B,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,CAAC;;EAIhB,iDAAqC;IACnC,GAAG,EAAE,CAAC;;;AazOR,yBAA+C;EADjD,wBAAY;IAER,aAAa,EAAE,GAAG;;EAElB,mCAAa;IACX,aAAa,EAAE,CAAC;;;AAStB,yBAA2C;EA1B7C,YAAa;IA2BT,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,CAAC;IACT,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;I5BzPnB,kBAAkB,EAAE,IAAO;IACnB,UAAU,EAAE,IAAO;;;;A4BiQ7B,iCAAkC;EAChC,UAAU,EAAE,CAAC;EHpUb,uBAAuB,EGqUI,CAAC;EHpU3B,sBAAsB,EGoUI,CAAC;;;AAG9B,sDAAuD;EACrD,aAAa,EAAE,CAAC;EHzUhB,uBAAuB,ExB2WU,GAAmB;EwB1WnD,sBAAsB,ExB0WU,GAAmB;EwBnWpD,0BAA0B,EGmUI,CAAC;EHlU9B,yBAAyB,EGkUI,CAAC;;;AAQjC,WAAY;EChVV,UAAU,EAAE,KAAwC;EACpD,aAAa,EAAE,KAAwC;;ADkVvD,mDAAS;ECnVT,UAAU,EAAE,MAAwC;EACpD,aAAa,EAAE,MAAwC;;ADqVvD,mDAAS;ECtVT,UAAU,EAAE,MAAwC;EACpD,aAAa,EAAE,MAAwC;;;AD+VzD,YAAa;EChWX,UAAU,EAAE,MAAwC;EACpD,aAAa,EAAE,MAAwC;;ADkWvD,yBAA2C;EAH7C,YAAa;IAIT,KAAK,EAAE,IAAI;IACX,WAAW,E3BIoB,IAA+B;I2BH9D,YAAY,E3BGmB,IAA+B;;;;A2BUlE,yBAA2C;EACzC,YAAa;IACX,KAAK,EAAE,eAAe;;;EAExB,aAAc;IACZ,KAAK,EAAE,gBAAgB;IACzB,YAAY,EAAE,KAA2B;;EAEvC,6BAAgB;IACd,YAAY,EAAE,CAAC;;;AAUrB,eAAgB;EACd,gBAAgB,E3BzBiB,OAAO;E2B0BxC,YAAY,E3BzBqB,OAAgC;;A2B2BjE,6BAAc;EACZ,KAAK,E3BhBkC,IAA0B;;A2BiBjE,wEACQ;EACN,KAAK,E3BlBgC,OAAwC;E2BmB7E,gBAAgB,E3BlBqB,WAAW;;A2BsBpD,4BAAa;EACX,KAAK,E3BvC0B,IAAI;;A2B2CnC,oCAAS;EACP,KAAK,E3B9BgC,IAA0B;;A2BgC/D,sFACQ;EACN,KAAK,E3B1C8B,IAAI;E2B2CvC,gBAAgB,E3B1CmB,WAAW;;A2B8ChD,2IAEQ;EACN,KAAK,E3BhD8B,IAAI;E2BiDvC,gBAAgB,E3BhDmB,OAAgC;;A2BoDrE,iJAEQ;EACN,KAAK,E3BtD8B,IAAI;E2BuDvC,gBAAgB,E3BtDmB,WAAW;;A2B2DpD,8BAAe;EACb,YAAY,E3BlD2B,IAAI;;A2BmD3C,0EACQ;EACN,gBAAgB,E3BvDqB,IAAI;;A2ByD3C,wCAAU;EACR,gBAAgB,E3BzDqB,IAAI;;A2B6D7C;4BACa;EACX,YAAY,E3BjFmB,OAAgC;;A2BwF7D,qIAEQ;EACN,gBAAgB,E3BpFmB,OAAgC;E2BqFnE,KAAK,E3BtF8B,IAAI;;A2B0F3C,yBAA+C;EAG3C,yDAAS;IACP,KAAK,E3BxF4B,IAA0B;;E2ByF3D,gIACQ;IACN,KAAK,E3BnG0B,IAAI;I2BoGnC,gBAAgB,E3BnGe,WAAW;;E2BuG5C,0MAEQ;IACN,KAAK,E3BzG0B,IAAI;I2B0GnC,gBAAgB,E3BzGe,OAAgC;;E2B6GjE,gNAEQ;IACN,KAAK,E3B/G0B,IAAI;I2BgHnC,gBAAgB,E3B/Ge,WAAW;;;A2B2HpD,4BAAa;EACX,KAAK,E3BzHkC,IAA0B;;A2B0HjE,kCAAQ;EACN,KAAK,E3BnIgC,IAAI;;A2BuI7C,yBAAU;EACR,KAAK,E3BhIkC,IAA0B;;A2BiIjE,gEACQ;EACN,KAAK,E3B3IgC,IAAI;;A2B+IzC,4LACQ;EACN,KAAK,E3B7I8B,IAAI;;;A2BqJ/C,eAAgB;EACd,gBAAgB,E3BrI0B,IAAI;E2BsI9C,YAAY,E3BrI8B,OAA+B;;A2BuIzE,6BAAc;EACZ,KAAK,E3B5HmC,OAA0B;;A2B6HlE,wEACQ;EACN,KAAK,E3B9HiC,IAAI;E2B+H1C,gBAAgB,E3B9HsB,WAAW;;A2BkIrD,4BAAa;EACX,KAAK,E3BnJmC,OAAyB;;A2BuJjE,oCAAS;EACP,KAAK,E3B1IiC,OAA0B;;A2B4IhE,sFACQ;EACN,KAAK,E3BpJ+B,IAAgC;E2BqJpE,gBAAgB,E3BtJoB,WAAW;;A2B0JjD,2IAEQ;EACN,KAAK,E3B5J+B,IAAgC;E2B6JpE,gBAAgB,E3B5JoB,OAA+B;;A2BgKrE,iJAEQ;EACN,KAAK,E3BlK+B,IAAI;E2BmKxC,gBAAgB,E3BlKoB,WAAW;;A2BwKrD,8BAAe;EACb,YAAY,E3B/J4B,IAAI;;A2BgK5C,0EACQ;EACN,gBAAgB,E3BpKsB,IAAI;;A2BsK5C,wCAAU;EACR,gBAAgB,E3BtKsB,IAAI;;A2B0K9C;4BACa;EACX,YAAY,EAAE,OAA8B;;AAM1C,qIAEQ;EACN,gBAAgB,E3BhMoB,OAA+B;E2BiMnE,KAAK,E3BlM+B,IAAgC;;A2BsMxE,yBAA+C;EAG3C,mEAAmB;IACjB,YAAY,E3BhNsB,OAA+B;;E2BkNnE,yDAAS;IACP,gBAAgB,E3BnNkB,OAA+B;;E2BqNnE,yDAAS;IACP,KAAK,E3B1M6B,OAA0B;;E2B2M5D,gIACQ;IACN,KAAK,E3BnN2B,IAAgC;I2BoNhE,gBAAgB,E3BrNgB,WAAW;;E2ByN7C,0MAEQ;IACN,KAAK,E3B3N2B,IAAgC;I2B4NhE,gBAAgB,E3B3NgB,OAA+B;;E2B+NjE,gNAEQ;IACN,KAAK,E3BjO2B,IAAI;I2BkOpC,gBAAgB,E3BjOgB,WAAW;;;A2BwOrD,4BAAa;EACX,KAAK,E3BtOmC,OAA0B;;A2BuOlE,kCAAQ;EACN,KAAK,E3B9OiC,IAAgC;;A2BkP1E,yBAAU;EACR,KAAK,E3B7OmC,OAA0B;;A2B8OlE,gEACQ;EACN,KAAK,E3BtPiC,IAAgC;;A2B0PtE,4LACQ;EACN,KAAK,E3B1P+B,IAAI;;;A6BlZhD,WAAY;EACV,OAAO,EAAE,QAA2D;EACpE,aAAa,E7BsWoB,IAAqB;E6BrWtD,UAAU,EAAE,IAAI;EAChB,gBAAgB,E7BoxBc,OAAO;E6BnxBrC,aAAa,E7BmGa,GAAG;;A6BjG7B,gBAAK;EACH,OAAO,EAAE,YAAY;;AAErB,4BAAY;EACV,OAAO,EAAE,IAA+B;EACxC,OAAO,EAAE,KAAK;EACd,KAAK,E7B6wBqB,IAAI;;A6BzwBlC,qBAAU;EACR,KAAK,E7Bs0BqB,OAAW;;;A8B11BzC,WAAY;EACV,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,CAAC;EACf,MAAM,EAAE,MAAuB;EAC/B,aAAa,E9BsGa,GAAG;;A8BpG7B,gBAAK;EACH,OAAO,EAAE,MAAM;;AACf;uBACO;EACL,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,SAA+C;EACxD,WAAW,E9B+CS,OAAW;E8B9C/B,eAAe,EAAE,IAAI;EACrB,KAAK,E9B2vBmB,OAAW;E8B1vBnC,gBAAgB,E9BwciB,IAAc;E8Bvc/C,MAAM,EAAE,cAA4B;EACpC,WAAW,EAAE,IAAI;;AAGjB;mCACO;EACL,WAAW,EAAE,CAAC;ENXpB,yBAAyB,ExB8FC,GAAG;EwB7F1B,sBAAsB,ExB6FC,GAAG;;A8B9EzB;kCACO;ENzBX,0BAA0B,ExBsGA,GAAG;EwBrG1B,uBAAuB,ExBqGA,GAAG;;A8BrE3B;;6BACQ;EACN,OAAO,EAAE,CAAC;EACV,KAAK,E9B+Z4B,OAAiB;E8B9ZlD,gBAAgB,E9B2zBQ,OAAa;E8B1zBrC,YAAY,E9B+ZqB,IAAI;;A8BzZvC;;;kCAEQ;EACN,OAAO,EAAE,CAAC;EACV,KAAK,E9B2a4B,IAAwB;E8B1azD,gBAAgB,E9BqtBQ,OAAW;E8BptBnC,YAAY,E9BotBY,OAAW;E8BntBnC,MAAM,EAAE,OAAO;;AAKjB;;;;;iCAKU;EACR,KAAK,E9BwxBmB,OAAW;E8BvxBnC,gBAAgB,E9B6YiB,IAAI;E8B5YrC,YAAY,E9B6YqB,IAAI;E8B5YrC,MAAM,E9B+JqB,WAAW;;;A+BnOxC;0BACO;EACL,OAAO,EAAE,SAAqC;EAC9C,SAAS,E/B6CW,IAA8B;E+B5ClD,WAAW,E/BkGW,OAAS;;A+B/F/B;sCACO;EPGX,yBAAyB,ExB+FC,GAAG;EwB9F1B,sBAAsB,ExB8FC,GAAG;;A+B7FzB;qCACO;EPXX,0BAA0B,ExBuGA,GAAG;EwBtG1B,uBAAuB,ExBsGA,GAAG;;;A+B1G3B;0BACO;EACL,OAAO,EAAE,QAAqC;EAC9C,SAAS,E/B8CW,IAA8B;E+B7ClD,WAAW,E/BmGW,GAAG;;A+BhGzB;sCACO;EPGX,yBAAyB,ExBgGC,GAAG;EwB/F1B,sBAAsB,ExB+FC,GAAG;;A+B9FzB;qCACO;EPXX,0BAA0B,ExBwGA,GAAG;EwBvG1B,uBAAuB,ExBuGA,GAAG;;;AgC1G/B,MAAO;EACL,YAAY,EAAE,CAAC;EACf,MAAM,EAAE,MAAuB;EAC/B,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;;A1BIlB,2BACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,YAAQ;EACN,KAAK,EAAE,IAAI;;A0BRb,SAAG;EACD,OAAO,EAAE,MAAM;;AACf;gBACO;EACL,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,QAAQ;EACjB,gBAAgB,EhC0ciB,IAAc;EgCzc/C,MAAM,EAAE,cAAuB;EAC/B,aAAa,EhC0coB,IAAI;;AgCvcvC;mBACU;EACR,eAAe,EAAE,IAAI;EACrB,gBAAgB,EhC80BQ,OAAa;;AgCz0BvC;mBACO;EACL,KAAK,EAAE,KAAK;;AAKd;uBACO;EACL,KAAK,EAAE,IAAI;;AAKb;;;uBAGO;EACL,KAAK,EhC6yBmB,OAAW;EgC5yBnC,gBAAgB,EhC0aiB,IAAc;EgCza/C,MAAM,EhCqLqB,WAAW;;;AiCnO5C,MAAO;EACL,OAAO,EAAE,MAAM;EACf,OAAO,EAAE,cAAc;EACvB,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,CAAC;EACd,KAAK,EjC+jBuB,IAAI;EiC9jBhC,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,cAAc,EAAE,QAAQ;EACxB,aAAa,EAAE,KAAK;;AAKpB,YAAQ;EACN,OAAO,EAAE,IAAI;;AAIf,WAAO;EACL,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;;;AAMX,4BACQ;EACN,KAAK,EjCyiBqB,IAAI;EiCxiB9B,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,OAAO;;;AAOnB,cAAe;ECxCb,gBAAgB,ElC01BY,OAAW;;AkCv1BrC,sDACQ;EACN,gBAAgB,EAAE,OAAmB;;;ADuC3C,cAAe;EC5Cb,gBAAgB,ElC0wBY,OAAW;;AkCvwBrC,sDACQ;EACN,gBAAgB,EAAE,OAAmB;;;AD2C3C,cAAe;EChDb,gBAAgB,ElCmpBY,OAAc;;AkChpBxC,sDACQ;EACN,gBAAgB,EAAE,OAAmB;;;AD+C3C,WAAY;ECpDV,gBAAgB,ElCypBY,OAAW;;AkCtpBrC,gDACQ;EACN,gBAAgB,EAAE,OAAmB;;;ADmD3C,cAAe;ECxDb,gBAAgB,ElCqpBY,OAAc;;AkClpBxC,sDACQ;EACN,gBAAgB,EAAE,OAAmB;;;ADuD3C,aAAc;EC5DZ,gBAAgB,ElCupBY,OAAa;;AkCppBvC,oDACQ;EACN,gBAAgB,EAAE,OAAmB;;;ACF3C,MAAO;EACL,OAAO,EAAE,YAAY;EACrB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,OAAO;EAChB,SAAS,EnC2Ce,IAA8B;EmC1CtD,WAAW,EnCswBiB,IAAI;EmCrwBhC,KAAK,EnC2vBuB,IAAI;EmC1vBhC,WAAW,EnCqwBiB,CAAC;EmCpwB7B,cAAc,EAAE,MAAM;EACtB,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,gBAAgB,EnC40BY,OAAW;EmC30BvC,aAAa,EnCiwBe,IAAI;;AmC9vBhC,YAAQ;EACN,OAAO,EAAE,IAAI;;AAIf,WAAO;EACL,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;;AAGX,wEACuB;EACrB,GAAG,EAAE,CAAC;EACN,OAAO,EAAE,OAAO;;AAMlB,mEAC6B;EAC3B,KAAK,EnCmuBqB,OAAW;EmCluBrC,gBAAgB,EnCouBU,IAAI;;AmCjuBhC,yBAAqB;EACnB,KAAK,EAAE,KAAK;;AAGd,kCAAyB;EACvB,YAAY,EAAE,GAAG;;AAGnB,4BAAwB;EACtB,WAAW,EAAE,GAAG;;;AAMlB,4BACQ;EACN,KAAK,EnC0sBqB,IAAI;EmCzsB9B,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,OAAO;;;AC5DnB,UAAW;EACT,WAAW,EpCqeoB,IAAI;EoCpenC,cAAc,EpCoeiB,IAAI;EoCnenC,aAAa,EpCmekB,IAAI;EoClenC,KAAK,EpCme0B,OAAO;EoCletC,gBAAgB,EpC61BY,OAAa;;AoC31BzC;cACI;EACF,KAAK,EpCgewB,OAAO;;AoC7dtC,YAAE;EACA,aAAa,EAAE,IAAwB;EACvC,SAAS,EpC4doB,IAA6B;EoC3d1D,WAAW,EAAE,GAAG;;AAGlB,eAAK;EACH,gBAAgB,EAAE,OAA0B;;AAG9C,kDACmB;EACjB,aAAa,EpCiFW,GAAG;;AoC9E7B,qBAAW;EACT,SAAS,EAAE,IAAI;;AAGjB,oCAA8C;EA/BhD,UAAW;IAgCP,WAAW,EAAK,IAA0B;IAC1C,cAAc,EAAE,IAA0B;;EAE1C,kDACmB;IACjB,YAAY,EAAG,IAAwB;IACvC,aAAa,EAAE,IAAwB;;EAGzC;gBACI;IACF,SAAS,EpCgckB,IAA6B;;;;AqC1e9D,UAAW;EACT,OAAO,EAAE,KAAK;EACd,OAAO,ErCquBqB,GAAG;EqCpuB/B,aAAa,ErCoWoB,IAAqB;EqCnWtD,WAAW,ErCqDa,OAAW;EqCpDnC,gBAAgB,ErCouBY,IAAQ;EqCnuBpC,MAAM,EAAE,cAA2B;EACnC,aAAa,ErCsuBe,GAAmB;ED1jB/C,kBAAkB,EAAE,uBAAW;EAC1B,aAAa,EAAE,uBAAW;EACvB,UAAU,EAAE,uBAAW;;AsC3K/B;kBACQ;EnCRR,OAAO,EADuB,KAAK;EAEnC,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;EmCQV,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,IAAI;;AAMpB,mBAAS;EACP,OAAO,ErC6tBmB,GAAG;EqC5tB7B,KAAK,ErC+yBqB,OAAU;;;AqC1yBxC;;kBAEmB;EACjB,YAAY,ErCyuBgB,OAAW;;;AsCrwBzC,MAAO;EACL,OAAO,EtC0mBqB,IAAI;EsCzmBhC,aAAa,EtCmWoB,IAAqB;EsClWtD,MAAM,EAAE,qBAAqB;EAC7B,aAAa,EtCwmBe,GAAmB;;AsCrmB/C,SAAG;EACD,UAAU,EAAE,CAAC;EAEb,KAAK,EAAE,OAAO;;AAIhB,kBAAY;EACV,WAAW,EtC8lBe,IAAI;;AsC1lBhC;WACK;EACH,aAAa,EAAE,CAAC;;AAGlB,cAAQ;EACN,UAAU,EAAE,GAAG;;;AAQnB;kBACmB;EACjB,aAAa,EAAE,IAAqB;;AAGpC;yBAAO;EACL,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,OAAO;;;AAQlB,cAAe;ECvDb,gBAAgB,EvCstBY,OAAiB;EuCrtB7C,YAAY,EvCotBgB,OAAqB;EuCntBjD,KAAK,EvCktBuB,OAAmB;;AuChtB/C,iBAAG;EACD,gBAAgB,EAAE,OAAmB;;AAEvC,0BAAY;EACV,KAAK,EAAE,OAAwB;;;ADmDnC,WAAY;EC3DV,gBAAgB,EvC0tBY,OAAc;EuCztB1C,YAAY,EvCwtBgB,OAAkB;EuCvtB9C,KAAK,EvCstBuB,OAAgB;;AuCptB5C,cAAG;EACD,gBAAgB,EAAE,OAAmB;;AAEvC,uBAAY;EACV,KAAK,EAAE,OAAwB;;;ADuDnC,cAAe;EC/Db,gBAAgB,EvC8tBY,OAAiB;EuC7tB7C,YAAY,EvC4tBgB,OAAqB;EuC3tBjD,KAAK,EvC0tBuB,OAAmB;;AuCxtB/C,iBAAG;EACD,gBAAgB,EAAE,OAAmB;;AAEvC,0BAAY;EACV,KAAK,EAAE,OAAwB;;;AD2DnC,aAAc;ECnEZ,gBAAgB,EvCkuBY,OAAgB;EuCjuB5C,YAAY,EvCguBgB,OAAoB;EuC/tBhD,KAAK,EvC8tBuB,OAAkB;;AuC5tB9C,gBAAG;EACD,gBAAgB,EAAE,OAAmB;;AAEvC,yBAAY;EACV,KAAK,EAAE,OAAwB;;;ACFnC,uCAGC;EAFC,IAAM;IAAE,mBAAmB,EAAE,MAAM;;EACnC,EAAM;IAAE,mBAAmB,EAAE,GAAG;;;AAIlC,+BAGC;EAFC,IAAM;IAAE,mBAAmB,EAAE,MAAM;;EACnC,EAAM;IAAE,mBAAmB,EAAE,GAAG;;;AAQlC,SAAU;EACR,QAAQ,EAAE,MAAM;EAChB,MAAM,ExCkV2B,IAAqB;EwCjVtD,aAAa,ExCiVoB,IAAqB;EwChVtD,gBAAgB,ExCgnBY,OAAO;EwC/mBnC,aAAa,ExCmnBe,GAAmB;ED7kB/C,kBAAkB,EAAE,kCAAO;EACnB,UAAU,EAAE,kCAAO;;;AyClC7B,aAAc;EACZ,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,EAAE;EACT,MAAM,EAAE,IAAI;EACZ,SAAS,ExCce,IAA8B;EwCbtD,WAAW,ExCqUsB,IAAqB;EwCpUtD,KAAK,ExCsmBuB,IAAI;EwCrmBhC,UAAU,EAAE,MAAM;EAClB,gBAAgB,ExCkuBY,OAAW;EDzsBvC,kBAAkB,EAAE,kCAAO;EACnB,UAAU,EAAE,kCAAO;EAoH3B,kBAAkB,EAAE,eAAW;EAC1B,aAAa,EAAE,eAAW;EACvB,UAAU,EAAE,eAAW;;;AyCtIjC;qBACsB;ECApB,gBAAgB,EAAE,2LAAmI;EACrJ,gBAAgB,EAAE,sLAA8H;EAChJ,gBAAgB,EAAE,mLAA2H;EDA7I,eAAe,EAAE,SAAS;;;AAO5B;oBACqB;EzC7CnB,iBAAiB,EyC8CE,uCAAuC;EzC7CrD,YAAY,EyC6CE,uCAAuC;EzC5ClD,SAAS,EyC4CE,uCAAuC;;;AAO5D,qBAAsB;EErEpB,gBAAgB,E1CmpBY,OAAc;;A0ChpB1C,uCAAoB;EDgDpB,gBAAgB,EAAE,2LAAmI;EACrJ,gBAAgB,EAAE,sLAA8H;EAChJ,gBAAgB,EAAE,mLAA2H;;;ADoB/I,kBAAmB;EEzEjB,gBAAgB,E1CypBY,OAAW;;A0CtpBvC,oCAAoB;EDgDpB,gBAAgB,EAAE,2LAAmI;EACrJ,gBAAgB,EAAE,sLAA8H;EAChJ,gBAAgB,EAAE,mLAA2H;;;ADwB/I,qBAAsB;EE7EpB,gBAAgB,E1CqpBY,OAAc;;A0ClpB1C,uCAAoB;EDgDpB,gBAAgB,EAAE,2LAAmI;EACrJ,gBAAgB,EAAE,sLAA8H;EAChJ,gBAAgB,EAAE,mLAA2H;;;AD4B/I,oBAAqB;EEjFnB,gBAAgB,E1CupBY,OAAa;;A0CppBzC,sCAAoB;EDgDpB,gBAAgB,EAAE,2LAAmI;EACrJ,gBAAgB,EAAE,sLAA8H;EAChJ,gBAAgB,EAAE,mLAA2H;;;AExD/I,MAAO;EAEL,UAAU,EAAE,IAAI;;AAEhB,kBAAc;EACZ,UAAU,EAAE,CAAC;;;AAIjB;WACY;EACV,IAAI,EAAE,CAAC;EACP,QAAQ,EAAE,MAAM;;;AAGlB,WAAY;EACV,KAAK,EAAE,OAAO;;;AAGhB,aAAc;EACZ,OAAO,EAAE,KAAK;;AAGd,2BAAgB;EACd,SAAS,EAAE,IAAI;;;AAInB;oBACqB;EACnB,YAAY,EAAE,IAAI;;;AAGpB;mBACoB;EAClB,aAAa,EAAE,IAAI;;;AAGrB;;WAEY;EACV,OAAO,EAAE,UAAU;EACnB,cAAc,EAAE,GAAG;;;AAGrB,aAAc;EACZ,cAAc,EAAE,MAAM;;;AAGxB,aAAc;EACZ,cAAc,EAAE,MAAM;;;AAIxB,cAAe;EACb,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,GAAG;;;AAMpB,WAAY;EACV,YAAY,EAAE,CAAC;EACf,UAAU,EAAE,IAAI;;;ACvDlB,WAAY;EAEV,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,CAAC;;;AAQjB,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,SAAS;EAElB,aAAa,EAAE,IAAI;EACnB,gBAAgB,E5C0oBc,IAAI;E4CzoBlC,MAAM,EAAE,cAA4B;;AAGpC,4BAAc;EpB3Bd,uBAAuB,ExBqqBO,GAAmB;EwBpqBhD,sBAAsB,ExBoqBO,GAAmB;;A4CvoBjD,2BAAa;EACX,aAAa,EAAE,CAAC;EpBvBlB,0BAA0B,ExB6pBI,GAAmB;EwB5pBhD,yBAAyB,ExB4pBI,GAAmB;;;A4C3nBnD;sBACuB;EACrB,KAAK,E5C8oByB,IAAsB;;A4C5oBpD;+CAAyB;EACvB,KAAK,E5C4oBuB,IAAI;;A4CxoBlC;;4BACQ;EACN,eAAe,EAAE,IAAI;EACrB,KAAK,E5CooBuB,IAAsB;E4CnoBlD,gBAAgB,E5CinBY,OAAO;;;A4C7mBvC,sBAAuB;EACrB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;;;AAKhB,2FAEiB;EACf,gBAAgB,E5C+xBU,OAAa;E4C9xBvC,KAAK,E5CoxBqB,OAAW;E4CnxBrC,MAAM,E5C6JuB,WAAW;;A4C1JxC,sKAAyB;EACvB,KAAK,EAAE,OAAO;;AAEhB,6JAAsB;EACpB,KAAK,E5C4wBmB,OAAW;;A4CvwBvC,qFAEe;EACb,OAAO,EAAE,CAAC;EACV,KAAK,E5CmlBuB,IAAuB;E4CllBnD,gBAAgB,E5CkrBU,OAAW;E4CjrBrC,YAAY,E5CirBc,OAAW;;A4C9qBrC;;;;;;+DAEkC;EAChC,KAAK,EAAE,OAAO;;AAEhB,uJAAsB;EACpB,KAAK,E5C8kBqB,OAAmC;;;A6ChrBjE,wBAA2B;EACzB,KAAK,E7CmtBqB,OAAmB;E6CltB7C,gBAAgB,E7CotBU,OAAiB;;;A6C/sB7C;8BACiC;EAC/B,KAAK,E7C2sBqB,OAAmB;;A6CzsB7C;uDAAyB;EACvB,KAAK,EAAE,OAAO;;AAGhB;;oCACQ;EACN,KAAK,E7CmsBmB,OAAmB;E6ClsB3C,gBAAgB,EAAE,OAAuB;;AAE3C;;;2CAEe;EACb,KAAK,EAAE,IAAI;EACX,gBAAgB,E7C4rBQ,OAAmB;E6C3rB3C,YAAY,E7C2rBY,OAAmB;;;A6CptB/C,qBAA2B;EACzB,KAAK,E7CutBqB,OAAgB;E6CttB1C,gBAAgB,E7CwtBU,OAAc;;;A6CntB1C;2BACiC;EAC/B,KAAK,E7C+sBqB,OAAgB;;A6C7sB1C;oDAAyB;EACvB,KAAK,EAAE,OAAO;;AAGhB;;iCACQ;EACN,KAAK,E7CusBmB,OAAgB;E6CtsBxC,gBAAgB,EAAE,OAAuB;;AAE3C;;;wCAEe;EACb,KAAK,EAAE,IAAI;EACX,gBAAgB,E7CgsBQ,OAAgB;E6C/rBxC,YAAY,E7C+rBY,OAAgB;;;A6CxtB5C,wBAA2B;EACzB,KAAK,E7C2tBqB,OAAmB;E6C1tB7C,gBAAgB,E7C4tBU,OAAiB;;;A6CvtB7C;8BACiC;EAC/B,KAAK,E7CmtBqB,OAAmB;;A6CjtB7C;uDAAyB;EACvB,KAAK,EAAE,OAAO;;AAGhB;;oCACQ;EACN,KAAK,E7C2sBmB,OAAmB;E6C1sB3C,gBAAgB,EAAE,OAAuB;;AAE3C;;;2CAEe;EACb,KAAK,EAAE,IAAI;EACX,gBAAgB,E7CosBQ,OAAmB;E6CnsB3C,YAAY,E7CmsBY,OAAmB;;;A6C5tB/C,uBAA2B;EACzB,KAAK,E7C+tBqB,OAAkB;E6C9tB5C,gBAAgB,E7CguBU,OAAgB;;;A6C3tB5C;6BACiC;EAC/B,KAAK,E7CutBqB,OAAkB;;A6CrtB5C;sDAAyB;EACvB,KAAK,EAAE,OAAO;;AAGhB;;mCACQ;EACN,KAAK,E7C+sBmB,OAAkB;E6C9sB1C,gBAAgB,EAAE,OAAuB;;AAE3C;;;0CAEe;EACb,KAAK,EAAE,IAAI;EACX,gBAAgB,E7CwsBQ,OAAkB;E6CvsB1C,YAAY,E7CusBY,OAAkB;;;A4CzmBhD,wBAAyB;EACvB,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,GAAG;;;AAEpB,qBAAsB;EACpB,aAAa,EAAE,CAAC;EAChB,WAAW,EAAE,GAAG;;;AE1HlB,MAAO;EACL,aAAa,E9CsWoB,IAAqB;E8CrWtD,gBAAgB,E9C6rBY,IAAI;E8C5rBhC,MAAM,EAAE,qBAAqB;EAC7B,aAAa,E9C+rBe,GAAmB;EDroB/C,kBAAkB,EAAE,6BAAO;EACnB,UAAU,EAAE,6BAAO;;;A+CtD7B,WAAY;EACV,OAAO,E9CsrBqB,IAAI;;AMzrBhC,qCACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,iBAAQ;EACN,KAAK,EAAE,IAAI;;;AwCEf,cAAe;EACb,OAAO,E9CkrBqB,SAAsB;E8CjrBlD,aAAa,EAAE,qBAAqB;EtBpBpC,uBAAuB,EAAE,GAAO;EAC/B,sBAAsB,EAAE,GAAO;;AsBsBhC,2CAA6B;EAC3B,KAAK,EAAE,OAAO;;;AAKlB,YAAa;EACX,UAAU,EAAE,CAAC;EACb,aAAa,EAAE,CAAC;EAChB,SAAS,EAAE,IAA+B;EAC1C,KAAK,EAAE,OAAO;;AAEd;;;;yBAIa;EACX,KAAK,EAAE,OAAO;;;AAKlB,aAAc;EACZ,OAAO,E9CupBqB,SAAsB;E8CtpBlD,gBAAgB,E9C2pBY,OAAO;E8C1pBnC,UAAU,EAAE,cAA6B;EtBxCzC,0BAA0B,EAAE,GAAO;EAClC,yBAAyB,EAAE,GAAO;;;AsBkDnC;sCACgC;EAC9B,aAAa,EAAE,CAAC;;AAEhB;uDAAiB;EACf,YAAY,EAAE,KAAK;EACnB,aAAa,EAAE,CAAC;;AAKhB;+EAA6B;EAC3B,UAAU,EAAE,CAAC;EtBvEnB,uBAAuB,EAAE,GAAO;EAC/B,sBAAsB,EAAE,GAAO;;AsB6E5B;6EAA4B;EAC1B,aAAa,EAAE,CAAC;EtBvEtB,0BAA0B,EAAE,GAAO;EAClC,yBAAyB,EAAE,GAAO;;AsB4EjC,oFAA6B;EtBrF/B,uBAAuB,EsBsFQ,CAAC;EtBrF/B,sBAAsB,EsBqFQ,CAAC;;;AAMhC,yDAA6B;EAC3B,gBAAgB,EAAE,CAAC;;;AAGvB,2BAA4B;EAC1B,gBAAgB,EAAE,CAAC;;;AASnB;;iCAE2B;EACzB,aAAa,EAAE,CAAC;;AAEhB;;yCAAQ;EACN,YAAY,E9CmlBY,IAAI;E8CllB5B,aAAa,E9CklBW,IAAI;;A8C9kBhC;2DACqD;EtBtHrD,uBAAuB,EAAE,GAAO;EAC/B,sBAAsB,EAAE,GAAO;;AsB0H5B;;;gGAAiB;EACf,sBAAsB,EAAE,GAA0B;EAClD,uBAAuB,EAAE,GAA0B;;AAEnD;;;;;;;+GACe;EACb,sBAAsB,EAAE,GAA0B;;AAEpD;;;;;;;8GACc;EACZ,uBAAuB,EAAE,GAA0B;;AAM3D;yDACmD;EtBpInD,0BAA0B,EAAE,GAAO;EAClC,yBAAyB,EAAE,GAAO;;AsBwI/B;;;4FAAgB;EACd,yBAAyB,EAAE,GAA0B;EACrD,0BAA0B,EAAE,GAA0B;;AAEtD;;;;;;;2GACe;EACb,yBAAyB,EAAE,GAA0B;;AAEvD;;;;;;;0GACc;EACZ,0BAA0B,EAAE,GAA0B;;AAK9D;;;wCAGkC;EAChC,UAAU,EAAE,cAA6B;;AAE3C;uDACiD;EAC/C,UAAU,EAAE,CAAC;;AAEf;4CACsC;EACpC,MAAM,EAAE,CAAC;;AAKL;;;;;;;;;;;0EACiB;EACf,WAAW,EAAE,CAAC;;AAEhB;;;;;;;;;;;yEACgB;EACd,YAAY,EAAE,CAAC;;AAOjB;;;;;;;0EACK;EACH,aAAa,EAAE,CAAC;;AAOlB;;;;;;;yEACK;EACH,aAAa,EAAE,CAAC;;AAKxB,0BAAoB;EAClB,MAAM,EAAE,CAAC;EACT,aAAa,EAAE,CAAC;;;AAUpB,YAAa;EACX,aAAa,E9C+IoB,IAAqB;;A8C5ItD,mBAAO;EACL,aAAa,EAAE,CAAC;EAChB,aAAa,E9Csea,GAAmB;;A8Cpe7C,4BAAS;EACP,UAAU,EAAE,GAAG;;AAInB,2BAAe;EACb,aAAa,EAAE,CAAC;;AAEhB;2DACgC;EAC9B,UAAU,EAAE,cAA6B;;AAI7C,0BAAc;EACZ,UAAU,EAAE,CAAC;;AACb,wDAA8B;EAC5B,aAAa,EAAE,cAA6B;;;AAOlD,cAAe;EC1Pb,YAAY,E/C6sBgB,IAAI;;A+C3sBhC,+BAAmB;EACjB,KAAK,E/Cq0BqB,OAAU;E+Cp0BpC,gBAAgB,E/C0sBU,OAAO;E+CzsBjC,YAAY,E/CwsBc,IAAI;;A+CtsB9B,+DAAgC;EAC9B,gBAAgB,E/CqsBQ,IAAI;;A+CnsB9B,sCAAO;EACL,KAAK,E/CmsBmB,OAAO;E+ClsB/B,gBAAgB,E/C4zBQ,OAAU;;A+CxzBpC,8DAAgC;EAC9B,mBAAmB,E/C4rBK,IAAI;;;A8ChdlC,cAAe;EC7Pb,YAAY,E/C0wBgB,OAAW;;A+CxwBvC,+BAAmB;EACjB,KAAK,E/C6sBqB,IAAI;E+C5sB9B,gBAAgB,E/CswBU,OAAW;E+CrwBrC,YAAY,E/CqwBc,OAAW;;A+CnwBrC,+DAAgC;EAC9B,gBAAgB,E/CkwBQ,OAAW;;A+ChwBrC,sCAAO;EACL,KAAK,E/C+vBmB,OAAW;E+C9vBnC,gBAAgB,E/CosBQ,IAAI;;A+ChsB9B,8DAAgC;EAC9B,mBAAmB,E/CyvBK,OAAW;;;A8C1gBzC,cAAe;EChQb,YAAY,E/CqtBgB,OAAqB;;A+CntBjD,+BAAmB;EACjB,KAAK,E/CitBqB,OAAmB;E+ChtB7C,gBAAgB,E/CktBU,OAAiB;E+CjtB3C,YAAY,E/CgtBc,OAAqB;;A+C9sB/C,+DAAgC;EAC9B,gBAAgB,E/C6sBQ,OAAqB;;A+C3sB/C,sCAAO;EACL,KAAK,E/C2sBmB,OAAiB;E+C1sBzC,gBAAgB,E/CwsBQ,OAAmB;;A+CpsB7C,8DAAgC;EAC9B,mBAAmB,E/CosBK,OAAqB;;;A8CldnD,WAAY;ECnQV,YAAY,E/CytBgB,OAAkB;;A+CvtB9C,4BAAmB;EACjB,KAAK,E/CqtBqB,OAAgB;E+CptB1C,gBAAgB,E/CstBU,OAAc;E+CrtBxC,YAAY,E/CotBc,OAAkB;;A+CltB5C,4DAAgC;EAC9B,gBAAgB,E/CitBQ,OAAkB;;A+C/sB5C,mCAAO;EACL,KAAK,E/C+sBmB,OAAc;E+C9sBtC,gBAAgB,E/C4sBQ,OAAgB;;A+CxsB1C,2DAAgC;EAC9B,mBAAmB,E/CwsBK,OAAkB;;;A8CndhD,cAAe;ECtQb,YAAY,E/C6tBgB,OAAqB;;A+C3tBjD,+BAAmB;EACjB,KAAK,E/CytBqB,OAAmB;E+CxtB7C,gBAAgB,E/C0tBU,OAAiB;E+CztB3C,YAAY,E/CwtBc,OAAqB;;A+CttB/C,+DAAgC;EAC9B,gBAAgB,E/CqtBQ,OAAqB;;A+CntB/C,sCAAO;EACL,KAAK,E/CmtBmB,OAAiB;E+CltBzC,gBAAgB,E/CgtBQ,OAAmB;;A+C5sB7C,8DAAgC;EAC9B,mBAAmB,E/C4sBK,OAAqB;;;A8CpdnD,aAAc;ECzQZ,YAAY,E/CiuBgB,OAAoB;;A+C/tBhD,8BAAmB;EACjB,KAAK,E/C6tBqB,OAAkB;E+C5tB5C,gBAAgB,E/C8tBU,OAAgB;E+C7tB1C,YAAY,E/C4tBc,OAAoB;;A+C1tB9C,8DAAgC;EAC9B,gBAAgB,E/CytBQ,OAAoB;;A+CvtB9C,qCAAO;EACL,KAAK,E/CutBmB,OAAgB;E+CttBxC,gBAAgB,E/CotBQ,OAAkB;;A+ChtB5C,6DAAgC;EAC9B,mBAAmB,E/CgtBK,OAAoB;;;AgDhuBlD,iBAAkB;EAChB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,MAAM;;AAEhB;;;;uBAIM;EACJ,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,CAAC;;;AAKb,uBAAwB;EACtB,cAAc,EAAE,MAAM;;;AAIxB,sBAAuB;EACrB,cAAc,EAAE,GAAG;;;AC3BrB,KAAM;EACJ,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,IAAI;EACnB,gBAAgB,EjDqvBY,OAAO;EiDpvBnC,MAAM,EAAE,iBAAsB;EAC9B,aAAa,EjDiGa,GAAG;EDzC7B,kBAAkB,EAAE,mCAAO;EACnB,UAAU,EAAE,mCAAO;;AkDvD3B,gBAAW;EACT,YAAY,EAAE,IAAI;EAClB,YAAY,EAAE,mBAAe;;;AAKjC,QAAS;EACP,OAAO,EAAE,IAAI;EACb,aAAa,EjDuFa,GAAG;;;AiDrF/B,QAAS;EACP,OAAO,EAAE,GAAG;EACZ,aAAa,EjDoFa,GAAG;;;AkD1G/B,MAAO;EACL,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,IAAuB;EAClC,WAAW,ElDmzBiB,IAAI;EkDlzBhC,WAAW,EAAE,CAAC;EACd,KAAK,ElDkzBuB,IAAI;EkDjzBhC,WAAW,ElDkzBiB,YAAa;EkB1zBzC,OAAO,EgCSU,GAAE;EhCNnB,MAAM,EAAE,iBAA0B;;AgCQlC,0BACQ;EACN,KAAK,ElD4yBqB,IAAI;EkD3yB9B,eAAe,EAAE,IAAI;EACrB,MAAM,EAAE,OAAO;EhCfjB,OAAO,EgCgBY,GAAE;EhCbrB,MAAM,EAAE,iBAA0B;;;AgCuBpC,YAAa;EACX,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,WAAW;EACvB,MAAM,EAAE,CAAC;EACT,kBAAkB,EAAE,IAAI;;;ACxB1B,WAAY;EACV,QAAQ,EAAE,MAAM;;;AAIlB,MAAO;EACL,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,OAAO,EnDmQkB,IAAI;EmDlQ7B,0BAA0B,EAAE,KAAK;EAIjC,OAAO,EAAE,CAAC;;AAGV,yBAAqB;EpD0GrB,iBAAiB,EAAE,kBAAiB;EAChC,aAAa,EAAE,kBAAiB;EAC/B,YAAY,EAAE,kBAAiB;EAC5B,SAAS,EAAE,kBAAiB;EAkEpC,kBAAkB,EAAE,+BAA6B;EAC9C,eAAe,EAAE,4BAA0B;EACzC,aAAa,EAAE,0BAAwB;EACpC,UAAU,EAAE,uBAAqB;;AoD9KzC,uBAAmB;EpDsGnB,iBAAiB,EAAE,eAAiB;EAChC,aAAa,EAAE,eAAiB;EAC/B,YAAY,EAAE,eAAiB;EAC5B,SAAS,EAAE,eAAiB;;;AoDvGtC,kBAAmB;EACjB,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;;;AAIlB,aAAc;EACZ,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;;;AAId,cAAe;EACb,QAAQ,EAAE,QAAQ;EAClB,gBAAgB,EnDuiB6B,IAAI;EmDtiBjD,MAAM,EAAE,cAA8C;EACtD,MAAM,EAAE,4BAAqC;EAC7C,aAAa,EnDuDa,GAAG;ED1C7B,kBAAkB,EAAE,4BAAO;EACnB,UAAU,EAAE,4BAAO;EoDZ3B,eAAe,EAAE,WAAW;EAE5B,OAAO,EAAE,CAAC;;;AAIZ,eAAgB;EACd,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,OAAO,EnDoNkB,IAAI;EmDnN7B,gBAAgB,EnD4hBY,IAAI;;AmD1hBhC,oBAAO;EjCrEP,OAAO,EiCqEmB,CAAC;EjClE3B,MAAM,EAAE,gBAA0B;;AiCmElC,kBAAK;EjCtEL,OAAO,ElBimBqB,GAAE;EkB9lB9B,MAAM,EAAE,iBAA0B;;;AiCwEpC,aAAc;EACZ,OAAO,EnDugBqB,IAAI;EmDtgBhC,aAAa,EAAE,iBAAoC;EACnD,UAAU,EAAE,UAAiD;;;AAG/D,oBAAqB;EACnB,UAAU,EAAE,IAAI;;;AAIlB,YAAa;EACX,MAAM,EAAE,CAAC;EACT,WAAW,EnD6fiB,OAAiB;;;AmDxf/C,WAAY;EACV,QAAQ,EAAE,QAAQ;EAClB,OAAO,EnDifqB,IAAI;;;AmD7elC,aAAc;EACZ,OAAO,EnD4eqB,IAAI;EmD3ehC,UAAU,EAAE,KAAK;EACjB,UAAU,EAAE,iBAAoC;;A7C5FhD,yCACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,mBAAQ;EACN,KAAK,EAAE,IAAI;;A6C0Fb,yBAAY;EACV,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,CAAC;;AAGlB,oCAAuB;EACrB,WAAW,EAAE,IAAI;;AAGnB,qCAAwB;EACtB,WAAW,EAAE,CAAC;;;AAKlB,wBAAyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,OAAO;EACZ,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,MAAM;;;AAIlB,yBAAmC;EAEjC,aAAc;IACZ,KAAK,EnDmeqB,KAAK;ImDle/B,MAAM,EAAE,SAAS;;;EAEnB,cAAe;IpDvEf,kBAAkB,EAAE,6BAAO;IACnB,UAAU,EAAE,6BAAO;;;EoD2E3B,SAAU;IAAE,KAAK,EnD4dW,KAAK;;;AmDzdnC,yBAAmC;EACjC,SAAU;IAAE,KAAK,EnDsdW,KAAK;;;AoDpmBnC,QAAS;EACP,QAAQ,EAAE,QAAQ;EAClB,OAAO,EpD+QkB,IAAI;EoD9Q7B,OAAO,EAAE,KAAK;ECRd,WAAW,ErDgDa,8CAAuB;EqD9C/C,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,cAAc,EAAE,MAAM;EACtB,UAAU,EAAE,IAAI;EAChB,WAAW,ErDwDa,OAAW;EqDvDnC,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,KAAK;EACjB,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,IAAI;EACpB,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,YAAY,EAAE,MAAM;EACpB,SAAS,EAAE,MAAM;EDHjB,SAAS,EpDwCe,IAA8B;EkBlDtD,OAAO,EkCYU,CAAC;ElCTlB,MAAM,EAAE,gBAA0B;;AkCWlC,WAAS;ElCdT,OAAO,ElB+gBqB,GAAE;EkB5gB9B,MAAM,EAAE,iBAA0B;;AkCYlC,YAAS;EAAE,UAAU,EAAG,IAAI;EAAE,OAAO,EAAE,KAAsB;;AAC7D,cAAS;EAAE,WAAW,EAAG,GAAG;EAAE,OAAO,EAAE,KAAsB;;AAC7D,eAAS;EAAE,UAAU,EAAI,GAAG;EAAE,OAAO,EAAE,KAAsB;;AAC7D,aAAS;EAAE,WAAW,EAAE,IAAI;EAAE,OAAO,EAAE,KAAsB;;;AAI/D,cAAe;EACb,SAAS,EpDmfmB,KAAK;EoDlfjC,OAAO,EAAE,OAAO;EAChB,KAAK,EpDmfuB,IAAI;EoDlfhC,UAAU,EAAE,MAAM;EAClB,gBAAgB,EpDyfY,IAAW;EoDxfvC,aAAa,EpD8Ea,GAAG;;;AoD1E/B,cAAe;EACb,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,YAAY,EAAE,WAAW;EACzB,YAAY,EAAE,KAAK;;;AAInB,2BAAqB;EACnB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,IAAqB;EAClC,YAAY,EAAE,SAA2C;EACzD,gBAAgB,EpDseU,IAAW;;AoDpevC,gCAA0B;EACxB,MAAM,EAAE,CAAC;EACT,KAAK,EpDgeqB,GAAG;EoD/d7B,aAAa,EAAE,IAAqB;EACpC,YAAY,EAAE,SAA2C;EACzD,gBAAgB,EpD+dU,IAAW;;AoD7dvC,iCAA2B;EACzB,MAAM,EAAE,CAAC;EACT,IAAI,EpDydsB,GAAG;EoDxd7B,aAAa,EAAE,IAAqB;EACpC,YAAY,EAAE,SAA2C;EACzD,gBAAgB,EpDwdU,IAAW;;AoDtdvC,6BAAuB;EACrB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,CAAC;EACP,UAAU,EAAE,IAAqB;EACjC,YAAY,EAAE,aAAgE;EAC9E,kBAAkB,EpDidQ,IAAW;;AoD/cvC,4BAAsB;EACpB,GAAG,EAAE,GAAG;EACR,KAAK,EAAE,CAAC;EACR,UAAU,EAAE,IAAqB;EACjC,YAAY,EAAE,aAAgE;EAC9E,iBAAiB,EpD0cS,IAAW;;AoDxcvC,8BAAwB;EACtB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,IAAqB;EAClC,YAAY,EAAE,SAA2C;EACzD,mBAAmB,EpDmcO,IAAW;;AoDjcvC,mCAA6B;EAC3B,GAAG,EAAE,CAAC;EACN,KAAK,EpD6bqB,GAAG;EoD5b7B,UAAU,EAAE,IAAqB;EACjC,YAAY,EAAE,SAA2C;EACzD,mBAAmB,EpD4bO,IAAW;;AoD1bvC,oCAA8B;EAC5B,GAAG,EAAE,CAAC;EACN,IAAI,EpDsbsB,GAAG;EoDrb7B,UAAU,EAAE,IAAqB;EACjC,YAAY,EAAE,SAA2C;EACzD,mBAAmB,EpDqbO,IAAW;;;AsDlhBzC,QAAS;EACP,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,OAAO,EtD6QkB,IAAI;EsD5Q7B,OAAO,EAAE,IAAI;EACb,SAAS,EtDshB2B,KAAK;EsDrhBzC,OAAO,EAAE,GAAG;EDXZ,WAAW,ErDgDa,8CAAuB;EqD9C/C,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,cAAc,EAAE,MAAM;EACtB,UAAU,EAAE,IAAI;EAChB,WAAW,ErDwDa,OAAW;EqDvDnC,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,KAAK;EACjB,eAAe,EAAE,IAAI;EACrB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,IAAI;EACpB,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,YAAY,EAAE,MAAM;EACpB,SAAS,EAAE,MAAM;ECAjB,SAAS,EtDmCe,IAAI;EsDjC5B,gBAAgB,EtD2hBoB,IAAW;EsD1hB/C,eAAe,EAAE,WAAW;EAC5B,MAAM,EAAE,cAAwC;EAChD,MAAM,EAAE,4BAA+B;EACvC,aAAa,EtDwFa,GAAG;ED1C7B,kBAAkB,EAAE,6BAAO;EACnB,UAAU,EAAE,6BAAO;;AuD3C3B,YAAU;EAAE,UAAU,EAAE,KAAqB;;AAC7C,cAAU;EAAE,WAAW,EtDghBa,IAAI;;AsD/gBxC,eAAU;EAAE,UAAU,EtD+gBc,IAAI;;AsD9gBxC,aAAU;EAAE,WAAW,EAAE,KAAqB;;;AAGhD,cAAe;EACb,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,QAAQ;EACjB,SAAS,EtDgBe,IAAI;EsDf5B,gBAAgB,EtDogBoB,OAAuB;EsDngB3D,aAAa,EAAE,iBAAuC;EACtD,aAAa,EAAE,WAAyD;;;AAG1E,gBAAiB;EACf,OAAO,EAAE,QAAQ;;;AAQjB,0CACQ;EACN,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,YAAY,EAAE,WAAW;EACzB,YAAY,EAAE,KAAK;;;AAGvB,iBAAkB;EAChB,YAAY,EtDmfyB,IAAwB;;;AsDjf/D,uBAAwB;EACtB,YAAY,EtD2ewB,IAAI;EsD1exC,OAAO,EAAE,EAAE;;;AAIX,qBAAe;EACb,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,KAA2B;EACxC,mBAAmB,EAAE,CAAC;EACtB,gBAAgB,EtD2ekB,OAA2C;EsD1e7E,gBAAgB,EtDwekB,mBAAoC;EsDvetE,MAAM,EAAE,KAA2B;;AACnC,2BAAQ;EACN,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,KAAqB;EAClC,mBAAmB,EAAE,CAAC;EACtB,gBAAgB,EtD4dgB,IAAW;;AsDzd/C,uBAAiB;EACf,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,KAA2B;EACjC,UAAU,EAAE,KAA2B;EACvC,iBAAiB,EAAE,CAAC;EACpB,kBAAkB,EtD2dgB,OAA2C;EsD1d7E,kBAAkB,EtDwdgB,mBAAoC;;AsDvdtE,6BAAQ;EACN,OAAO,EAAE,GAAG;EACZ,IAAI,EAAE,GAAG;EACT,MAAM,EAAE,KAAqB;EAC7B,iBAAiB,EAAE,CAAC;EACpB,kBAAkB,EtD6cc,IAAW;;AsD1c/C,wBAAkB;EAChB,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,KAA2B;EACxC,gBAAgB,EAAE,CAAC;EACnB,mBAAmB,EtD6ce,OAA2C;EsD5c7E,mBAAmB,EtD0ce,mBAAoC;EsDzctE,GAAG,EAAE,KAA2B;;AAChC,8BAAQ;EACN,OAAO,EAAE,GAAG;EACZ,GAAG,EAAE,GAAG;EACR,WAAW,EAAE,KAAqB;EAClC,gBAAgB,EAAE,CAAC;EACnB,mBAAmB,EtD8ba,IAAW;;AsD1b/C,sBAAgB;EACd,GAAG,EAAE,GAAG;EACR,KAAK,EAAE,KAA2B;EAClC,UAAU,EAAE,KAA2B;EACvC,kBAAkB,EAAE,CAAC;EACrB,iBAAiB,EtD4biB,OAA2C;EsD3b7E,iBAAiB,EtDybiB,mBAAoC;;AsDxbtE,4BAAQ;EACN,OAAO,EAAE,GAAG;EACZ,KAAK,EAAE,GAAG;EACV,kBAAkB,EAAE,CAAC;EACrB,iBAAiB,EtD+ae,IAAW;EsD9a3C,MAAM,EAAE,KAAqB;;;ACzHnC,SAAU;EACR,QAAQ,EAAE,QAAQ;;;AAGpB,eAAgB;EACd,QAAQ,EAAE,QAAQ;EAClB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;;AAEX,uBAAQ;EACN,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,QAAQ;ExDwKpB,kBAAkB,EAAE,qBAAW;EAC1B,aAAa,EAAE,qBAAW;EACvB,UAAU,EAAE,qBAAW;;AwDtK7B;iCACU;ErDbZ,OAAO,EADuB,KAAK;EAEnC,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;EqDaR,WAAW,EAAE,CAAC;;AAIhB,qDAAsD;EAbxD,uBAAQ;IxD+LR,kBAAkB,EAAE,kCAA6B;IAC9C,eAAe,EAAE,+BAA0B;IACzC,aAAa,EAAE,6BAAwB;IACpC,UAAU,EAAE,0BAAqB;IAxJzC,2BAA2B,EwD3BM,MAAM;IxD4BpC,wBAAwB,EwD5BM,MAAM;IxD6B/B,mBAAmB,EwD7BM,MAAM;IxDuIvC,mBAAmB,EwDtIM,MAAM;IxDuI5B,gBAAgB,EwDvIM,MAAM;IxDwIvB,WAAW,EwDxIM,MAAM;;EAE3B,kEACe;IxD6GnB,iBAAiB,EAAE,uBAAuB;IAClC,SAAS,EAAE,uBAAuB;IwD5GpC,IAAI,EAAE,CAAC;;EAET,iEACc;IxDwGlB,iBAAiB,EAAE,wBAAuB;IAClC,SAAS,EAAE,wBAAuB;IwDvGpC,IAAI,EAAE,CAAC;;EAET,qGAES;IxDkGb,iBAAiB,EAAE,oBAAuB;IAClC,SAAS,EAAE,oBAAuB;IwDjGpC,IAAI,EAAE,CAAC;;;AAKb;;uBAEQ;EACN,OAAO,EAAE,KAAK;;AAGhB,yBAAU;EACR,IAAI,EAAE,CAAC;;AAGT;uBACQ;EACN,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAI;;AAGb,uBAAQ;EACN,IAAI,EAAE,IAAI;;AAEZ,uBAAQ;EACN,IAAI,EAAE,KAAK;;AAEb;6BACc;EACZ,IAAI,EAAE,CAAC;;AAGT,8BAAe;EACb,IAAI,EAAE,KAAK;;AAEb,+BAAgB;EACd,IAAI,EAAE,IAAI;;;AAQd,iBAAkB;EAChB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,MAAM,EAAE,CAAC;EACT,KAAK,EvD4sBuC,GAAG;EkB1yB/C,OAAO,ElB2yBqC,GAAE;EkBxyB9C,MAAM,EAAE,iBAA0B;EqC6FlC,SAAS,EvD4sBmC,IAAI;EuD3sBhD,KAAK,EvDwsBuC,IAAI;EuDvsBhD,UAAU,EAAE,MAAM;EAClB,WAAW,EvDosBiC,4BAAyB;;AuD/rBrE,sBAAO;EdlGP,gBAAgB,EAAE,gFAAmF;EACrG,gBAAgB,EAAE,2EAA8E;EAChG,gBAAgB,EAAE,4EAA+E;EACjG,iBAAiB,EAAE,QAAQ;EAC3B,MAAM,EAAE,8GAAgJ;;AciGxJ,uBAAQ;EACN,IAAI,EAAE,IAAI;EACV,KAAK,EAAE,CAAC;EdvGV,gBAAgB,EAAE,gFAAmF;EACrG,gBAAgB,EAAE,2EAA8E;EAChG,gBAAgB,EAAE,4EAA+E;EACjG,iBAAiB,EAAE,QAAQ;EAC3B,MAAM,EAAE,8GAAgJ;;AcwGxJ,gDACQ;EACN,OAAO,EAAE,CAAC;EACV,KAAK,EvDorBqC,IAAI;EuDnrB9C,eAAe,EAAE,IAAI;ErCtHvB,OAAO,EqCuHY,GAAE;ErCpHrB,MAAM,EAAE,iBAA0B;;AqCwHlC;;;0CAGyB;EACvB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,YAAY;;AAEvB;yCACwB;EACtB,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,KAAK;;AAEpB;0CACyB;EACvB,KAAK,EAAE,GAAG;EACV,YAAY,EAAE,KAAK;;AAErB;4BACW;EACT,KAAK,EAAG,IAAI;EACZ,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,CAAC;EACd,WAAW,EAAE,KAAK;;AAKlB,mCAAS;EACP,OAAO,EAAE,OAAO;;AAIlB,mCAAS;EACP,OAAO,EAAE,OAAO;;;AAUtB,oBAAqB;EACnB,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,IAAI;EACZ,IAAI,EAAE,GAAG;EACT,OAAO,EAAE,EAAE;EACX,KAAK,EAAE,GAAG;EACV,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,CAAC;EACf,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,MAAM;;AAElB,uBAAG;EACD,OAAO,EAAE,YAAY;EACrB,KAAK,EAAG,IAAI;EACZ,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,MAAM;EACnB,MAAM,EAAE,cAA0C;EAClD,aAAa,EAAE,IAAI;EACnB,MAAM,EAAE,OAAO;EAWf,gBAAgB,EAAE,OAAO;EACzB,gBAAgB,EAAE,WAAa;;AAEjC,4BAAQ;EACN,MAAM,EAAE,CAAC;EACT,KAAK,EAAG,IAAI;EACZ,MAAM,EAAE,IAAI;EACZ,gBAAgB,EvDgmB0B,IAAI;;;AuDzlBlD,iBAAkB;EAChB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,GAAG;EACT,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,EAAE;EACX,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,IAAI;EACpB,KAAK,EvDolBuC,IAAI;EuDnlBhD,UAAU,EAAE,MAAM;EAClB,WAAW,EvDwkBiC,4BAAyB;;AuDvkBrE,sBAAO;EACL,WAAW,EAAE,IAAI;;;AAMrB,oCAA8C;EAI1C;;;8BAGW;IACT,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,IAAI;;EAEjB;8BACW;IACT,WAAW,EAAE,KAAK;;EAEpB;8BACW;IACT,YAAY,EAAE,KAAK;;;EAKvB,iBAAkB;IAChB,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;IACV,cAAc,EAAE,IAAI;;;EAItB,oBAAqB;IACnB,MAAM,EAAE,IAAI;;;AjD7Pd,iCACQ;EACN,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAEhB,eAAQ;EACN,KAAK,EAAE,IAAI;;;AkDRf,aAAc;ECRZ,OAAO,EAAE,KAAK;EACd,WAAW,EAAE,IAAI;EACjB,YAAY,EAAE,IAAI;;;ADSpB,WAAY;EACV,KAAK,EAAE,gBAAgB;;;AAEzB,UAAW;EACT,KAAK,EAAE,eAAe;;;AAQxB,KAAM;EACJ,OAAO,EAAE,eAAe;;;AAE1B,KAAM;EACJ,OAAO,EAAE,gBAAgB;;;AAE3B,UAAW;EACT,UAAU,EAAE,MAAM;;;AAEpB,UAAW;EEzBT,IAAI,EAAE,KAAK;EACX,KAAK,EAAE,WAAW;EAClB,WAAW,EAAE,IAAI;EACjB,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,CAAC;;;AF8BX,OAAQ;EACN,OAAO,EAAE,eAAe;;;AAO1B,MAAO;EACL,QAAQ,EAAE,KAAK;;;AGhCf,aAEC;EADC,KAAK,EAAE,YAAY;;ACLrB,WAAW;EACT,OAAO,EAAE,eAAe;;;AAD1B,WAAW;EACT,OAAO,EAAE,eAAe;;;AAD1B,WAAW;EACT,OAAO,EAAE,eAAe;;;AAD1B,WAAW;EACT,OAAO,EAAE,eAAe;;;ADiB5B;;;;;;;;;;;wBAWyB;EACvB,OAAO,EAAE,eAAe;;;AAG1B,yBAAmC;EC5CjC,WAAW;IACT,OAAO,EAAE,gBAAgB;;;EAE3B,gBAAiB;IAAE,OAAO,EAAE,gBAAgB;;;EAC5C,aAAiB;IAAE,OAAO,EAAE,oBAAoB;;;EAChD;eACiB;IAAE,OAAO,EAAE,qBAAqB;;;AD0CjD,yBAAmC;EADrC,iBAAkB;IAEd,OAAO,EAAE,gBAAgB;;;;AAI3B,yBAAmC;EADrC,kBAAmB;IAEf,OAAO,EAAE,iBAAiB;;;;AAI5B,yBAAmC;EADrC,wBAAyB;IAErB,OAAO,EAAE,uBAAuB;;;;AAIpC,gDAAmE;EC/DjE,WAAW;IACT,OAAO,EAAE,gBAAgB;;;EAE3B,gBAAiB;IAAE,OAAO,EAAE,gBAAgB;;;EAC5C,aAAiB;IAAE,OAAO,EAAE,oBAAoB;;;EAChD;eACiB;IAAE,OAAO,EAAE,qBAAqB;;;AD6DjD,gDAAmE;EADrE,iBAAkB;IAEd,OAAO,EAAE,gBAAgB;;;;AAI3B,gDAAmE;EADrE,kBAAmB;IAEf,OAAO,EAAE,iBAAiB;;;;AAI5B,gDAAmE;EADrE,wBAAyB;IAErB,OAAO,EAAE,uBAAuB;;;;AAIpC,iDAAmE;EClFjE,WAAW;IACT,OAAO,EAAE,gBAAgB;;;EAE3B,gBAAiB;IAAE,OAAO,EAAE,gBAAgB;;;EAC5C,aAAiB;IAAE,OAAO,EAAE,oBAAoB;;;EAChD;eACiB;IAAE,OAAO,EAAE,qBAAqB;;;ADgFjD,iDAAmE;EADrE,iBAAkB;IAEd,OAAO,EAAE,gBAAgB;;;;AAI3B,iDAAmE;EADrE,kBAAmB;IAEf,OAAO,EAAE,iBAAiB;;;;AAI5B,iDAAmE;EADrE,wBAAyB;IAErB,OAAO,EAAE,uBAAuB;;;;AAIpC,0BAAmC;ECrGjC,WAAW;IACT,OAAO,EAAE,gBAAgB;;;EAE3B,gBAAiB;IAAE,OAAO,EAAE,gBAAgB;;;EAC5C,aAAiB;IAAE,OAAO,EAAE,oBAAoB;;;EAChD;eACiB;IAAE,OAAO,EAAE,qBAAqB;;;ADmGjD,0BAAmC;EADrC,iBAAkB;IAEd,OAAO,EAAE,gBAAgB;;;;AAI3B,0BAAmC;EADrC,kBAAmB;IAEf,OAAO,EAAE,iBAAiB;;;;AAI5B,0BAAmC;EADrC,wBAAyB;IAErB,OAAO,EAAE,uBAAuB;;;;AAIpC,yBAAmC;EC7GjC,UAAW;IACT,OAAO,EAAE,eAAe;;;ADgH5B,gDAAmE;ECjHjE,UAAW;IACT,OAAO,EAAE,eAAe;;;ADoH5B,iDAAmE;ECrHjE,UAAW;IACT,OAAO,EAAE,eAAe;;;ADwH5B,0BAAmC;ECzHjC,UAAW;IACT,OAAO,EAAE,eAAe;;;AAD1B,cAAW;EACT,OAAO,EAAE,eAAe;;;ADqI5B,YAAa;ECjJX,cAAW;IACT,OAAO,EAAE,gBAAgB;;;EAE3B,mBAAiB;IAAE,OAAO,EAAE,gBAAgB;;;EAC5C,gBAAiB;IAAE,OAAO,EAAE,oBAAoB;;;EAChD;kBACiB;IAAE,OAAO,EAAE,qBAAqB;;;AD8InD,oBAAqB;EACnB,OAAO,EAAE,eAAe;;AAExB,YAAa;EAHf,oBAAqB;IAIjB,OAAO,EAAE,gBAAgB;;;;AAG7B,qBAAsB;EACpB,OAAO,EAAE,eAAe;;AAExB,YAAa;EAHf,qBAAsB;IAIlB,OAAO,EAAE,iBAAiB;;;;AAG9B,2BAA4B;EAC1B,OAAO,EAAE,eAAe;;AAExB,YAAa;EAHf,2BAA4B;IAIxB,OAAO,EAAE,uBAAuB;;;;AAIpC,YAAa;EC/JX,aAAW;IACT,OAAO,EAAE,eAAe", +"sources": ["../sass/bootstrap/_normalize.scss","../sass/bootstrap/_print.scss","../sass/bootstrap/_scaffolding.scss","../sass/bootstrap/mixins/_vendor-prefixes.scss","../sass/bootstrap/_variables.scss","../sass/bootstrap/mixins/_tab-focus.scss","../sass/bootstrap/mixins/_image.scss","../sass/bootstrap/_type.scss","../sass/bootstrap/mixins/_text-emphasis.scss","../sass/bootstrap/mixins/_background-variant.scss","../sass/bootstrap/mixins/_clearfix.scss","../sass/bootstrap/mixins/_text-overflow.scss","../sass/bootstrap/_code.scss","../sass/bootstrap/_grid.scss","../sass/bootstrap/mixins/_grid.scss","../sass/bootstrap/mixins/_grid-framework.scss","../sass/bootstrap/_tables.scss","../sass/bootstrap/mixins/_table-row.scss","../sass/bootstrap/_forms.scss","../sass/bootstrap/mixins/_forms.scss","../sass/bootstrap/_buttons.scss","../sass/bootstrap/mixins/_buttons.scss","../sass/bootstrap/mixins/_opacity.scss","../sass/bootstrap/_component-animations.scss","../sass/bootstrap/_dropdowns.scss","../sass/bootstrap/mixins/_nav-divider.scss","../sass/bootstrap/mixins/_reset-filter.scss","../sass/bootstrap/_button-groups.scss","../sass/bootstrap/mixins/_border-radius.scss","../sass/bootstrap/_input-groups.scss","../sass/bootstrap/_navs.scss","../sass/bootstrap/_navbar.scss","../sass/bootstrap/mixins/_nav-vertical-align.scss","../sass/bootstrap/_breadcrumbs.scss","../sass/bootstrap/_pagination.scss","../sass/bootstrap/mixins/_pagination.scss","../sass/bootstrap/_pager.scss","../sass/bootstrap/_labels.scss","../sass/bootstrap/mixins/_labels.scss","../sass/bootstrap/_badges.scss","../sass/bootstrap/_jumbotron.scss","../sass/bootstrap/_thumbnails.scss","../sass/bootstrap/_alerts.scss","../sass/bootstrap/mixins/_alerts.scss","../sass/bootstrap/_progress-bars.scss","../sass/bootstrap/mixins/_gradients.scss","../sass/bootstrap/mixins/_progress-bar.scss","../sass/bootstrap/_media.scss","../sass/bootstrap/_list-group.scss","../sass/bootstrap/mixins/_list-group.scss","../sass/bootstrap/_panels.scss","../sass/bootstrap/mixins/_panels.scss","../sass/bootstrap/_responsive-embed.scss","../sass/bootstrap/_wells.scss","../sass/bootstrap/_close.scss","../sass/bootstrap/_modals.scss","../sass/bootstrap/_tooltip.scss","../sass/bootstrap/mixins/_reset-text.scss","../sass/bootstrap/_popovers.scss","../sass/bootstrap/_carousel.scss","../sass/bootstrap/_utilities.scss","../sass/bootstrap/mixins/_center-block.scss","../sass/bootstrap/mixins/_hide-text.scss","../sass/bootstrap/_responsive-utilities.scss","../sass/bootstrap/mixins/_responsive-visibility.scss"], +"names": [], +"file": "bootstrap.css" +} \ No newline at end of file diff --git a/blog/assets/css/flexslider.css b/blog/assets/css/flexslider.css new file mode 100644 index 0000000..f4fa19c --- /dev/null +++ b/blog/assets/css/flexslider.css @@ -0,0 +1,275 @@ +/* + * jQuery FlexSlider v2.6.0 + * http://www.woothemes.com/flexslider/ + * + * Copyright 2012 WooThemes + * Free to use under the GPLv2 and later license. + * http://www.gnu.org/licenses/gpl-2.0.html + * + * Contributing author: Tyler Smith (@mbmufffin) + * + */ +/* ==================================================================================================================== + * FONT-FACE + * ====================================================================================================================*/ +/*@font-face { + font-family: 'flexslider-icon'; + src: url('fonts/flexslider-icon.eot'); + src: url('fonts/flexslider-icon.eot?#iefix') format('embedded-opentype'), url('fonts/flexslider-icon.woff') format('woff'), url('fonts/flexslider-icon.ttf') format('truetype'), url('fonts/flexslider-icon.svg#flexslider-icon') format('svg'); + font-weight: normal; + font-style: normal; +}*/ +/* ==================================================================================================================== + * RESETS + * ====================================================================================================================*/ +.flex-container a:hover, +.flex-slider a:hover { + outline: none; +} +.slides, +.slides > li, +.flex-control-nav, +.flex-direction-nav { + margin: 0; + padding: 0; + list-style: none; +} +.flex-pauseplay span { + text-transform: capitalize; +} +/* ==================================================================================================================== + * BASE STYLES + * ====================================================================================================================*/ +.flexslider { + margin: 0; + padding: 0; +} +.flexslider .slides > li { + display: none; + -webkit-backface-visibility: hidden; +} +.flexslider .slides img { + width: 100%; + display: block; +} +.flexslider .slides:after { + /*content: "\0020";*/ + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} +html[xmlns] .flexslider .slides { + display: block; +} +* html .flexslider .slides { + height: 1%; +} +.no-js .flexslider .slides > li:first-child { + display: block; +} +/* ==================================================================================================================== + * DEFAULT THEME + * ====================================================================================================================*/ +.flexslider { + margin: 0 0 60px; + background: #ffffff; + border: 4px solid #ffffff; + position: relative; + zoom: 1; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + -o-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); +} +.flexslider .slides { + zoom: 1; +} +.flexslider .slides img { + height: auto; + -moz-user-select: none; +} +.flex-viewport { + max-height: 2000px; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.loading .flex-viewport { + max-height: 300px; +} +.carousel li { + margin-right: 5px; +} +.flex-direction-nav { + *height: 0; +} +.flex-direction-nav a { + text-decoration: none; + display: block; + width: 40px; + height: 40px; + margin: -20px 0 0; + position: absolute; + top: 50%; + z-index: 10; + overflow: hidden; + opacity: 0; + cursor: pointer; + color: rgba(0, 0, 0, 0.8); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.flex-direction-nav a:before { + font-family: "flexslider-icon"; + font-size: 40px; + display: inline-block; + content: '\f001'; + color: rgba(0, 0, 0, 0.8); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); +} +.flex-direction-nav a.flex-next:before { + content: '\f002'; +} +.flex-direction-nav .flex-prev { + left: -50px; +} +.flex-direction-nav .flex-next { + right: -50px; + text-align: right; +} +.flexslider:hover .flex-direction-nav .flex-prev { + opacity: 0.7; + left: 10px; +} +.flexslider:hover .flex-direction-nav .flex-prev:hover { + opacity: 1; +} +.flexslider:hover .flex-direction-nav .flex-next { + opacity: 0.7; + right: 10px; +} +.flexslider:hover .flex-direction-nav .flex-next:hover { + opacity: 1; +} +.flex-direction-nav .flex-disabled { + opacity: 0!important; + filter: alpha(opacity=0); + cursor: default; + z-index: -1; +} +.flex-pauseplay a { + display: block; + width: 20px; + height: 20px; + position: absolute; + bottom: 5px; + left: 10px; + opacity: 0.8; + z-index: 10; + overflow: hidden; + cursor: pointer; + color: #000; +} +.flex-pauseplay a:before { + font-family: "flexslider-icon"; + font-size: 20px; + display: inline-block; + content: '\f004'; +} +.flex-pauseplay a:hover { + opacity: 1; +} +.flex-pauseplay a.flex-play:before { + content: '\f003'; +} +.flex-control-nav { + width: 100%; + position: absolute; + bottom: -40px; + text-align: center; +} +.flex-control-nav li { + margin: 0 6px; + display: inline-block; + zoom: 1; + *display: inline; +} +.flex-control-paging li a { + width: 11px; + height: 11px; + display: block; + background: #666; + background: rgba(0, 0, 0, 0.5); + cursor: pointer; + text-indent: -9999px; + -webkit-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -o-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} +.flex-control-paging li a:hover { + background: #333; + background: rgba(0, 0, 0, 0.7); +} +.flex-control-paging li a.flex-active { + background: #000; + background: rgba(0, 0, 0, 0.9); + cursor: default; +} +.flex-control-thumbs { + margin: 5px 0 0; + position: static; + overflow: hidden; +} +.flex-control-thumbs li { + width: 25%; + float: left; + margin: 0; +} +.flex-control-thumbs img { + width: 100%; + height: auto; + display: block; + opacity: .7; + cursor: pointer; + -moz-user-select: none; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.flex-control-thumbs img:hover { + opacity: 1; +} +.flex-control-thumbs .flex-active { + opacity: 1; + cursor: default; +} +/* ==================================================================================================================== + * RESPONSIVE + * ====================================================================================================================*/ +@media screen and (max-width: 860px) { + .flex-direction-nav .flex-prev { + opacity: 1; + left: 10px; + } + .flex-direction-nav .flex-next { + opacity: 1; + right: 10px; + } +} \ No newline at end of file diff --git a/blog/assets/css/font-awesome.min.css b/blog/assets/css/font-awesome.min.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/blog/assets/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/blog/assets/css/icomoon.css b/blog/assets/css/icomoon.css new file mode 100644 index 0000000..e2007d4 --- /dev/null +++ b/blog/assets/css/icomoon.css @@ -0,0 +1,2335 @@ +@font-face { + font-family: 'icomoon'; + src: url('res/fonts/icomoon.eot?5j2n32'); + src: url('res/fonts/icomoon.eot?5j2n32#iefix') format('embedded-opentype'), + url('res/fonts/icomoon.ttf?5j2n32') format('truetype'), + url('res/fonts/icomoon.woff?5j2n32') format('woff'), + url('res/fonts/icomoon.svg?5j2n32#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + color: #808080; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-eye2:before { + content: "\e064"; +} +.icon-paper-clip:before { + content: "\e065"; +} +.icon-mail5:before { + content: "\e066"; +} +.icon-toggle:before { + content: "\e067"; +} +.icon-layout:before { + content: "\e068"; +} +.icon-link2:before { + content: "\e069"; +} +.icon-bell2:before { + content: "\e06a"; +} +.icon-lock3:before { + content: "\e06b"; +} +.icon-unlock:before { + content: "\e06c"; +} +.icon-ribbon2:before { + content: "\e06d"; +} +.icon-image2:before { + content: "\e06e"; +} +.icon-signal:before { + content: "\e06f"; +} +.icon-target3:before { + content: "\e070"; +} +.icon-clipboard3:before { + content: "\e071"; +} +.icon-clock3:before { + content: "\e072"; +} +.icon-watch:before { + content: "\e073"; +} +.icon-air-play:before { + content: "\e074"; +} +.icon-camera3:before { + content: "\e075"; +} +.icon-video2:before { + content: "\e076"; +} +.icon-disc:before { + content: "\e077"; +} +.icon-printer3:before { + content: "\e078"; +} +.icon-monitor:before { + content: "\e079"; +} +.icon-server:before { + content: "\e07a"; +} +.icon-cog2:before { + content: "\e07b"; +} +.icon-heart3:before { + content: "\e07c"; +} +.icon-paragraph:before { + content: "\e07d"; +} +.icon-align-justify:before { + content: "\e07e"; +} +.icon-align-left:before { + content: "\e07f"; +} +.icon-align-center:before { + content: "\e080"; +} +.icon-align-right:before { + content: "\e081"; +} +.icon-book2:before { + content: "\e082"; +} +.icon-layers2:before { + content: "\e083"; +} +.icon-stack2:before { + content: "\e084"; +} +.icon-stack-2:before { + content: "\e085"; +} +.icon-paper:before { + content: "\e086"; +} +.icon-paper-stack:before { + content: "\e087"; +} +.icon-search3:before { + content: "\e088"; +} +.icon-zoom-in2:before { + content: "\e089"; +} +.icon-zoom-out2:before { + content: "\e08a"; +} +.icon-reply2:before { + content: "\e08b"; +} +.icon-circle-plus:before { + content: "\e08c"; +} +.icon-circle-minus:before { + content: "\e08d"; +} +.icon-circle-check:before { + content: "\e08e"; +} +.icon-circle-cross:before { + content: "\e08f"; +} +.icon-square-plus:before { + content: "\e090"; +} +.icon-square-minus:before { + content: "\e091"; +} +.icon-square-check:before { + content: "\e092"; +} +.icon-square-cross:before { + content: "\e093"; +} +.icon-microphone:before { + content: "\e094"; +} +.icon-record:before { + content: "\e095"; +} +.icon-skip-back:before { + content: "\e096"; +} +.icon-rewind:before { + content: "\e097"; +} +.icon-play4:before { + content: "\e098"; +} +.icon-pause3:before { + content: "\e099"; +} +.icon-stop3:before { + content: "\e09a"; +} +.icon-fast-forward:before { + content: "\e09b"; +} +.icon-skip-forward:before { + content: "\e09c"; +} +.icon-shuffle2:before { + content: "\e09d"; +} +.icon-repeat:before { + content: "\e09e"; +} +.icon-folder2:before { + content: "\e09f"; +} +.icon-umbrella:before { + content: "\e0a0"; +} +.icon-moon:before { + content: "\e0a1"; +} +.icon-thermometer:before { + content: "\e0a2"; +} +.icon-drop:before { + content: "\e0a3"; +} +.icon-sun2:before { + content: "\e0a4"; +} +.icon-cloud3:before { + content: "\e0a5"; +} +.icon-cloud-upload2:before { + content: "\e0a6"; +} +.icon-cloud-download2:before { + content: "\e0a7"; +} +.icon-upload4:before { + content: "\e0a8"; +} +.icon-download4:before { + content: "\e0a9"; +} +.icon-location3:before { + content: "\e0aa"; +} +.icon-location-2:before { + content: "\e0ab"; +} +.icon-map3:before { + content: "\e0ac"; +} +.icon-battery:before { + content: "\e0ad"; +} +.icon-head:before { + content: "\e0ae"; +} +.icon-briefcase3:before { + content: "\e0af"; +} +.icon-speech-bubble:before { + content: "\e0b0"; +} +.icon-anchor2:before { + content: "\e0b1"; +} +.icon-globe2:before { + content: "\e0b2"; +} +.icon-box:before { + content: "\e0b3"; +} +.icon-reload:before { + content: "\e0b4"; +} +.icon-share3:before { + content: "\e0b5"; +} +.icon-marquee:before { + content: "\e0b6"; +} +.icon-marquee-plus:before { + content: "\e0b7"; +} +.icon-marquee-minus:before { + content: "\e0b8"; +} +.icon-tag:before { + content: "\e0b9"; +} +.icon-power2:before { + content: "\e0ba"; +} +.icon-command2:before { + content: "\e0bb"; +} +.icon-alt:before { + content: "\e0bc"; +} +.icon-esc:before { + content: "\e0bd"; +} +.icon-bar-graph:before { + content: "\e0be"; +} +.icon-bar-graph-2:before { + content: "\e0bf"; +} +.icon-pie-graph:before { + content: "\e0c0"; +} +.icon-star:before { + content: "\e0c1"; +} +.icon-arrow-left3:before { + content: "\e0c2"; +} +.icon-arrow-right3:before { + content: "\e0c3"; +} +.icon-arrow-up3:before { + content: "\e0c4"; +} +.icon-arrow-down3:before { + content: "\e0c5"; +} +.icon-volume:before { + content: "\e0c6"; +} +.icon-mute:before { + content: "\e0c7"; +} +.icon-content-right:before { + content: "\e100"; +} +.icon-content-left:before { + content: "\e101"; +} +.icon-grid2:before { + content: "\e102"; +} +.icon-grid-2:before { + content: "\e103"; +} +.icon-columns:before { + content: "\e104"; +} +.icon-loader:before { + content: "\e105"; +} +.icon-bag:before { + content: "\e106"; +} +.icon-ban:before { + content: "\e107"; +} +.icon-flag3:before { + content: "\e108"; +} +.icon-trash:before { + content: "\e109"; +} +.icon-expand2:before { + content: "\e110"; +} +.icon-contract:before { + content: "\e111"; +} +.icon-maximize:before { + content: "\e112"; +} +.icon-minimize:before { + content: "\e113"; +} +.icon-plus2:before { + content: "\e114"; +} +.icon-minus2:before { + content: "\e115"; +} +.icon-check:before { + content: "\e116"; +} +.icon-cross2:before { + content: "\e117"; +} +.icon-move:before { + content: "\e118"; +} +.icon-delete:before { + content: "\e119"; +} +.icon-menu5:before { + content: "\e120"; +} +.icon-archive:before { + content: "\e121"; +} +.icon-inbox:before { + content: "\e122"; +} +.icon-outbox:before { + content: "\e123"; +} +.icon-file:before { + content: "\e124"; +} +.icon-file-add:before { + content: "\e125"; +} +.icon-file-subtract:before { + content: "\e126"; +} +.icon-help:before { + content: "\e127"; +} +.icon-open:before { + content: "\e128"; +} +.icon-ellipsis:before { + content: "\e129"; +} +.icon-heart4:before { + content: "\e900"; +} +.icon-cloud4:before { + content: "\e901"; +} +.icon-star2:before { + content: "\e902"; +} +.icon-tv2:before { + content: "\e903"; +} +.icon-sound:before { + content: "\e904"; +} +.icon-video3:before { + content: "\e905"; +} +.icon-trash2:before { + content: "\e906"; +} +.icon-user2:before { + content: "\e907"; +} +.icon-key3:before { + content: "\e908"; +} +.icon-search4:before { + content: "\e909"; +} +.icon-settings:before { + content: "\e90a"; +} +.icon-camera4:before { + content: "\e90b"; +} +.icon-tag2:before { + content: "\e90c"; +} +.icon-lock4:before { + content: "\e90d"; +} +.icon-bulb:before { + content: "\e90e"; +} +.icon-pen2:before { + content: "\e90f"; +} +.icon-diamond:before { + content: "\e910"; +} +.icon-display2:before { + content: "\e911"; +} +.icon-location4:before { + content: "\e912"; +} +.icon-eye3:before { + content: "\e913"; +} +.icon-bubble3:before { + content: "\e914"; +} +.icon-stack3:before { + content: "\e915"; +} +.icon-cup:before { + content: "\e916"; +} +.icon-phone3:before { + content: "\e917"; +} +.icon-news:before { + content: "\e918"; +} +.icon-mail6:before { + content: "\e919"; +} +.icon-like:before { + content: "\e91a"; +} +.icon-photo:before { + content: "\e91b"; +} +.icon-note:before { + content: "\e91c"; +} +.icon-clock4:before { + content: "\e91d"; +} +.icon-paperplane:before { + content: "\e91e"; +} +.icon-params:before { + content: "\e91f"; +} +.icon-banknote:before { + content: "\e920"; +} +.icon-data:before { + content: "\e921"; +} +.icon-music2:before { + content: "\e922"; +} +.icon-megaphone2:before { + content: "\e923"; +} +.icon-study:before { + content: "\e924"; +} +.icon-lab2:before { + content: "\e925"; +} +.icon-food:before { + content: "\e926"; +} +.icon-t-shirt:before { + content: "\e927"; +} +.icon-fire2:before { + content: "\e928"; +} +.icon-clip:before { + content: "\e929"; +} +.icon-shop:before { + content: "\e92a"; +} +.icon-calendar3:before { + content: "\e92b"; +} +.icon-wallet2:before { + content: "\e92c"; +} +.icon-vynil:before { + content: "\e92d"; +} +.icon-truck2:before { + content: "\e92e"; +} +.icon-world:before { + content: "\e92f"; +} +.icon-mobile:before { + content: "\e000"; +} +.icon-laptop:before { + content: "\e001"; +} +.icon-desktop:before { + content: "\e002"; +} +.icon-tablet:before { + content: "\e003"; +} +.icon-phone:before { + content: "\e004"; +} +.icon-document:before { + content: "\e005"; +} +.icon-documents:before { + content: "\e006"; +} +.icon-search:before { + content: "\e007"; +} +.icon-clipboard:before { + content: "\e008"; +} +.icon-newspaper:before { + content: "\e009"; +} +.icon-notebook:before { + content: "\e00a"; +} +.icon-book-open:before { + content: "\e00b"; +} +.icon-browser:before { + content: "\e00c"; +} +.icon-calendar:before { + content: "\e00d"; +} +.icon-presentation:before { + content: "\e00e"; +} +.icon-picture:before { + content: "\e00f"; +} +.icon-pictures:before { + content: "\e010"; +} +.icon-video:before { + content: "\e011"; +} +.icon-camera:before { + content: "\e012"; +} +.icon-printer:before { + content: "\e013"; +} +.icon-toolbox:before { + content: "\e014"; +} +.icon-briefcase:before { + content: "\e015"; +} +.icon-wallet:before { + content: "\e016"; +} +.icon-gift:before { + content: "\e017"; +} +.icon-bargraph:before { + content: "\e018"; +} +.icon-grid:before { + content: "\e019"; +} +.icon-expand:before { + content: "\e01a"; +} +.icon-focus:before { + content: "\e01b"; +} +.icon-edit:before { + content: "\e01c"; +} +.icon-adjustments:before { + content: "\e01d"; +} +.icon-ribbon:before { + content: "\e01e"; +} +.icon-hourglass:before { + content: "\e01f"; +} +.icon-lock:before { + content: "\e020"; +} +.icon-megaphone:before { + content: "\e021"; +} +.icon-shield:before { + content: "\e022"; +} +.icon-trophy:before { + content: "\e023"; +} +.icon-flag:before { + content: "\e024"; +} +.icon-map:before { + content: "\e025"; +} +.icon-puzzle:before { + content: "\e026"; +} +.icon-basket:before { + content: "\e027"; +} +.icon-envelope:before { + content: "\e028"; +} +.icon-streetsign:before { + content: "\e029"; +} +.icon-telescope:before { + content: "\e02a"; +} +.icon-gears:before { + content: "\e02b"; +} +.icon-key:before { + content: "\e02c"; +} +.icon-paperclip:before { + content: "\e02d"; +} +.icon-attachment:before { + content: "\e02e"; +} +.icon-pricetags:before { + content: "\e02f"; +} +.icon-lightbulb:before { + content: "\e030"; +} +.icon-layers:before { + content: "\e031"; +} +.icon-pencil:before { + content: "\e032"; +} +.icon-tools:before { + content: "\e033"; +} +.icon-tools-2:before { + content: "\e034"; +} +.icon-scissors:before { + content: "\e035"; +} +.icon-paintbrush:before { + content: "\e036"; +} +.icon-magnifying-glass:before { + content: "\e037"; +} +.icon-circle-compass:before { + content: "\e038"; +} +.icon-linegraph:before { + content: "\e039"; +} +.icon-mic:before { + content: "\e03a"; +} +.icon-strategy:before { + content: "\e03b"; +} +.icon-beaker:before { + content: "\e03c"; +} +.icon-caution:before { + content: "\e03d"; +} +.icon-recycle:before { + content: "\e03e"; +} +.icon-anchor:before { + content: "\e03f"; +} +.icon-profile-male:before { + content: "\e040"; +} +.icon-profile-female:before { + content: "\e041"; +} +.icon-bike:before { + content: "\e042"; +} +.icon-wine:before { + content: "\e043"; +} +.icon-hotairballoon:before { + content: "\e044"; +} +.icon-globe:before { + content: "\e045"; +} +.icon-genius:before { + content: "\e046"; +} +.icon-map-pin:before { + content: "\e047"; +} +.icon-dial:before { + content: "\e048"; +} +.icon-chat:before { + content: "\e049"; +} +.icon-heart:before { + content: "\e04a"; +} +.icon-cloud:before { + content: "\e04b"; +} +.icon-upload:before { + content: "\e04c"; +} +.icon-download:before { + content: "\e04d"; +} +.icon-target:before { + content: "\e04e"; +} +.icon-hazardous:before { + content: "\e04f"; +} +.icon-piechart:before { + content: "\e050"; +} +.icon-speedometer:before { + content: "\e051"; +} +.icon-global:before { + content: "\e052"; +} +.icon-compass:before { + content: "\e053"; +} +.icon-lifesaver:before { + content: "\e054"; +} +.icon-clock:before { + content: "\e055"; +} +.icon-aperture:before { + content: "\e056"; +} +.icon-quote:before { + content: "\e057"; +} +.icon-scope:before { + content: "\e058"; +} +.icon-alarmclock:before { + content: "\e059"; +} +.icon-refresh:before { + content: "\e05a"; +} +.icon-happy:before { + content: "\e05b"; +} +.icon-sad:before { + content: "\e05c"; +} +.icon-facebook:before { + content: "\e05d"; +} +.icon-twitter:before { + content: "\e05e"; +} +.icon-googleplus:before { + content: "\e05f"; +} +.icon-rss:before { + content: "\e060"; +} +.icon-tumblr:before { + content: "\e061"; +} +.icon-linkedin:before { + content: "\e062"; +} +.icon-dribbble:before { + content: "\e063"; +} +.icon-home:before { + content: "\e930"; +} +.icon-home2:before { + content: "\e931"; +} +.icon-home3:before { + content: "\e932"; +} +.icon-office:before { + content: "\e933"; +} +.icon-newspaper2:before { + content: "\e934"; +} +.icon-pencil2:before { + content: "\e935"; +} +.icon-pencil22:before { + content: "\e936"; +} +.icon-quill:before { + content: "\e937"; +} +.icon-pen:before { + content: "\e938"; +} +.icon-blog:before { + content: "\e939"; +} +.icon-eyedropper:before { + content: "\e93a"; +} +.icon-droplet:before { + content: "\e93b"; +} +.icon-paint-format:before { + content: "\e93c"; +} +.icon-image:before { + content: "\e93d"; +} +.icon-images:before { + content: "\e93e"; +} +.icon-camera2:before { + content: "\e93f"; +} +.icon-headphones:before { + content: "\e940"; +} +.icon-music:before { + content: "\e941"; +} +.icon-play:before { + content: "\e942"; +} +.icon-film:before { + content: "\e943"; +} +.icon-video-camera:before { + content: "\e944"; +} +.icon-dice:before { + content: "\e945"; +} +.icon-pacman:before { + content: "\e946"; +} +.icon-spades:before { + content: "\e947"; +} +.icon-clubs:before { + content: "\e948"; +} +.icon-diamonds:before { + content: "\e949"; +} +.icon-bullhorn:before { + content: "\e94a"; +} +.icon-connection:before { + content: "\e94b"; +} +.icon-podcast:before { + content: "\e94c"; +} +.icon-feed:before { + content: "\e94d"; +} +.icon-mic2:before { + content: "\e94e"; +} +.icon-book:before { + content: "\e94f"; +} +.icon-books:before { + content: "\e950"; +} +.icon-library:before { + content: "\e951"; +} +.icon-file-text:before { + content: "\e952"; +} +.icon-profile:before { + content: "\e953"; +} +.icon-file-empty:before { + content: "\e954"; +} +.icon-files-empty:before { + content: "\e955"; +} +.icon-file-text2:before { + content: "\e956"; +} +.icon-file-picture:before { + content: "\e957"; +} +.icon-file-music:before { + content: "\e958"; +} +.icon-file-play:before { + content: "\e959"; +} +.icon-file-video:before { + content: "\e95a"; +} +.icon-file-zip:before { + content: "\e95b"; +} +.icon-copy:before { + content: "\e95c"; +} +.icon-paste:before { + content: "\e95d"; +} +.icon-stack:before { + content: "\e95e"; +} +.icon-folder:before { + content: "\e95f"; +} +.icon-folder-open:before { + content: "\e960"; +} +.icon-folder-plus:before { + content: "\e961"; +} +.icon-folder-minus:before { + content: "\e962"; +} +.icon-folder-download:before { + content: "\e963"; +} +.icon-folder-upload:before { + content: "\e964"; +} +.icon-price-tag:before { + content: "\e965"; +} +.icon-price-tags:before { + content: "\e966"; +} +.icon-barcode:before { + content: "\e967"; +} +.icon-qrcode:before { + content: "\e968"; +} +.icon-ticket:before { + content: "\e969"; +} +.icon-cart:before { + content: "\e96a"; +} +.icon-coin-dollar:before { + content: "\e96b"; +} +.icon-coin-euro:before { + content: "\e96c"; +} +.icon-coin-pound:before { + content: "\e96d"; +} +.icon-coin-yen:before { + content: "\e96e"; +} +.icon-credit-card:before { + content: "\e96f"; +} +.icon-calculator:before { + content: "\e970"; +} +.icon-lifebuoy:before { + content: "\e971"; +} +.icon-phone2:before { + content: "\e972"; +} +.icon-phone-hang-up:before { + content: "\e973"; +} +.icon-address-book:before { + content: "\e974"; +} +.icon-envelop:before { + content: "\e975"; +} +.icon-pushpin:before { + content: "\e976"; +} +.icon-location:before { + content: "\e977"; +} +.icon-location2:before { + content: "\e978"; +} +.icon-compass2:before { + content: "\e979"; +} +.icon-compass22:before { + content: "\e97a"; +} +.icon-map2:before { + content: "\e97b"; +} +.icon-map22:before { + content: "\e97c"; +} +.icon-history:before { + content: "\e97d"; +} +.icon-clock2:before { + content: "\e97e"; +} +.icon-clock22:before { + content: "\e97f"; +} +.icon-alarm:before { + content: "\e980"; +} +.icon-bell:before { + content: "\e981"; +} +.icon-stopwatch:before { + content: "\e982"; +} +.icon-calendar2:before { + content: "\e983"; +} +.icon-printer2:before { + content: "\e984"; +} +.icon-keyboard:before { + content: "\e985"; +} +.icon-display:before { + content: "\e986"; +} +.icon-laptop2:before { + content: "\e987"; +} +.icon-mobile2:before { + content: "\e988"; +} +.icon-mobile22:before { + content: "\e989"; +} +.icon-tablet2:before { + content: "\e98a"; +} +.icon-tv:before { + content: "\e98b"; +} +.icon-drawer:before { + content: "\e98c"; +} +.icon-drawer2:before { + content: "\e98d"; +} +.icon-box-add:before { + content: "\e98e"; +} +.icon-box-remove:before { + content: "\e98f"; +} +.icon-download3:before { + content: "\e990"; +} +.icon-upload2:before { + content: "\e991"; +} +.icon-floppy-disk:before { + content: "\e992"; +} +.icon-drive:before { + content: "\e993"; +} +.icon-database:before { + content: "\e994"; +} +.icon-undo:before { + content: "\e995"; +} +.icon-redo:before { + content: "\e996"; +} +.icon-undo2:before { + content: "\e997"; +} +.icon-redo2:before { + content: "\e998"; +} +.icon-forward:before { + content: "\e999"; +} +.icon-reply:before { + content: "\e99a"; +} +.icon-bubble:before { + content: "\e99b"; +} +.icon-bubbles:before { + content: "\e99c"; +} +.icon-bubbles2:before { + content: "\e99d"; +} +.icon-bubble2:before { + content: "\e99e"; +} +.icon-bubbles3:before { + content: "\e99f"; +} +.icon-bubbles4:before { + content: "\e9a0"; +} +.icon-user:before { + content: "\e9a1"; +} +.icon-users:before { + content: "\e9a2"; +} +.icon-user-plus:before { + content: "\e9a3"; +} +.icon-user-minus:before { + content: "\e9a4"; +} +.icon-user-check:before { + content: "\e9a5"; +} +.icon-user-tie:before { + content: "\e9a6"; +} +.icon-quotes-left:before { + content: "\e9a7"; +} +.icon-quotes-right:before { + content: "\e9a8"; +} +.icon-hour-glass:before { + content: "\e9a9"; +} +.icon-spinner:before { + content: "\e9aa"; +} +.icon-spinner2:before { + content: "\e9ab"; +} +.icon-spinner3:before { + content: "\e9ac"; +} +.icon-spinner4:before { + content: "\e9ad"; +} +.icon-spinner5:before { + content: "\e9ae"; +} +.icon-spinner6:before { + content: "\e9af"; +} +.icon-spinner7:before { + content: "\e9b0"; +} +.icon-spinner8:before { + content: "\e9b1"; +} +.icon-spinner9:before { + content: "\e9b2"; +} +.icon-spinner10:before { + content: "\e9b3"; +} +.icon-spinner11:before { + content: "\e9b4"; +} +.icon-binoculars:before { + content: "\e9b5"; +} +.icon-search2:before { + content: "\e9b6"; +} +.icon-zoom-in:before { + content: "\e9b7"; +} +.icon-zoom-out:before { + content: "\e9b8"; +} +.icon-enlarge:before { + content: "\e9b9"; +} +.icon-shrink:before { + content: "\e9ba"; +} +.icon-enlarge2:before { + content: "\e9bb"; +} +.icon-shrink2:before { + content: "\e9bc"; +} +.icon-key2:before { + content: "\e9bd"; +} +.icon-key22:before { + content: "\e9be"; +} +.icon-lock2:before { + content: "\e9bf"; +} +.icon-unlocked:before { + content: "\e9c0"; +} +.icon-wrench:before { + content: "\e9c1"; +} +.icon-equalizer:before { + content: "\e9c2"; +} +.icon-equalizer2:before { + content: "\e9c3"; +} +.icon-cog:before { + content: "\e9c4"; +} +.icon-cogs:before { + content: "\e9c5"; +} +.icon-hammer:before { + content: "\e9c6"; +} +.icon-magic-wand:before { + content: "\e9c7"; +} +.icon-aid-kit:before { + content: "\e9c8"; +} +.icon-bug:before { + content: "\e9c9"; +} +.icon-pie-chart:before { + content: "\e9ca"; +} +.icon-stats-dots:before { + content: "\e9cb"; +} +.icon-stats-bars:before { + content: "\e9cc"; +} +.icon-stats-bars2:before { + content: "\e9cd"; +} +.icon-trophy2:before { + content: "\e9ce"; +} +.icon-gift2:before { + content: "\e9cf"; +} +.icon-glass:before { + content: "\e9d0"; +} +.icon-glass2:before { + content: "\e9d1"; +} +.icon-mug:before { + content: "\e9d2"; +} +.icon-spoon-knife:before { + content: "\e9d3"; +} +.icon-leaf:before { + content: "\e9d4"; +} +.icon-rocket:before { + content: "\e9d5"; +} +.icon-meter:before { + content: "\e9d6"; +} +.icon-meter2:before { + content: "\e9d7"; +} +.icon-hammer2:before { + content: "\e9d8"; +} +.icon-fire:before { + content: "\e9d9"; +} +.icon-lab:before { + content: "\e9da"; +} +.icon-magnet:before { + content: "\e9db"; +} +.icon-bin:before { + content: "\e9dc"; +} +.icon-bin2:before { + content: "\e9dd"; +} +.icon-briefcase2:before { + content: "\e9de"; +} +.icon-airplane:before { + content: "\e9df"; +} +.icon-truck:before { + content: "\e9e0"; +} +.icon-road:before { + content: "\e9e1"; +} +.icon-accessibility:before { + content: "\e9e2"; +} +.icon-target2:before { + content: "\e9e3"; +} +.icon-shield2:before { + content: "\e9e4"; +} +.icon-power:before { + content: "\e9e5"; +} +.icon-switch:before { + content: "\e9e6"; +} +.icon-power-cord:before { + content: "\e9e7"; +} +.icon-clipboard2:before { + content: "\e9e8"; +} +.icon-list-numbered:before { + content: "\e9e9"; +} +.icon-list:before { + content: "\e9ea"; +} +.icon-list2:before { + content: "\e9eb"; +} +.icon-tree:before { + content: "\e9ec"; +} +.icon-menu:before { + content: "\e9ed"; +} +.icon-menu2:before { + content: "\e9ee"; +} +.icon-menu3:before { + content: "\e9ef"; +} +.icon-menu4:before { + content: "\e9f0"; +} +.icon-cloud2:before { + content: "\e9f1"; +} +.icon-cloud-download:before { + content: "\e9f2"; +} +.icon-cloud-upload:before { + content: "\e9f3"; +} +.icon-cloud-check:before { + content: "\e9f4"; +} +.icon-download2:before { + content: "\e9f5"; +} +.icon-upload22:before { + content: "\e9f6"; +} +.icon-download32:before { + content: "\e9f7"; +} +.icon-upload3:before { + content: "\e9f8"; +} +.icon-sphere:before { + content: "\e9f9"; +} +.icon-earth:before { + content: "\e9fa"; +} +.icon-link:before { + content: "\e9fb"; +} +.icon-flag2:before { + content: "\e9fc"; +} +.icon-attachment2:before { + content: "\e9fd"; +} +.icon-eye:before { + content: "\e9fe"; +} +.icon-eye-plus:before { + content: "\e9ff"; +} +.icon-eye-minus:before { + content: "\ea00"; +} +.icon-eye-blocked:before { + content: "\ea01"; +} +.icon-bookmark:before { + content: "\ea02"; +} +.icon-bookmarks:before { + content: "\ea03"; +} +.icon-sun:before { + content: "\ea04"; +} +.icon-contrast:before { + content: "\ea05"; +} +.icon-brightness-contrast:before { + content: "\ea06"; +} +.icon-star-empty:before { + content: "\ea07"; +} +.icon-star-half:before { + content: "\ea08"; +} +.icon-star-full:before { + content: "\ea09"; +} +.icon-heart2:before { + content: "\ea0a"; +} +.icon-heart-broken:before { + content: "\ea0b"; +} +.icon-man:before { + content: "\ea0c"; +} +.icon-woman:before { + content: "\ea0d"; +} +.icon-man-woman:before { + content: "\ea0e"; +} +.icon-happy3:before { + content: "\ea0f"; +} +.icon-happy2:before { + content: "\ea10"; +} +.icon-smile:before { + content: "\ea11"; +} +.icon-smile2:before { + content: "\ea12"; +} +.icon-tongue:before { + content: "\ea13"; +} +.icon-tongue2:before { + content: "\ea14"; +} +.icon-sad2:before { + content: "\ea15"; +} +.icon-sad22:before { + content: "\ea16"; +} +.icon-wink:before { + content: "\ea17"; +} +.icon-wink2:before { + content: "\ea18"; +} +.icon-grin:before { + content: "\ea19"; +} +.icon-grin2:before { + content: "\ea1a"; +} +.icon-cool:before { + content: "\ea1b"; +} +.icon-cool2:before { + content: "\ea1c"; +} +.icon-angry:before { + content: "\ea1d"; +} +.icon-angry2:before { + content: "\ea1e"; +} +.icon-evil:before { + content: "\ea1f"; +} +.icon-evil2:before { + content: "\ea20"; +} +.icon-shocked:before { + content: "\ea21"; +} +.icon-shocked2:before { + content: "\ea22"; +} +.icon-baffled:before { + content: "\ea23"; +} +.icon-baffled2:before { + content: "\ea24"; +} +.icon-confused:before { + content: "\ea25"; +} +.icon-confused2:before { + content: "\ea26"; +} +.icon-neutral:before { + content: "\ea27"; +} +.icon-neutral2:before { + content: "\ea28"; +} +.icon-hipster:before { + content: "\ea29"; +} +.icon-hipster2:before { + content: "\ea2a"; +} +.icon-wondering:before { + content: "\ea2b"; +} +.icon-wondering2:before { + content: "\ea2c"; +} +.icon-sleepy:before { + content: "\ea2d"; +} +.icon-sleepy2:before { + content: "\ea2e"; +} +.icon-frustrated:before { + content: "\ea2f"; +} +.icon-frustrated2:before { + content: "\ea30"; +} +.icon-crying:before { + content: "\ea31"; +} +.icon-crying2:before { + content: "\ea32"; +} +.icon-point-up:before { + content: "\ea33"; +} +.icon-point-right:before { + content: "\ea34"; +} +.icon-point-down:before { + content: "\ea35"; +} +.icon-point-left:before { + content: "\ea36"; +} +.icon-warning:before { + content: "\ea37"; +} +.icon-notification:before { + content: "\ea38"; +} +.icon-question:before { + content: "\ea39"; +} +.icon-plus:before { + content: "\ea3a"; +} +.icon-minus:before { + content: "\ea3b"; +} +.icon-info:before { + content: "\ea3c"; +} +.icon-cancel-circle:before { + content: "\ea3d"; +} +.icon-blocked:before { + content: "\ea3e"; +} +.icon-cross:before { + content: "\ea3f"; +} +.icon-checkmark:before { + content: "\ea40"; +} +.icon-checkmark2:before { + content: "\ea41"; +} +.icon-spell-check:before { + content: "\ea42"; +} +.icon-enter:before { + content: "\ea43"; +} +.icon-exit:before { + content: "\ea44"; +} +.icon-play2:before { + content: "\ea45"; +} +.icon-pause:before { + content: "\ea46"; +} +.icon-stop:before { + content: "\ea47"; +} +.icon-previous:before { + content: "\ea48"; +} +.icon-next:before { + content: "\ea49"; +} +.icon-backward:before { + content: "\ea4a"; +} +.icon-forward2:before { + content: "\ea4b"; +} +.icon-play3:before { + content: "\ea4c"; +} +.icon-pause2:before { + content: "\ea4d"; +} +.icon-stop2:before { + content: "\ea4e"; +} +.icon-backward2:before { + content: "\ea4f"; +} +.icon-forward3:before { + content: "\ea50"; +} +.icon-first:before { + content: "\ea51"; +} +.icon-last:before { + content: "\ea52"; +} +.icon-previous2:before { + content: "\ea53"; +} +.icon-next2:before { + content: "\ea54"; +} +.icon-eject:before { + content: "\ea55"; +} +.icon-volume-high:before { + content: "\ea56"; +} +.icon-volume-medium:before { + content: "\ea57"; +} +.icon-volume-low:before { + content: "\ea58"; +} +.icon-volume-mute:before { + content: "\ea59"; +} +.icon-volume-mute2:before { + content: "\ea5a"; +} +.icon-volume-increase:before { + content: "\ea5b"; +} +.icon-volume-decrease:before { + content: "\ea5c"; +} +.icon-loop:before { + content: "\ea5d"; +} +.icon-loop2:before { + content: "\ea5e"; +} +.icon-infinite:before { + content: "\ea5f"; +} +.icon-shuffle:before { + content: "\ea60"; +} +.icon-arrow-up-left:before { + content: "\ea61"; +} +.icon-arrow-up:before { + content: "\ea62"; +} +.icon-arrow-up-right:before { + content: "\ea63"; +} +.icon-arrow-right:before { + content: "\ea64"; +} +.icon-arrow-down-right:before { + content: "\ea65"; +} +.icon-arrow-down:before { + content: "\ea66"; +} +.icon-arrow-down-left:before { + content: "\ea67"; +} +.icon-arrow-left:before { + content: "\ea68"; +} +.icon-arrow-up-left2:before { + content: "\ea69"; +} +.icon-arrow-up2:before { + content: "\ea6a"; +} +.icon-arrow-up-right2:before { + content: "\ea6b"; +} +.icon-arrow-right2:before { + content: "\ea6c"; +} +.icon-arrow-down-right2:before { + content: "\ea6d"; +} +.icon-arrow-down2:before { + content: "\ea6e"; +} +.icon-arrow-down-left2:before { + content: "\ea6f"; +} +.icon-arrow-left2:before { + content: "\ea70"; +} +.icon-circle-up:before { + content: "\ea71"; +} +.icon-circle-right:before { + content: "\ea72"; +} +.icon-circle-down:before { + content: "\ea73"; +} +.icon-circle-left:before { + content: "\ea74"; +} +.icon-tab:before { + content: "\ea75"; +} +.icon-move-up:before { + content: "\ea76"; +} +.icon-move-down:before { + content: "\ea77"; +} +.icon-sort-alpha-asc:before { + content: "\ea78"; +} +.icon-sort-alpha-desc:before { + content: "\ea79"; +} +.icon-sort-numeric-asc:before { + content: "\ea7a"; +} +.icon-sort-numberic-desc:before { + content: "\ea7b"; +} +.icon-sort-amount-asc:before { + content: "\ea7c"; +} +.icon-sort-amount-desc:before { + content: "\ea7d"; +} +.icon-command:before { + content: "\ea7e"; +} +.icon-shift:before { + content: "\ea7f"; +} +.icon-ctrl:before { + content: "\ea80"; +} +.icon-opt:before { + content: "\ea81"; +} +.icon-checkbox-checked:before { + content: "\ea82"; +} +.icon-checkbox-unchecked:before { + content: "\ea83"; +} +.icon-radio-checked:before { + content: "\ea84"; +} +.icon-radio-checked2:before { + content: "\ea85"; +} +.icon-radio-unchecked:before { + content: "\ea86"; +} +.icon-crop:before { + content: "\ea87"; +} +.icon-make-group:before { + content: "\ea88"; +} +.icon-ungroup:before { + content: "\ea89"; +} +.icon-scissors2:before { + content: "\ea8a"; +} +.icon-filter:before { + content: "\ea8b"; +} +.icon-font:before { + content: "\ea8c"; +} +.icon-ligature:before { + content: "\ea8d"; +} +.icon-ligature2:before { + content: "\ea8e"; +} +.icon-text-height:before { + content: "\ea8f"; +} +.icon-text-width:before { + content: "\ea90"; +} +.icon-font-size:before { + content: "\ea91"; +} +.icon-bold:before { + content: "\ea92"; +} +.icon-underline:before { + content: "\ea93"; +} +.icon-italic:before { + content: "\ea94"; +} +.icon-strikethrough:before { + content: "\ea95"; +} +.icon-omega:before { + content: "\ea96"; +} +.icon-sigma:before { + content: "\ea97"; +} +.icon-page-break:before { + content: "\ea98"; +} +.icon-superscript:before { + content: "\ea99"; +} +.icon-subscript:before { + content: "\ea9a"; +} +.icon-superscript2:before { + content: "\ea9b"; +} +.icon-subscript2:before { + content: "\ea9c"; +} +.icon-text-color:before { + content: "\ea9d"; +} +.icon-pagebreak:before { + content: "\ea9e"; +} +.icon-clear-formatting:before { + content: "\ea9f"; +} +.icon-table:before { + content: "\eaa0"; +} +.icon-table2:before { + content: "\eaa1"; +} +.icon-insert-template:before { + content: "\eaa2"; +} +.icon-pilcrow:before { + content: "\eaa3"; +} +.icon-ltr:before { + content: "\eaa4"; +} +.icon-rtl:before { + content: "\eaa5"; +} +.icon-section:before { + content: "\eaa6"; +} +.icon-paragraph-left:before { + content: "\eaa7"; +} +.icon-paragraph-center:before { + content: "\eaa8"; +} +.icon-paragraph-right:before { + content: "\eaa9"; +} +.icon-paragraph-justify:before { + content: "\eaaa"; +} +.icon-indent-increase:before { + content: "\eaab"; +} +.icon-indent-decrease:before { + content: "\eaac"; +} +.icon-share:before { + content: "\eaad"; +} +.icon-new-tab:before { + content: "\eaae"; +} +.icon-embed:before { + content: "\eaaf"; +} +.icon-embed2:before { + content: "\eab0"; +} +.icon-terminal:before { + content: "\eab1"; +} +.icon-share2:before { + content: "\eab2"; +} +.icon-mail:before { + content: "\eab3"; +} +.icon-mail2:before { + content: "\eab4"; +} +.icon-mail3:before { + content: "\eab5"; +} +.icon-mail4:before { + content: "\eab6"; +} +.icon-amazon:before { + content: "\eab7"; +} +.icon-google:before { + content: "\eab8"; +} +.icon-google2:before { + content: "\eab9"; +} +.icon-google3:before { + content: "\eaba"; +} +.icon-google-plus:before { + content: "\eabb"; +} +.icon-google-plus2:before { + content: "\eabc"; +} +.icon-google-plus3:before { + content: "\eabd"; +} +.icon-hangouts:before { + content: "\eabe"; +} +.icon-google-drive:before { + content: "\eabf"; +} +.icon-facebook2:before { + content: "\eac0"; +} +.icon-facebook22:before { + content: "\eac1"; +} +.icon-instagram:before { + content: "\eac2"; +} +.icon-whatsapp:before { + content: "\eac3"; +} +.icon-spotify:before { + content: "\eac4"; +} +.icon-telegram:before { + content: "\eac5"; +} +.icon-twitter2:before { + content: "\eac6"; +} +.icon-vine:before { + content: "\eac7"; +} +.icon-vk:before { + content: "\eac8"; +} +.icon-renren:before { + content: "\eac9"; +} +.icon-sina-weibo:before { + content: "\eaca"; +} +.icon-rss2:before { + content: "\eacb"; +} +.icon-rss22:before { + content: "\eacc"; +} +.icon-youtube:before { + content: "\eacd"; +} +.icon-youtube2:before { + content: "\eace"; +} +.icon-twitch:before { + content: "\eacf"; +} +.icon-vimeo:before { + content: "\ead0"; +} +.icon-vimeo2:before { + content: "\ead1"; +} +.icon-lanyrd:before { + content: "\ead2"; +} +.icon-flickr:before { + content: "\ead3"; +} +.icon-flickr2:before { + content: "\ead4"; +} +.icon-flickr3:before { + content: "\ead5"; +} +.icon-flickr4:before { + content: "\ead6"; +} +.icon-dribbble2:before { + content: "\ead7"; +} +.icon-behance:before { + content: "\ead8"; +} +.icon-behance2:before { + content: "\ead9"; +} +.icon-deviantart:before { + content: "\eada"; +} +.icon-500px:before { + content: "\eadb"; +} +.icon-steam:before { + content: "\eadc"; +} +.icon-steam2:before { + content: "\eadd"; +} +.icon-dropbox:before { + content: "\eade"; +} +.icon-onedrive:before { + content: "\eadf"; +} +.icon-github:before { + content: "\eae0"; +} +.icon-npm:before { + content: "\eae1"; +} +.icon-basecamp:before { + content: "\eae2"; +} +.icon-trello:before { + content: "\eae3"; +} +.icon-wordpress:before { + content: "\eae4"; +} +.icon-joomla:before { + content: "\eae5"; +} +.icon-ello:before { + content: "\eae6"; +} +.icon-blogger:before { + content: "\eae7"; +} +.icon-blogger2:before { + content: "\eae8"; +} +.icon-tumblr2:before { + content: "\eae9"; +} +.icon-tumblr22:before { + content: "\eaea"; +} +.icon-yahoo:before { + content: "\eaeb"; +} +.icon-yahoo2:before { + content: "\eaec"; +} +.icon-tux:before { + content: "\eaed"; +} +.icon-appleinc:before { + content: "\eaee"; +} +.icon-finder:before { + content: "\eaef"; +} +.icon-android:before { + content: "\eaf0"; +} +.icon-windows:before { + content: "\eaf1"; +} +.icon-windows8:before { + content: "\eaf2"; +} +.icon-soundcloud:before { + content: "\eaf3"; +} +.icon-soundcloud2:before { + content: "\eaf4"; +} +.icon-skype:before { + content: "\eaf5"; +} +.icon-reddit:before { + content: "\eaf6"; +} +.icon-hackernews:before { + content: "\eaf7"; +} +.icon-wikipedia:before { + content: "\eaf8"; +} +.icon-linkedin2:before { + content: "\eaf9"; +} +.icon-linkedin22:before { + content: "\eafa"; +} +.icon-lastfm:before { + content: "\eafb"; +} +.icon-lastfm2:before { + content: "\eafc"; +} +.icon-delicious:before { + content: "\eafd"; +} +.icon-stumbleupon:before { + content: "\eafe"; +} +.icon-stumbleupon2:before { + content: "\eaff"; +} +.icon-stackoverflow:before { + content: "\eb00"; +} +.icon-pinterest:before { + content: "\eb01"; +} +.icon-pinterest2:before { + content: "\eb02"; +} +.icon-xing:before { + content: "\eb03"; +} +.icon-xing2:before { + content: "\eb04"; +} +.icon-flattr:before { + content: "\eb05"; +} +.icon-foursquare:before { + content: "\eb06"; +} +.icon-yelp:before { + content: "\eb07"; +} +.icon-paypal:before { + content: "\eb08"; +} +.icon-chrome:before { + content: "\eb09"; +} +.icon-firefox:before { + content: "\eb0a"; +} +.icon-IE:before { + content: "\eb0b"; +} +.icon-edge:before { + content: "\eb0c"; +} +.icon-safari:before { + content: "\eb0d"; +} +.icon-opera:before { + content: "\eb0e"; +} +.icon-file-pdf:before { + content: "\eb0f"; +} +.icon-file-openoffice:before { + content: "\eb10"; +} +.icon-file-word:before { + content: "\eb11"; +} +.icon-file-excel:before { + content: "\eb12"; +} +.icon-libreoffice:before { + content: "\eb13"; +} +.icon-html-five:before { + content: "\eb14"; +} +.icon-html-five2:before { + content: "\eb15"; +} +.icon-css3:before { + content: "\eb16"; +} +.icon-git:before { + content: "\eb17"; +} +.icon-codepen:before { + content: "\eb18"; +} +.icon-svg:before { + content: "\eb19"; +} +.icon-IcoMoon:before { + content: "\eb1a"; +} + diff --git a/blog/assets/css/magnific-popup.css b/blog/assets/css/magnific-popup.css new file mode 100644 index 0000000..0661578 --- /dev/null +++ b/blog/assets/css/magnific-popup.css @@ -0,0 +1,368 @@ +/* Magnific Popup CSS */ +.mfp-bg { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1042; + overflow: hidden; + position: fixed; + background: #0b0b0b; + opacity: 0.8; + filter: alpha(opacity=80); } + +.mfp-wrap { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1043; + position: fixed; + outline: none !important; + -webkit-backface-visibility: hidden; } + +.mfp-container { + text-align: center; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + padding: 0 8px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +.mfp-container:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +.mfp-align-top .mfp-container:before { + display: none; } + +.mfp-content { + position: relative; + display: inline-block; + vertical-align: middle; + margin: 0 auto; + text-align: left; + z-index: 1045; } + +.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content { + width: 100%; + cursor: auto; } + +.mfp-ajax-cur { + cursor: progress; } + +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { + cursor: -moz-zoom-out; + cursor: -webkit-zoom-out; + cursor: zoom-out; } + +.mfp-zoom { + cursor: pointer; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + cursor: zoom-in; } + +.mfp-auto-cursor .mfp-content { + cursor: auto; } + +.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; } + +.mfp-loading.mfp-figure { + display: none; } + +.mfp-hide { + display: none !important; } + +.mfp-preloader { + color: #cccccc; + position: absolute; + top: 50%; + width: auto; + text-align: center; + margin-top: -0.8em; + left: 8px; + right: 8px; + z-index: 1044; } + .mfp-preloader a { + color: #cccccc; } + .mfp-preloader a:hover { + color: white; } + +.mfp-s-ready .mfp-preloader { + display: none; } + +.mfp-s-error .mfp-content { + display: none; } + +button.mfp-close, button.mfp-arrow { + overflow: visible; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + display: block; + outline: none; + padding: 0; + z-index: 1046; + -webkit-box-shadow: none; + box-shadow: none; } +button::-moz-focus-inner { + padding: 0; + border: 0; } + +.mfp-close { + width: 44px; + height: 44px; + line-height: 44px; + position: absolute; + right: 0; + top: 0; + text-decoration: none; + text-align: center; + opacity: 0.65; + filter: alpha(opacity=65); + padding: 0 0 18px 10px; + color: white; + font-style: normal; + font-size: 28px; + font-family: Arial, Baskerville, monospace; } + .mfp-close:hover, .mfp-close:focus { + opacity: 1; + filter: alpha(opacity=100); } + .mfp-close:active { + top: 1px; } + +.mfp-close-btn-in .mfp-close { + color: #333333; } + +.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close { + color: white; + right: -6px; + text-align: right; + padding-right: 6px; + width: 100%; } + +.mfp-counter { + position: absolute; + top: 0; + right: 0; + color: #cccccc; + font-size: 12px; + line-height: 18px; } + +.mfp-arrow { + position: absolute; + opacity: 0.65; + filter: alpha(opacity=65); + margin: 0; + top: 50%; + margin-top: -55px; + padding: 0; + width: 90px; + height: 110px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + .mfp-arrow:active { + margin-top: -54px; } + .mfp-arrow:hover, .mfp-arrow:focus { + opacity: 1; + filter: alpha(opacity=100); } + .mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + left: 0; + top: 0; + margin-top: 35px; + margin-left: 35px; + border: medium inset transparent; } + .mfp-arrow:after, .mfp-arrow .mfp-a { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before, .mfp-arrow .mfp-b { + border-top-width: 21px; + border-bottom-width: 21px; + opacity: 0.7; } + +.mfp-arrow-left { + left: 0; } + .mfp-arrow-left:after, .mfp-arrow-left .mfp-a { + border-right: 17px solid white; + margin-left: 31px; } + .mfp-arrow-left:before, .mfp-arrow-left .mfp-b { + margin-left: 25px; + border-right: 27px solid #3f3f3f; } + +.mfp-arrow-right { + right: 0; } + .mfp-arrow-right:after, .mfp-arrow-right .mfp-a { + border-left: 17px solid white; + margin-left: 39px; } + .mfp-arrow-right:before, .mfp-arrow-right .mfp-b { + border-left: 27px solid #3f3f3f; } + +.mfp-iframe-holder { + padding-top: 40px; + padding-bottom: 40px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } + +.mfp-iframe-scaler { + width: 100%; + height: 0; + overflow: hidden; + padding-top: 56.25%; } + .mfp-iframe-scaler iframe { + position: absolute; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: black; } + +/* Main image in popup */ +img.mfp-img { + width: auto; + max-width: 100%; + height: auto; + display: block; + line-height: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 40px 0 40px; + margin: 0 auto; } + +/* The shadow behind the image */ +.mfp-figure { + line-height: 0; } + .mfp-figure:after { + content: ''; + position: absolute; + left: 0; + top: 40px; + bottom: 40px; + display: block; + right: 0; + width: auto; + height: auto; + z-index: -1; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #444444; } + .mfp-figure small { + color: #bdbdbd; + display: block; + font-size: 12px; + line-height: 14px; } + .mfp-figure figure { + margin: 0; } + +.mfp-bottom-bar { + margin-top: -36px; + position: absolute; + top: 100%; + left: 0; + width: 100%; + cursor: auto; } + +.mfp-title { + text-align: left; + line-height: 18px; + color: #f3f3f3; + word-wrap: break-word; + padding-right: 36px; } + +.mfp-image-holder .mfp-content { + max-width: 100%; } + +.mfp-gallery .mfp-image-holder .mfp-figure { + cursor: pointer; } + +@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { + /** + * Remove all paddings around the image on small screen + */ + .mfp-img-mobile .mfp-image-holder { + padding-left: 0; + padding-right: 0; } + .mfp-img-mobile img.mfp-img { + padding: 0; } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } + .mfp-img-mobile .mfp-bottom-bar { + background: rgba(0, 0, 0, 0.6); + bottom: 0; + margin: 0; + top: auto; + padding: 3px 5px; + position: fixed; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .mfp-img-mobile .mfp-bottom-bar:empty { + padding: 0; } + .mfp-img-mobile .mfp-counter { + right: 5px; + top: 3px; } + .mfp-img-mobile .mfp-close { + top: 0; + right: 0; + width: 35px; + height: 35px; + line-height: 35px; + background: rgba(0, 0, 0, 0.6); + position: fixed; + text-align: center; + padding: 0; } } + +@media all and (max-width: 900px) { + .mfp-arrow { + -webkit-transform: scale(0.75); + transform: scale(0.75); } + .mfp-arrow-left { + -webkit-transform-origin: 0; + transform-origin: 0; } + .mfp-arrow-right { + -webkit-transform-origin: 100%; + transform-origin: 100%; } + .mfp-container { + padding-left: 6px; + padding-right: 6px; } } + +.mfp-ie7 .mfp-img { + padding: 0; } +.mfp-ie7 .mfp-bottom-bar { + width: 600px; + left: 50%; + margin-left: -300px; + margin-top: 5px; + padding-bottom: 5px; } +.mfp-ie7 .mfp-container { + padding: 0; } +.mfp-ie7 .mfp-content { + padding-top: 44px; } +.mfp-ie7 .mfp-close { + top: 0; + right: 0; + padding-top: 0; } \ No newline at end of file diff --git a/blog/assets/css/main.css b/blog/assets/css/main.css new file mode 100644 index 0000000..18b5699 --- /dev/null +++ b/blog/assets/css/main.css @@ -0,0 +1,1730 @@ + + article, + aside, + details, + figcaption, + figure, + header, + hgroup, + main, + nav, + section, + summary { + display: block + } + + audio, + canvas, + progress, + video { + display: inline-block; + vertical-align: baseline + } + + audio:not([controls]) { + display: none; + height: 0 + } + + [hidden], + template { + display: none + } + + a { + background: transparent + } + + a:active, + a:hover { + outline: 0 + } + + abbr[title] { + border-bottom: 1px dotted + } + + b, + strong { + font-weight: 700 + } + + dfn { + font-style: italic + } + + h1 { + font-size: 2em; + margin: .67em 0 + } + + mark { + background: #ff0; + color: #000 + } + + small { + font-size: 80% + } + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline + } + + sup { + top: -.5em + } + + sub { + bottom: -.25em + } + + img { + border: 0 + } + + svg:not(:root) { + overflow: hidden + } + + figure { + margin: 1em 40px + } + + hr { + box-sizing: content-box; + height: 0 + } + + pre { + overflow: auto + } + + code, + kbd, + pre, + samp { + font-family: monospace, monospace; + font-size: 1em + } + + button, + input, + optgroup, + select, + textarea { + color: inherit; + font: inherit; + margin: 0 + } + + button { + overflow: visible + } + + button, + select { + text-transform: none + } + + button, + html input[type="button"], + input[type="reset"], + input[type="submit"] { + -webkit-appearance: button; + cursor: pointer + } + + button[disabled], + html input[disabled] { + cursor: default + } + + button::-moz-focus-inner, + input::-moz-focus-inner { + border: 0; + padding: 0 + } + + input { + line-height: normal + } + + input[type="checkbox"], + input[type="radio"] { + box-sizing: border-box; + padding: 0 + } + + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + height: auto + } + + input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box + } + + input[type="search"]::-webkit-search-cancel-button, + input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none + } + + fieldset { + border: 1px solid silver; + margin: 0 2px; + padding: .35em .625em .75em + } + + legend { + border: 0; + padding: 0 + } + + textarea { + overflow: auto + } + + optgroup { + font-weight: 700 + } + + table { + border-collapse: collapse; + border-spacing: 0 + } + + td, + th { + padding: 0 + } + + a { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) + } + + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), url(https://fonts.gstatic.com/s/opensans/v10/DXI1ORHCpsQm3Vp6mXoaTRampu5_7CjHW5spxoeN3Vs.woff2) format('woff2') + } + + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans Extrabold'), local('OpenSans-Extrabold'), url(https://fonts.gstatic.com/s/opensans/v10/EInbV5DfGHOiMmvb1Xr-hiYtBUPDK3WL7KRKS_3q7OE.woff2) format('woff2') + } + + h1, + h2, + h3, + h4 { + font-weight: 800; + font-style: normal + } + + @-webkit-keyframes pulse { + from { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + opacity: .4; + top: 0 + } + 50% { + -ms-filter: none; + -webkit-filter: none; + filter: none; + opacity: 1; + top: -10px + } + to { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + opacity: .4; + top: 0 + } + } + + @keyframes pulse { + from { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + opacity: .4; + top: 0 + } + 50% { + -ms-filter: none; + -webkit-filter: none; + filter: none; + opacity: 1; + top: -10px + } + to { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + opacity: .4; + top: 0 + } + } + + .icons-home { + text-align: center + } + + .icons-home a { + display: inline-block; + padding: .938rem; + margin: .125rem; + border-radius: 50%; + border: .125rem solid #fff; + line-height: 0; + transition: all .7s + } + + .icons-home a .icon { + fill: #fff; + width: 18px; + height: 18px + } + + @media only screen and (min-width:37.5rem) { + .icons-home a .icon { + width: 30px; + height: 30px + } + } + + .icons-home a:hover { + background: #fff + } + + .icons-home a:hover .icon { + fill: rgb(0,86,167) + } + + .down { + position: absolute; + bottom: 50px; + width: 100%; + display: block; + text-align: center + } + + .down .icon { + position: absolute; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + width: 100px; + height: 100px; + fill: #fff; + -webkit-animation: pulse 1.3s infinite; + animation: pulse 1.3s infinite + } + + *, + *:before, + *:after { + box-sizing: border-box + } + + body { + left: 0; + right: 0; + margin: auto + } + + a, + aside, + .overlay, + body { + transition: all .25s ease + } + + a.slideButton, + .dosearch { + position: absolute; + display: block; + width: 40px; + height: 40px; + top: 10px; + z-index: 31 + } + + .slideButton { + left: 10px + } + + .dosearch { + right: 10px; + background: #0558c6; + border-radius: .188rem; + padding: .125rem .188rem + } + + .icon-menu { + cursor: pointer; + padding: .313rem; + border-radius: .188rem; + background: #0558c6; + width: 2.5rem; + height: 2.5rem; + fill: #fff + } + + .icon-search { + width: 2.188rem; + height: 2.188rem + } + + .overlay { + cursor: pointer + } + + #close { + display: none + } + + aside { + position: fixed; + height: 100%; + width: 15rem; + padding: 2.5rem 0 0; + top: 0; + left: -15rem; + background: #3f3f3f; + z-index: 20; + box-shadow: inset -10px -1px 15px -9px rgba(0, 0, 0, .5) + } + + aside h2 { + text-align: center; + margin: 0 0 .625rem; + font-family: 'Open Sans', sans-serif; + font-weight: 800; + font-style: normal; + font-size: 1.25rem; + color: #fff + } + + aside nav ul { + padding: 0 + } + + aside nav li { + margin: 0; + list-style-type: none + } + + aside nav li a { + width: 100%; + display: block; + padding: 1.25rem; + text-decoration: none; + font-family: 'Open Sans', sans-serif; + font-weight: 300; + font-style: normal; + color: #b3b3b1; + border-top: 1px solid #797979 + } + + aside nav li a:hover { + color: #191918; + background: #fff + } + + aside nav .feed { + border-bottom: 1px solid #797979 + } + + aside.slide { + left: 0 + } + + a.slideButton.slide { + left: 15.625rem; + pointer-events: none + } + + .overlay { + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + pointer-events: none; + background: transparent; + z-index: 30 + } + + .overlay.slide { + pointer-events: auto; + left: 240px; + background: rgba(0, 0, 0, .6) + } + + input[type="search"] { + -ms-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield + } + + input[type="search"]::-webkit-search-decoration, + input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none + } + + .search-wrapper { + -webkit-transform: translateY(-400px); + transform: translateY(-400px); + z-index: 9999 + } + + .search-wrapper.active { + -webkit-transform: translateY(0); + transform: translateY(0) + } + + .search-form { + position: relative; + top: 0; + -webkit-transform: translateX(-200px); + transform: translateX(-200px); + z-index: 9999; + width: 100%; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + transition: all 200ms 100ms cubic-bezier(0, .6, .4, 1) + } + + .search-form h4 { + margin: .625rem 0 + } + + .search-form .search-field { + width: 100%; + font-family: 'Open Sans', sans-serif; + font-weight: 300; + font-style: normal; + font-size: 1.625rem; + color: #fff; + background-color: transparent; + border: 0; + border-bottom: 1px solid #fff; + border-radius: 0; + box-shadow: none; + background-clip: padding-box; + -webkit-appearance: none + } + + .search-form .search-field:focus { + outline: 0; + box-shadow: none + } + + .search-form.active { + top: 0; + -webkit-transform: translateX(0); + transform: translateX(0); + -ms-filter: none; + -webkit-filter: none; + filter: none; + opacity: 1 + } + + .search-form.hidden { + display: none + } + + .search-form .icon-remove-sign { + position: absolute; + top: 0; + right: 0; + z-index: 1; + display: block; + fill: #fff; + width: 30px; + height: 30px; + text-align: center; + cursor: pointer + } + + .search-form::-webkit-input-placeholder { + font-size: 1.625rem + } + + .search-form .search-field::-webkit-search-decoration, + .search-form .search-field::-webkit-search-cancel-button, + .search-form .search-field::-webkit-search-results-button, + .search-form .search-field::-webkit-search-results-decoration { + display: none + } + + .search-form .search-list { + position: absolute; + width: 100%; + font-family: 'Open Sans', sans-serif; + font-weight: 300; + font-style: normal + } + + .search-form h4, + .search-form li, + .search-form p, + .search-form a, + .search-form a:hover { + color: #fff + } + + body.search-overlay { + overflow: hidden + } + + body.search-overlay:after { + position: absolute; + top: 0; + left: 0; + z-index: 9001; + width: 100%; + height: 100%; + min-height: 100%; + background-color: rgba(0, 0, 0, .6); + content: '' + } + + @media only screen and (max-width:37.5rem) { + body.search-overlay:after { + background-color: #499bef + } + } + + .search-wrapper { + position: absolute; + top: 50px; + width: 100%; + padding-right: 10%; + padding-left: 10% + } + + .search-wrapper :after, + .search-wrapper :before { + display: table; + line-height: 0; + content: "" + } + + .search-wrapper :after { + clear: both + } + + .search-wrapper:before, + .search-wrapper:after { + display: table; + line-height: 0; + content: "" + } + + .search-list { + padding: 0; + margin: 0; + list-style-type: none + } + + .search-list .entry-date { + float: right; + display: none; + font-size: 14px; + text-transform: uppercase + } + + .search-list a { + text-decoration: none; + display: block; + padding: .938rem 0; + width: 100%; + border-bottom: 1px solid #fff + } + + .search-list a:hover { + color: #b3b3b3; + border-bottom: 1px solid #b3b3b3 + } + + @media only screen and (min-width:48em) { + .search-wrapper { + top: 100px + } + .search-list .entry-date { + display: inline + } + } + + .tags { + margin-top: 1.875rem + } + + .tags a { + font-size: 1.45rem; + color: #499bef; + display: inline-block; + border: 1px solid #499bef; + border-radius: .313rem; + padding: .25rem .625rem; + margin-right: .125rem; + margin-bottom: .5rem; + text-decoration: none + } + + .tags a:hover { + color: #fff; + background-color: rgb(0,86,167); + border: 1px solid rgb(0,86,167); + } + + .img-rounded { + border-radius: 50% + } + + html, + body { + height: 100% + } + + .header-site, + .header-post { + background: rgb(0,86,167); + height: 100% + } + + .header-site .content, + .header-post .content { + width: 95%; + position: absolute; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center + } + + .header-site h1, + .header-site h2 { + color: #fff; + text-align: center + } + + .header-site .site-title { + font-size: 3.75rem; + line-height: 1; + margin-top: -80px; + display: block + } + + @media only screen and (min-width:37.5rem) { + .header-site .site-title { + margin-bottom: 0; + font-size: 6.25rem + } + } + + .header-site .site-description { + font-size: 1.25rem; + display: block; + margin: 1.875rem 0 + } + + @media only screen and (min-width:37.5rem) { + .header-site .site-description { + font-size: 2.5rem + } + } + + @media only screen and (min-width:768px) { + .header-post .content { + width: auto; + max-width: 1000px; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0 + } + .header-post .content:before, + .header-post .content:after { + content: ''; + display: table + } + .header-post .content:after { + clear: both + } + } + + .header-post .subheader { + display: table; + padding: 20px + } + + .header-post .subheader a { + border: 2px solid #fff; + border-radius: 20px; + padding: 0 10px + } + + @media only screen and (min-width:37.5rem) { + .header-post .subheader a { + padding: 0 10px + } + } + + .header-post .date { + font-family: 'Open Sans', sans-serif; + font-weight: 300; + font-style: normal; + font-size: 1rem + } + + .header-post h1 { + text-transform: uppercase; + font-size: 1.875rem; + margin: 0 0 30px + } + + @media only screen and (min-width:37.5rem) { + .header-post h1 { + font-size: 3.75rem + } + } + + .header-post .subtitle { + font-weight: 300; + font-style: normal; + font-size: 1.25rem + } + + .header-post h1, + .header-post .subtitle, + .header-post .date { + color: #fff; + text-align: center + } + + .header-post p { + color: #fff; + text-decoration: none; + font-weight: 300; + font-style: normal; + font-size: 1.125rem + } + + .post-item { + text-align: left; + padding: 2.5rem 0; + border-bottom: 3px solid #f2f2f2; + width: auto; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + width: 100%; + } + + .post-item:before, + .post-item:after { + content: ''; + display: table + } + + .post-item:after { + clear: both + } + + @media only screen and (max-width:62.5rem) { + .post-item { + padding-left: 1.25rem; + padding-right: 1.25rem + } + } + + .post-item .datetime { + float: left; + clear: none; + text-align: inherit; + width: 20%; + padding: 0 2%; + margin-left: 0%; + margin-right: 3%; + text-align: center; + text-decoration: none + } + + .post-item .datetime:before, + .post-item .datetime:after { + content: ''; + display: table + } + + .post-item .datetime:after { + clear: both + } + + .post-item .datetime:last-child { + margin-right: 0% + } + + @media only screen and (max-width:768px) { + .post-item .datetime { + display: block; + clear: both; + float: none; + width: 100%; + margin-left: auto; + margin-right: auto + } + .post-item .datetime:first-child { + margin-left: auto + } + .post-item .datetime:last-child { + margin-right: auto + } + } + + .post-item .datetime .day { + display: block; + font-family: 'Open Sans', sans-serif; + font-weight: 800; + font-style: normal; + color: rgb(0,86,167); + font-size: 8rem; + line-height: 1.6 + } + + @media only screen and (max-width:768px) { + .post-item .datetime .day { + display: block; + clear: both; + float: none; + width: 100%; + margin-left: auto; + margin-right: auto + } + .post-item .datetime .day:first-child { + margin-left: auto + } + .post-item .datetime .day:last-child { + margin-right: auto + } + } + + .post-item .datetime .month-year { + color: #000; + font-size: 2.5rem; + font-weight: 500; + } + + .post-item .content { + float: left; + clear: none; + text-align: inherit; + width: 77%; + margin-left: 0%; + margin-right: 3% + } + + .post-item .content:before, + .post-item .content:after { + content: ''; + display: table + } + + .post-item .content:after { + clear: both + } + + .post-item .content:last-child { + margin-right: 0% + } + + @media only screen and (max-width:768px) { + .post-item .content { + display: block; + clear: both; + float: none; + width: 100%; + margin-left: auto; + margin-right: auto + } + .post-item .content:first-child { + margin-left: auto + } + .post-item .content:last-child { + margin-right: auto + } + } + + .post-item .content a { + text-decoration: none + } + + .post-item .content .date { + color: rgb(0,86,167) + } + + .post-item .content .post-title { + color: #000; + font-weight: bold; + } + + @media only screen and (max-width:768px) { + .post-item .content .post-title { + text-align: center; + margin-top: 30px; + } + } + + .post-item .content .description { + color: #333; + font-weight: 300; + font-style: normal; + padding-right: 3%; + } + + @media only screen and (max-width:768px) { + .post-item .content .description { + padding: 0 3%; + } + } + + .post-content { + padding: 2.5rem 0 + } + + .post-content img { + max-width: 100%; + margin: 1.875rem auto; + display: block + } + + .post-content p, + .post-content h1, + .post-content h2, + .post-content h3, + .post-content h4, + .post-content ul, + .post-content ol, + .post-content iframe { + width: auto; + max-width: 50rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + padding: 0 1.25rem; + margin: 0 auto 1.875rem; + font-weight: 300; + font-style: normal; + font-size: 1.125rem; + line-height: 2; + } + + .post-content .tags { + width: auto; + max-width: 50rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + padding: 0 1.25rem; + margin: 0 auto 1.875rem; + font-weight: 300; + font-style: normal; + font-size: 1.6rem; + line-height: 2; + letter-spacing: .01rem + } + + .post-content p:before, + .post-content h1:before, + .post-content h2:before, + .post-content h3:before, + .post-content h4:before, + .post-content ul:before, + .post-content ol:before, + .post-content .tags:before, + .post-content iframe:before, + .post-content p:after, + .post-content h1:after, + .post-content h2:after, + .post-content h3:after, + .post-content h4:after, + .post-content ul:after, + .post-content ol:after, + .post-content .tags:after, + .post-content iframe:after { + content: '' + } + + .post-content p:after, + .post-content h1:after, + .post-content h2:after, + .post-content h3:after, + .post-content h4:after, + .post-content ul:after, + .post-content ol:after, + .post-content .tags:after, + .post-content iframe:after { + clear: both + } + + @media only screen and (min-width:37.5rem) { + .post-content p, + .post-content h1, + .post-content h2, + .post-content h3, + .post-content h4, + .post-content ul, + .post-content ol, + .post-content iframe { + font-size: 1.25rem + } + } + + .post-content p, + .post-content li { + color: #333 + } + + .post-content p code, + .post-content li code { + color: #3085f4 + } + + .post-content a { + font-weight: 300; + font-style: normal; + color: rgb(0,86,167); + text-decoration: none; + border-bottom: 2px solid rgb(0,86,167) + } + + .post-content iframe { + margin-top: 1.875rem; + width: 100% + } + + .post-content #twitter-widget-0 { + margin: auto!important + } + + .post-content h1, + .post-content h2, + .post-content h3, + .post-content h4, + .post-content h5 { + font-weight: 800; + font-style: normal + } + + .post-content h1 { + font-size: 1.875rem; + line-height: 1.4 + } + + @media only screen and (min-width:37.5rem) { + .post-content h1 { + font-size: 2.813rem + } + } + + .post-content h2 { + font-size: 1.375rem; + line-height: 1.4 + } + + @media only screen and (min-width:37.5rem) { + .post-content h2 { + font-size: 2.188rem + } + } + + .post-content h3 { + font-size: 1.125rem; + line-height: 1.4 + } + + @media only screen and (min-width:37.5rem) { + .post-content h3 { + font-size: 1.563rem + } + } + + .post-content ul, + .post-content ol { + padding-left: 2.5rem + } + + .post-content ul.post-list { + padding: 0 + } + + @media only screen and (max-width:37.5rem) { + .post-content ul.post-list { + padding: 0 1.25rem + } + } + + .post-content blockquote { + width: auto; + max-width: 45.625rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + border-left: .313rem solid rgb(0,86,167); + padding: 0 1.875rem; + margin: 3.125rem auto + } + + .post-content blockquote:before, + .post-content blockquote:after { + content: ''; + display: table + } + + .post-content blockquote:after { + clear: both + } + + @media only screen and (max-width:37.5rem) { + .post-content blockquote { + width: 70% + } + } + + .post-content blockquote p { + color: rgba(0, 0, 0, .6); + margin: 0 + } + + @media only screen and (max-width:37.5rem) { + .post-content blockquote p { + font-size: 1.125rem; + line-height: 1.5; + padding: 0 + } + } + + .post-content hr { + *zoom: 1; + width: auto; + max-width: 47.5rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + border: 1px solid #f2f2f2; + margin: 50px auto + } + + .post-content hr:before, + .post-content hr:after { + content: ''; + display: table + } + + .post-content hr:after { + clear: both + } + + .share { + *zoom: 1; + width: auto; + max-width: 800px; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + text-align: center; + border-top: 1px solid #f2f2f2; + padding-top: 1.25rem + } + + .share:before, + .share:after { + content: ''; + display: table + } + + .share:after { + clear: both + } + + .share svg { + margin: .938rem; + width: 35px; + height: 35px + } + + .share a { + text-decoration: none + } + + .share a:hover svg { + fill: rgb(0,86,167) + } + + table { + margin: 3.125rem auto + } + + @media only screen and (max-width:37.5rem) { + table { + display: none + } + } + + table th, + table td { + border: .125rem solid #ccc; + padding: .313rem + } + + .tag-title { + font-weight: 300; + font-style: normal; + font-size: 2.25rem; + margin-top: 3.75rem; + *zoom: 1; + width: auto; + max-width: 50rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0 + } + + .tag-title:before, + .tag-title:after { + content: ''; + display: table + } + + .tag-title:after { + clear: both + } + + @media only screen and (max-width:37.5rem) { + .tag-title { + font-size: 1.75rem; + margin-top: 1.25rem; + padding: 0 1.25rem + } + } + + .post-list { + list-style: none; + margin: 1.563rem auto + } + + @media only screen and (max-width:37.5rem) { + .post-list { + padding: 0 1.25rem + } + } + + .post-list a { + display: block; + border-bottom: 1px solid #dadada; + padding: .625rem 0; + text-decoration: none; + transition: all .5s + } + + .post-list a:hover { + color: #03316e; + border-bottom: 1px solid #03316e + } + + .post-list .entry-date { + float: right + } + + @media only screen and (max-width:37.5rem) { + .post-list .entry-date { + display: none + } + } + + pre { + background: #222; + width: 100%; + padding: 1.25rem 0; + color: #fff; + margin: 1.875rem 0; + font-size: .875rem + } + + @media only screen and (min-width:37.5rem) { + pre { + font-size: 1rem; + padding: 2.5rem 0; + margin: 3.125rem 0 + } + } + + pre code { + *zoom: 1; + width: auto; + max-width: 50rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + padding: 0 1.25rem + } + + pre code:before, + pre code:after { + content: ''; + display: table + } + + pre code:after { + clear: both + } + + @media only screen and (max-width:37.5rem) { + pre code { + overflow-x: scroll + } + } + + pre span { + line-height: 1.5rem; + font-family: 'Monaco', 'Consolas', 'Menlo', monospace + } + + .highlight { + margin: 0 + } + + @media only screen and (min-width:37.5rem) { + .highlight { + word-wrap: break-word + } + } + + .highlight .hll { + background-color: #333 + } + + .highlight .c, + .highlight .cm, + .highlight .cp, + .highlight .c1, + .highlight .cs { + color: #75715e + } + + .highlight .err { + color: #960050; + background-color: #1e0010 + } + + .highlight .k, + .highlight .kc, + .highlight .kd, + .highlight .kp, + .highlight .kr, + .highlight .kt, + .highlight .no { + color: #66d9ef + } + + .highlight .l, + .highlight .mf, + .highlight .mh, + .highlight .mi, + .highlight .mo, + .highlight .se, + .highlight .il { + color: #ae81ff + } + + .highlight .o, + .highlight .p { + color: #f7f7f2 + } + + .highlight .m, + .highlight .n, + .highlight .nb, + .highlight .ni, + .highlight .nl, + .highlight .nn, + .highlight .py, + .highlight .nv, + .highlight .w, + .highlight .bp, + .highlight .vc, + .highlight .vg, + .highlight .vi { + color: #a4d043 + } + + .highlight .kn, + .highlight .nt, + .highlight .ow { + color: #f92672 + } + + .highlight .ge { + font-style: italic + } + + .highlight .gs { + font-weight: 700 + } + + .highlight .ld, + .highlight .s, + .highlight .sb, + .highlight .sc, + .highlight .sd, + .highlight .s2, + .highlight .sh, + .highlight .si, + .highlight .sx, + .highlight .sr, + .highlight .s1, + .highlight .ss { + color: #e6db74 + } + + .highlight .na, + .highlight .nc, + .highlight .nd, + .highlight .ne, + .highlight .nf, + .highlight .nx { + color: #a6e22e + } + + .author { + background: #f2f2f2; + display: table; + width: 100%; + padding: 2.5rem 0; + margin: 2.5rem 0 + } + + @media only screen and (min-width:37.5rem) { + .author { + padding: 3.125rem 0 + } + } + + .author .details { + margin: auto; + max-width: 50rem; + padding: 0 1.25rem + } + + @media only screen and (max-width:37.5rem) { + .author .details { + text-align: center + } + } + + .author img { + border-radius: 50%; + display: block; + margin: auto + } + + @media only screen and (min-width:37.5rem) { + .author img { + float: left; + margin-right: 3.125rem + } + } + + .author .def { + color: gray; + font-size: 1.125rem; + font-weight: 300; + font-style: normal; + margin: .625rem + } + + @media only screen and (min-width:37.5rem) { + .author .def { + margin: 0; + padding-top: 1.563rem + } + } + + .author .name { + margin: 0 + } + + .author .name a { + font-weight: 800; + font-style: normal; + text-decoration: none; + color: #000; + font-size: 1.875rem + } + + .author .name a:hover { + color: rgb(0,86,167) + } + + @media only screen and (min-width:37.5rem) { + .author .name a { + font-size: 2.813rem + } + } + + .author .desc { + font-weight: 300; + font-style: normal; + margin: .625rem; + font-size: 1rem + } + + @media only screen and (min-width:37.5rem) { + .author .desc { + font-size: 1.25rem + } + } + + .author .email { + text-decoration: none; + color: rgb(0,86,167) + } + + .comments { + *zoom: 1; + width: auto; + max-width: 50rem; + float: none; + display: block; + margin-right: auto; + margin-left: auto; + padding-left: 0; + padding-right: 0; + padding: 0 1.25rem + } + + .comments:before, + .comments:after { + content: ''; + display: table + } + + .comments:after { + clear: both + } + + .comments h3 { + margin: 0 0 1.875rem; + font-size: 1.875rem + } + + .post-content p { + text-align: justify + } + + .pagination { + color: #333; + font-weight: 300; + font-style: normal; + } + + .pagelist { + list-style-type: none; + width: 100%; + text-align: center + } + + .pagelist li { + display: inline-block; + padding: .5rem + } + + + /* Style for the sidebar */ + + .post-content { + flex: 3; + } + + .content-box { + margin: 0px; + display: flex; + } + + .sidebar { + flex: 1; + margin: 30px; + margin-left: 0px; + padding-left: 30px; + border-left: 1px solid gray; + } + + .sidebar h3 { + padding: 20px 0px 10px 0; + text-overflow: clip; + white-space: nowrap; + overflow: hidden; + } + + .temp-div { + display: none; + } + + @media only screen and (max-width: 768px) { + .post-content { + padding-bottom: 0; + } + .content-box { + flex-direction: column; + } + .sidebar { + border: none; + margin-top: 0px; + } + .sidebar h3 { + padding-top: 0px; + } + } \ No newline at end of file diff --git a/blog/assets/css/monokai-sublime.css b/blog/assets/css/monokai-sublime.css new file mode 100644 index 0000000..2864170 --- /dev/null +++ b/blog/assets/css/monokai-sublime.css @@ -0,0 +1,83 @@ +/* + +Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #23241f; +} + +.hljs, +.hljs-tag, +.hljs-subst { + color: #f8f8f2; +} + +.hljs-strong, +.hljs-emphasis { + color: #a8a8a2; +} + +.hljs-bullet, +.hljs-quote, +.hljs-number, +.hljs-regexp, +.hljs-literal, +.hljs-link { + color: #ae81ff; +} + +.hljs-code, +.hljs-title, +.hljs-section, +.hljs-selector-class { + color: #a6e22e; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-name, +.hljs-attr { + color: #f92672; +} + +.hljs-symbol, +.hljs-attribute { + color: #66d9ef; +} + +.hljs-params, +.hljs-class .hljs-title { + color: #f8f8f2; +} + +.hljs-string, +.hljs-type, +.hljs-built_in, +.hljs-builtin-name, +.hljs-selector-id, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-addition, +.hljs-variable, +.hljs-template-variable { + color: #e6db74; +} + +.hljs-comment, +.hljs-deletion, +.hljs-meta { + color: #75715e; +} diff --git a/blog/assets/css/overrides.css b/blog/assets/css/overrides.css new file mode 100644 index 0000000..e69de29 diff --git a/blog/assets/css/style-overrides.css b/blog/assets/css/style-overrides.css new file mode 100644 index 0000000..4822143 --- /dev/null +++ b/blog/assets/css/style-overrides.css @@ -0,0 +1,216 @@ +/* + %1$s - epsilon_general_separator - + %2$s - epsilon_accent_color - #798eea + %3$s - epsilon_accent_color_second - #4aca85 + %4$s - epsilon_accent_color_second - #499bea + %5$s - epsilon_text_separator - + %6$s - epsilon_title_color - #303133 + %7$s - epsilon_text_color - #777777 + %8$s - epsilon_link_color - #4aca85 + %9$s - epsilon_link_hover_color - #5ed092 + + %10$s - epsilon_menu_separator + + %11$s - epsilon_menu_item_color - #ebebeb + %12$s - epsilon_menu_item_hover_color - #ffffff + %13$s - epsilon_menu_item_active_color - #0385d0 + %14$s - epsilon_dropdown_menu_background - #a1083a + %15$s - epsilon_dropdown_menu_item_color - #ebebeb + %16$s - epsilon_dropdown_menu_item_hover_color - #ffffff + %17$s - epsilon_dropdown_menu_item_active_color - #0385d0 + + %18$s - epsilon_footer_separator + + %19$s - epsilon_footer_contact_background - #0377bb + %20$s - epsilon_footer_background - #192229 + %21$s - epsilon_footer_title_color - #ffffff + %22$s - epsilon_footer_text_color - #a9afb1 + %23$s - epsilon_footer_link_color - #a9afb1 + %24$s - epsilon_footer_link_hover_color - #ffffff + */ + +/* ========================================================================== + =Accent colors + ========================================================================== */ + +/* epsilon_accent_colors */ + +.services .icon i, +.colorlib-work-featured .mobile-wrap .desc .features .icon i{ + color: %2$s; +} + +.colorlib-video a, +.colorlib-intro .play a, +.pulse, +.product-entry .product-img .tag .sale { + background-color: %2$s; +} + +.work-grid .work-img .icon, +.product-entry .product-img .tag .new, +.product-entry .product-img .cart p span a:hover, +.mc4wp-form button, +.pagination li a:hover, +.pagination li a:focus, +.pagination li.active a, +.pagination li.active a:hover, +.pagination li.active a:focus, +.btn-primary, +.btn-primary.btn-outline:hover, +.btn-primary.btn-outline:focus, +.btn-primary.btn-outline:active, +button, +html input[type="button"], +input[type="reset"], +input[type="submit"], +.colorlib-nav ul li.btn-cta a { + background-color: %3$s; +} +::-webkit-selection { + background: %3$s; +} +::-moz-selection { + background: %3$s; +} +::selection { + background: %3$s; +} +.work-grid .desc h2 a:hover, +.product-entry .desc .price span, +.pricing .price, +.contact-info-wrap-flex p span i, +.colorlib-social-icons li a, +.btn-primary.btn-outline { + color: %3$s; +} + +.pagination li a:hover, +.pagination li a:focus, +.pagination li.active a, +.pagination li.active a:hover, +.pagination li.active a:focus, +#colorlib-offcanvas ul li.btn-cta a, +.btn-primary, +.btn-primary.btn-outline, +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + border-color: %3$s; +} + +.video-hero { + background-color: %4$s; +} +.colorlib-work-featured .mobile-wrap .desc .features .icon i { + color: %4$s; +} +.video-hero .ewf-section__overlay-color, +.colorlib-counters .ewf-section__overlay-color, +.colorlib-subscribe .ewf-section__overlay-color { + background: %4$s; + background: -moz-linear-gradient(-45deg, %4$s 0%%, %2$s 100%%); + background: -webkit-gradient(left top, right bottom, color-stop(0%%, %4$s), color-stop(100%%, #798eea)); + background: -webkit-linear-gradient(-45deg, %4$s 0%%, %2$s 100%%); + background: -o-linear-gradient(-45deg, %4$s 0%%, %2$s 100%%); + background: -ms-linear-gradient(-45deg, %4$s, %2$s 100%%); + background: -webkit-linear-gradient(315deg, %4$s 0%%, %2$s 100%%); + background: -o-linear-gradient(315deg, %4$s 0%%, %2$s 100%%); + background: linear-gradient(135deg, %4$s 0%%, %2$s 100%%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='%4$s', endColorstr='%2$s', GradientType=1 ); +} + +/* end epsilon_accent_colors */ + +h1, h2, h3, h4, h5, h6, figure, +.work-flex .half .desc h2 a, +.work-grid .desc h2 a, +article h2 a, +article .admin span, +article p.author-wrap .author, +.pricing .pricing-heading { + color: %6$s; +} + +body, +.pricing p, +.post p, +#colorlib-footer .colorlib-widget p { + color: %7$s; +} + +a { + color: %8$s; +} +a:hover, +a:active, +a:focus { + color: %9$s; +} + +/* Menu */ + +.colorlib-nav ul li a { + color: %11$s; +} + +.colorlib-nav ul li a:hover { + color: %12$s; +} + +.colorlib-nav ul li.current_page_item > a, +.colorlib-nav ul li.current_page_item > a:hover { + color: %13$s; +} + +.colorlib-nav ul li.has-dropdown .dropdown { + -webkit-box-shadow: 0px 14px 33px -9px %14$s; + -moz-box-shadow: 0px 14px 33px -9px %14$s; + box-shadow: 0px 14px 33px -9px %14$s; + background-color: %14$s; +} +.colorlib-nav ul li.has-dropdown .dropdown:before { + border-bottom-color: %14$s; +} + +.colorlib-nav ul li.has-dropdown .dropdown li a { + color: %15$s; +} + +.colorlib-nav ul li.has-dropdown .dropdown li a:hover { + color: %16$s; +} + +.colorlib-nav ul li.has-dropdown .dropdown li.current_page_item > a { + color: %17$s; +} + +/* Footer */ + +#colorlib-footer { + background: %19$s; + color: %22$s; +} + +.copy { + background: %20$s; +} + +#colorlib-footer h4, +#colorlib-footer .f-blog .desc h2 a, +.copy p { + color: %21$s; +} + +#colorlib-footer .colorlib-widget p { + color: %22$s; +} + +#colorlib-footer a { + color: %23$s; +} + +#colorlib-footer a:hover { + color: %24$s; +} \ No newline at end of file diff --git a/blog/assets/css/style.css b/blog/assets/css/style.css new file mode 100644 index 0000000..b922096 --- /dev/null +++ b/blog/assets/css/style.css @@ -0,0 +1,2240 @@ +@font-face { + font-family: 'icomoon'; + src: url("../fonts/icomoon/icomoon.eot?srf3rx"); + src: url("../fonts/icomoon/icomoon.eot?srf3rx#iefix") format("embedded-opentype"), url("../fonts/icomoon/icomoon.ttf?srf3rx") format("truetype"), url("../fonts/icomoon/icomoon.woff?srf3rx") format("woff"), url("../fonts/icomoon/icomoon.svg?srf3rx#icomoon") format("svg"); + font-weight: normal; + font-style: normal; +} +/* =============== * * Template Style * * ================== */ +body { + font-family: "Poppins", Arial, sans-serif; + font-weight: 300; + font-size: 16px; + line-height: 2; + color: gray; + background: whitesmoke; +} + +#page { + position: relative; + overflow-x: hidden; + width: 100%; + height: 100%; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +.offcanvas #page { + overflow: hidden; + position: absolute; +} +.offcanvas #page:after { + -webkit-transition: 2s; + -o-transition: 2s; + transition: 2s; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 101; + background: rgba(0, 0, 0, 0.7); + content: ""; +} +a { + color: rgb(0, 86, 167); + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +a:hover, a:active, a:focus { + color: rgb(0, 86, 167); + outline: none; + text-decoration: none; +} + +.dropdown-menu { + background-color: #1a1a1a; +} + +.dropdown-item a { + -webkit-transition: 0.5s !important; + -o-transition: 0.5s !important; + transition: 0.5s !important; +} +.dropdown-item a:hover { + background-color: #252525 !important; + outline: none; + text-decoration: none; +} + +p { + margin-bottom: 20px; +} +h1, h2, h3, h4, h5, h6, figure { + color: #303133; + font-family: "Nunito", Arial, sans-serif; + font-weight: 400; + margin: 0 0 20px 0; + line-height: 1.3; +} +img{ + max-width: 100%; + height: auto; +} +::-webkit-selection { + color: #fff; + background: rgb(0, 86, 167); +} +::-moz-selection { + color: #fff; + background: rgb(0, 86, 167); +} +::selection { + color: #fff; + background: rgb(0, 86, 167); +} +select{ + width: 100%; + color: #555555; +} +option{ + color: #555555; +} +button, html input[type="button"], input[type="reset"], input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; + background: rgb(0, 86, 167); + color: #fff; + border: 1px solid rgb(0, 86, 167); + margin-right: 4px; + margin-bottom: 4px; + font-size: 14px; + font-weight: 400; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + -ms-border-radius: 30px; + border-radius: 3px; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; + padding: 10px 40px; +} +input[type="password"]{ + box-shadow: none; + border: 1px solid #f0f0f0; + font-size: 16px !important; + font-weight: 300; + background: white; + border-radius: 0px; + margin-left: 10px; + padding-left: 10px; +} +input[type=search] { + display: block; + width: 100%; + font-size: 1.2rem; + line-height: 16px; + padding: 10px 15px; + background-color: rgba(17, 17, 17, 0.15); + border: none; +} +.product-img, .work-img, .author-img, .mobile-img, .colorlib-video, .blog-img, .colorlib-about-img, .services-img, .staff-img { + background-size: cover; + background-position: center center; + background-repeat: no-repeat; + position: relative; +} +.colorlib-nav { + margin: 0; + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 9; + margin: 0 auto; +} +@media screen and (max-width: 1200px) { + .colorlib-nav { + margin: 0; + } +} +.colorlib-nav .top-menu { + padding: 15px 15px; +} +@media screen and (max-width: 1200px) { + .colorlib-nav .top-menu { + padding: 28px; + } +} +.colorlib-nav #colorlib-logo { + font-size: 20px; + margin: 0; + padding: 0; + text-transform: uppercase; + font-weight: 700; +} +.navbar-logo { + height: 40px; +} +.colorlib-nav #colorlib-logo a { + position: relative; + color: #fff; +} +.colorlib-nav #colorlib-logo a i { + color: #fff; + display: block; + font-size: 60px; + font-weight: normal; + margin-bottom: 10px; +} +@media screen and (max-width: 1200px) { + .colorlib-nav .menu-1 { + display: none; + } +} +.colorlib-nav ul { + padding: 0; + margin: 0; +} +.colorlib-nav ul li { + padding: 8px 0; + margin: 0; + list-style: none; + display: inline; + font-weight: 500; + text-transform: uppercase; + font-size: 12px; + letter-spacing: 2px; +} +.colorlib-nav ul li a { + position: relative; + padding: 20px 12px; + color: rgba(255, 255, 255, 0.9); + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +.colorlib-nav ul li a:hover { + color: #fff; +} +.colorlib-nav ul li.has-dropdown { + position: relative; +} +.colorlib-nav ul li.has-dropdown .dropdown { + width: 190px; + -webkit-box-shadow: 0px 14px 33px -9px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 14px 33px -9px rgba(0, 0, 0, 0.75); + box-shadow: 0px 14px 33px -9px rgba(0, 0, 0, 0.75); + z-index: 1002; + visibility: hidden; + opacity: 0; + position: absolute; + top: 40px; + left: 0; + text-align: left; + background: #000; + padding: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; + -webkit-transition: 0s; + -o-transition: 0s; + transition: 0s; +} +.colorlib-nav ul li.has-dropdown .dropdown:before { + bottom: 100%; + left: 40px; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; + border-bottom-color: #000; + border-width: 8px; + margin-left: -8px; +} +.colorlib-nav ul li.has-dropdown .dropdown li { + display: block; + margin-bottom: 0px; +} +.colorlib-nav ul li.has-dropdown .dropdown li:last-child { + margin-bottom: 0; +} +.colorlib-nav ul li.has-dropdown .dropdown li a { + padding: 2px 0; + display: block; + color: #999999; + line-height: 1.2; + text-transform: none; + font-size: 13px; + letter-spacing: 0; + background-color: transparent; +} +.colorlib-nav ul li.has-dropdown .dropdown li a:hover { + color: #fff; +} +.colorlib-nav ul li.btn-cta a { + color: #fff; + background: rgb(0, 86, 167); + padding: 10px 15px; + -webkit-border-radius: 100px; + -moz-border-radius: 100px; + -ms-border-radius: 100px; + border-radius: 100px; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +.colorlib-nav ul li.btn-cta a:hover { + -webkit-box-shadow: 0px 14px 20px -9px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 14px 20px -9px rgba(0, 0, 0, 0.75); + -ms-box-shadow: 0px 14px 20px -9px rgba(0, 0, 0, 0.75); + -o-box-shadow: 0px 14px 20px -9px rgba(0, 0, 0, 0.75); + box-shadow: 0px 14px 20px -9px rgba(0, 0, 0, 0.75); +} +.colorlib-nav ul li.open > a { + color: rgba(255, 255, 255, 0.5); + position: relative; +} +.colorlib-nav ul li.open > a:after { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.colorlib-video { + overflow: hidden; + position: relative; + height: 400px; +} +.colorlib-video a { + z-index: 1001; + position: absolute; + top: 50%; + left: 50%; + margin-top: -45px; + margin-left: -45px; + width: 90px; + height: 90px; + display: table; + text-align: center; + background: #798eea; + -webkit-box-shadow: 0px 14px 30px -15px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 14px 30px -15px rgba(0, 0, 0, 0.75); + -ms-box-shadow: 0px 14px 30px -15px rgba(0, 0, 0, 0.75); + -o-box-shadow: 0px 14px 30px -15px rgba(0, 0, 0, 0.75); + box-shadow: 0px 14px 30px -15px rgba(0, 0, 0, 0.75); + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +.colorlib-video a i { + text-align: center; + display: table-cell; + vertical-align: middle; + font-size: 40px; + color: #fff; +} +.colorlib-video .ewf-section__overlay-color { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.3); + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +.colorlib-video:hover .ewf-section__overlay-color { + background: rgba(0, 0, 0, 0.7); +} +.colorlib-video:hover a { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -ms-transform: scale(1.1); + -o-transform: scale(1.1); + transform: scale(1.1); +} +.video-hero { + background-size: cover; + position: relative; + background-repeat: no-repeat; + z-index: 0; + background-color: #499bea; +} +@media screen and (max-width: 768px) { + .video-hero { + height: inherit; + } +} +.video-hero .ewf-section__overlay-color { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + opacity: 0.95; + background: rgb(0, 86, 167); + background: -moz-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -webkit-gradient(left top, right bottom, color-stop(0%, #499bea), color-stop(100%, #798eea)); + background: -webkit-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -o-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -ms-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -webkit-linear-gradient(315deg, #499bea 0%, #798eea 100%); + background: -o-linear-gradient(315deg, #499bea 0%, #798eea 100%); + background: linear-gradient(135deg, #499bea 0%, #798eea 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#499bea', endColorstr='#798eea', GradientType=1 ); + z-index: 1; +} +.video-hero .display-t { + display: table; + height: 500px; + width: 100%; + z-index: 2; +} +.video-hero .display-t.display-t2 { + height: 500px; + position: absolute; + top: 0; + left: 0; +} +.video-hero .display-tc { + display: table-cell; + vertical-align: middle; + height: 500px; +} +.video-hero .display-tc .holder { + color: #fff; + font-family: "Poppins", Arial, sans-serif; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 7px; +} +.video-hero .display-tc .holder span { + position: relative; +} +.video-hero .display-tc h2 { + font-size: 60px !important; + color: #fff; + margin-bottom: 20px; + font-weight: 300; + z-index: 2; +} +@media screen and (max-width: 768px) { + .video-hero .display-tc h2 { + font-size: 34px !important; + z-index: 2; + } +} +.video-hero .display-tc p { + font-family: "Nunito", Arial, sans-serif; + color: #fff; + font-weight: 200; + font-size: 30px; +} +.breadcrumb{ + background-color: transparent; + font-size: 14px; + font-weight: 200; + color: rgba(255, 255, 255, 0.5); +} +.breadcrumb a{ + color: rgba(255, 255, 255, 0.9); +} +.breadcrumb .current{ + color: rgba(255, 255, 255, 0.5); +} +.video-hero .display-tc p.breadcrumbs { + font-size: 22px; + text-align: center; +} +.video-hero .display-tc p.breadcrumbs span { + color: #fff; +} +.video-hero .display-tc p.breadcrumbs span a { + color: black !important; +} +.video-hero .display-tc .btn-custom { + font-size: 16px; +} +.about_top{ + padding-top: 112px; +} +.about_top .colorlib-video{ + margin-bottom: 25px; +} +.colorlib-about, .colorlib-shop, .colorlib-work, .colorlib-intro, #colorlib-subscribe, .colorlib-pricing, .colorlib-services, #colorlib-contact, .colorlib-blog { + padding: 3em 0; + clear: both; +} +.colorlib-services > .container > .row > .col-md-4:nth-child(3n+1) { + clear: left; +} +.colorlib-work-featured, .colorlib-work-featured-left{ + padding-top: 7em; + padding-bottom: 0; +} +.colorlib-bg-white { + position: relative; + background: #fff; + /*border-top: 1px solid #e6e6e6;*/ + border-left: none; + border-right: none; + /*padding-top: 7em;*/ +} +.colorlib-bg-white-right { + position: relative; + background: #fff; + border-left: none; + border-right: none; + padding: 3em 0 8em; +} +.colorlib-featured { + padding-bottom: 3em; + width: 100%; +} +.colorlib-featured .featured-wrap { + margin-top: -7em; +} +.colorlib-featured .featured-entry img { + -webkit-box-shadow: 0px 3px 19px -9px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 3px 19px -9px rgba(0, 0, 0, 0.75); + box-shadow: 0px 3px 19px -9px rgba(0, 0, 0, 0.75); + margin-bottom: 20px; +} +.colorlib-featured .owl-theme .owl-dots .owl-dot span { + background: #e6e6e6; +} +.colorlib-featured .owl-theme .owl-dots .owl-dot.active span { + background: #cccccc; +} +.services { + margin-bottom: 25px; + margin-top: 25px; + position: relative; + z-index: 0; + padding: 0 1em; +} +@media screen and (max-width: 768px) { + .services { + margin-bottom: 3em; + } +} +.services .icon { + position: relative; + margin-bottom: 30px; + display: inline-block; +} +.services .icon i { + font-size: 50px; + color: rgb(0, 86, 167); + z-index: 1; +} +.services .desc h3 { + font-size: 26px; + font-weight: 300; +} +.colorlib-section{ + position: relative; +} +.colorlib-intro .colorlib-heading { + margin-bottom: 2em; +} +.colorlib-intro .play { + width: 100%; + display: block; + margin: 30px 0; +} +.colorlib-intro .play a { + width: 100px; + height: 100px; + display: table; + margin: 0 auto; + text-align: center; + background: #798eea; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +.colorlib-intro .play a i { + font-size: 20px; + color: #fff; + display: table-cell; + vertical-align: middle; +} +.pulse { + display: table; + width: 100px; + height: 100px; + background: #798eea; + cursor: pointer; + -webkit-box-shadow: 0 0 0 rgba(121, 142, 234, 0.4); + box-shadow: 0 0 0 rgba(121, 142, 234, 0.4); + -webkit-animation: pulse 2s infinite; + animation: pulse 2s infinite; + text-align: center; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +.pulse i { + font-size: 30px !important; + display: table-cell; + vertical-align: middle; +} +@-webkit-keyframes pulse { + 0% { + -webkit-box-shadow: 0 0 0 0 rgba(121, 142, 234, 0.4); + } + 70% { + -webkit-box-shadow: 0 0 0 30px rgba(121, 142, 234, 0); + } + 100% { + -webkit-box-shadow: 0 0 0 0 rgba(121, 142, 234, 0); + } +} +@keyframes pulse { + 0% { + -moz-box-shadow: 0 0 0 0 rgba(121, 142, 234, 0.4); + -webkit-box-shadow: 0 0 0 0 rgba(121, 142, 234, 0.4); + box-shadow: 0 0 0 0 rgba(121, 142, 234, 0.4); + } + 70% { + -moz-box-shadow: 0 0 0 30px rgba(121, 142, 234, 0); + -webkit-box-shadow: 0 0 0 30px rgba(121, 142, 234, 0); + box-shadow: 0 0 0 30px rgba(121, 142, 234, 0); + } + 100% { + -moz-box-shadow: 0 0 0 0 rgba(121, 142, 234, 0); + -webkit-box-shadow: 0 0 0 0 rgba(121, 142, 234, 0); + box-shadow: 0 0 0 0 rgba(121, 142, 234, 0); + } +} +.colorlib-work-featured .mobile-wrap { + margin-bottom: 4em; + display: block; +} +.colorlib-work-featured .mobile-wrap .mobile-img { + background-position: top; + height: 730px; + -webkit-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; +} +.colorlib-work-featured .mobile-wrap .desc { + padding: 30px; +} +.colorlib-work-featured .mobile-wrap .desc h2 { + font-size: 50px; + font-weight: 300; + margin-bottom: 40px; +} +@media screen and (max-width: 768px) { + .colorlib-work-featured .mobile-wrap .desc h2 { + font-size: 34px; + } +} +.colorlib-work-featured .mobile-wrap .desc .features { + position: relative; + margin-bottom: 50px; +} +.colorlib-work-featured .mobile-wrap .desc .features .icon { + position: absolute; + top: 10px; + left: 0; +} +.colorlib-work-featured .mobile-wrap .desc .features .icon i { + font-size: 30px; + color: #499bea; +} +.colorlib-work-featured .mobile-wrap .desc .features .f-desc { + padding-left: 50px; +} +.work-flex { + width: 100%; + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + margin-bottom: 40px; +} +.work-flex .half { + display: block; + width: 50%; + height: 450px; +} +.work-flex .half .display-t { + height: 450px; + display: table; +} +@media screen and (max-width: 480px) { + .work-flex .half .display-t { + display: block; + height: auto; + } +} +@media screen and (max-width: 1024px){ + .work-flex .half .display-t{ + height: 372px; + } +} +.work-flex .half .display-tc { + display: table-cell; + vertical-align: middle; +} +.work-flex .half .desc { + padding: 0 3em; + background: #fff; +} +.work-flex .half .desc h2 { + font-weight: 400; +} +.work-flex .half .desc h2 a { + color: #303133; +} +@media screen and (max-width: 480px) { + .work-flex .half { + width: 100%; + height: auto; + } +} +.work-flex .work-img { + display: block; + height: 450px; +} +.work-grid { + margin-bottom: 40px; +} +.work-grid .wp-post-image{ + margin-bottom: 0; +} +.work-grid .work-img { + display: block; + height: 270px; + position: relative; +} +.work-grid .work-img .icon { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 270px; + content: ''; + display: table; + text-align: center; + background: rgb(0, 86, 167); + opacity: 0; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +.work-grid .work-img .icon i { + display: table-cell; + vertical-align: middle; + color: #fff; + font-size: 20px; +} +.work-grid .work-img:hover .icon, .work-grid .work-img:focus .icon { + opacity: 1; +} +.work-grid .desc { + background: #fff; + padding: 25px; +} +.work-grid .desc h2 { + font-size: 24px; +} +.work-grid .desc h2 a { + color: #303133; +} +.work-grid .desc h2 a:hover { + color: rgb(0, 86, 167); +} +.colorlib-work > .container > .row > .col-md-4:nth-child(3n+1) { + clear: left; +} +@media screen and (max-width: 768px) { + .work-flex .work-img{ + height: auto; + margin-bottom: 0; + } + .has-post-thumbnail .wp-post-image{ + margin-bottom: 30px; + } + .wp-post-image{ + margin-bottom: 0; + width: 100%; + } + .work-flex .half{ + height: auto; + } + .work-flex .half .desc { + padding: 1.2em 3em; + height: auto; + } + .work-grid .work-img{ + height: auto !important; + } +} +@media screen and (max-width: 1024px){ + .work-grid .work-img{ + height: 222px; + } +} +.product-entry { + margin-bottom: 40px; +} +.product-entry .product-img { + display: block; + height: 350px; + margin-bottom: 20px; + position: relative; +} +.product-entry .product-img .tag { + position: absolute; + top: 10px; + left: 10px; +} +.product-entry .product-img .tag .new { + font-size: 11px; + background: rgb(0, 86, 167); + color: #fff; + padding: .3em .5em; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; +} +.product-entry .product-img .tag .sale { + font-size: 11px; + background: #798eea; + color: #fff; + padding: .3em .5em; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; +} +.product-entry .product-img .cart { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.8); + width: 100%; + display: block; + padding: 0 1em; + opacity: 0; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +.product-entry .product-img .cart p { + display: block; + margin-bottom: 0; + width: 100%; + text-transform: uppercase; + font-size: 12px; +} +.product-entry .product-img .cart p span { + display: inline-block; +} +.product-entry .product-img .cart p span a { + display: block; + color: #fff; + padding: 1em; +} +.product-entry .product-img .cart p span a:hover { + background: rgb(0, 86, 167); +} +.product-entry .desc h3 { + font-size: 20px; + text-transform: uppercase; + font-size: 14px; + margin-bottom: 10px; +} +.product-entry .desc h3 a { + color: #000; +} +.product-entry .desc .price span { + color: rgb(0, 86, 167); + font-weight: 400; +} +.product-entry .desc .price .sale { + color: gray; + text-decoration: line-through; + font-weight: 300; +} +.product-entry:hover .product-img .cart { + opacity: 1; +} +.staff-entry { + display: block; + margin-bottom: 20px; + z-index: 0; + background: #fff; + padding: 30px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; +} +.staff-entry .staff-img { + width: 150px; + height: 150px; + display: block; + margin: 0 auto; + margin-bottom: 30px; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +.staff-entry .desc h3 { + font-size: 24px; + margin-bottom: 10px; +} +.staff-entry .desc span { + display: block; + margin-bottom: 20px; + font-size: 17px; +} +.staff-entry .colorlib-social-icons li { + margin-left: 0; +} +.staff-entry .colorlib-social-icons li a { + padding: 0; +} +#colorlib-counter { + position: relative; + z-index: -1; + padding-top: 7em; + padding-bottom: 7em; +} +#colorlib-counter .colorlib-heading { + margin-bottom: 30px; +} +#colorlib-counter .colorlib-heading h2 { + color: #fff; +} +#colorlib-counter .colorlib-heading p { + font-size: 22px; + color: rgba(255, 255, 255, 0.8); +} +.counter-entry { + padding: 0; + position: relative; +} +@media screen and (max-width: 768px) { + .counter-entry { + margin-bottom: 20px; + } +} +.colorlib-counters { + background-size: cover; + background-attachment: fixed; + background-position: center center; +} +.colorlib-counters .ewf-section__overlay-color { + z-index: 0; + position: absolute; + bottom: 0; + top: 0; + left: 0; + right: 0; + background: #499bea; + background: -moz-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -webkit-gradient(left top, right bottom, color-stop(0%, #499bea), color-stop(100%, #798eea)); + background: -webkit-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -o-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -ms-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -webkit-linear-gradient(315deg, #499bea 0%, #798eea 100%); + background: -o-linear-gradient(315deg, #499bea 0%, #798eea 100%); + background: linear-gradient(135deg, #499bea 0%, #798eea 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#499bea', endColorstr='#798eea', GradientType=1 ); + opacity: .96; +} +.colorlib-counters .icon { + margin-bottom: 20px; + width: 100px; + z-index: 0; +} +.colorlib-counters .icon i { + font-size: 50px; + color: rgba(255, 255, 255, 0.9); + z-index: 1; +} +.colorlib-counters .colorlib-counter { + font-size: 75px; + display: block; + color: #fff; + font-family: "Nunito", Arial, sans-serif; + width: 100%; + font-weight: 300; + margin-bottom: 0; +} +.colorlib-counters .colorlib-counter-label { + color: rgba(255, 255, 255, 0.8); + font-size: 20px; + display: block; + font-weight: 300; +} +/* article { + background: #fff; + padding: 35px; + margin-bottom: 40px; + -webkit-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; +} */ +.colorlib-blog > .container > .row > .col-md-4:nth-child(3n + 1) { + clear: left; +} + +.card { + background-color: #fff; + padding: 35px; + margin: 20px; + + transition: .5s; +} + +.card:hover { + -webkit-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); +} + +.card h2 { + font-weight: 400; + margin-bottom: 15px; +} +.card h2 a { + color: #303133; +} +.card h2 a:hover { + color: rgb(0, 86, 167); +} +.card .admin span { + font-size: 12px; + color: #303133; +} +.card p.author-wrap { + position: relative; +} +.card p.author-wrap .author-img { + position: absolute; + top: 0; + left: 0; + display: block; + width: 30px; + height: 30px; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +.card p.author-wrap .author-img img{ + border-radius: 50%; +} +.card p.author-wrap .author { + padding-left: 40px; + color: #303133; + font-size: 12px; +} +.post-entry ul { + padding-left: 17px; +} +.pricing { + background: #fff; + padding: 2em 1em 1em 1em; + -webkit-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + box-shadow: 0px 3px 38px -13px rgba(0, 0, 0, 0.2); + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + border-radius: 4px; + margin-bottom: 25px; +} +.pricing p { + color: #808080; +} +.pricing .pricing-heading { + margin-bottom: 30px; + color: #303133; +} +.pricing .price { + font-size: 72px; + color: rgb(0, 86, 167); + line-height: 50px; + font-weight: 300; +} +.pricing .price .currency { + font-size: 30px; + top: -0.9em; + padding-right: 10px; +} +.pricing .price small { + font-size: 13px; + display: block; + color: #888f94; +} +#colorlib-subscribe { + position: relative; +} +.colorlib-subscribe { + clear: both; + background-size: cover; + background-attachment: fixed; + background-position: center center; +} +.colorlib-subscribe .ewf-section__overlay-color { + z-index: 0; + position: absolute; + bottom: 0; + top: 0; + left: 0; + right: 0; + background: #499bea; + background: -moz-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -webkit-gradient(left top, right bottom, color-stop(0%, #499bea), color-stop(100%, #798eea)); + background: -webkit-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -o-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -ms-linear-gradient(-45deg, #499bea 0%, #798eea 100%); + background: -webkit-linear-gradient(315deg, #499bea 0%, #798eea 100%); + background: -o-linear-gradient(315deg, #499bea 0%, #798eea 100%); + background: linear-gradient(135deg, #499bea 0%, #798eea 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#499bea', endColorstr='#798eea', GradientType=1 ); + opacity: .96; +} +.colorlib-subscribe .colorlib-heading { + margin-bottom: 30px; +} +.colorlib-subscribe .colorlib-heading h2 { + color: #fff; +} +.colorlib-subscribe .colorlib-heading p { + font-size: 20px; + color: rgba(255, 255, 255, 0.7); +} +.mc4wp-form .mc4wp-form-fields{ + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + width: 100%; + padding: 0; +} +.mc4wp-form .col-three-forth { + width: 70%; +} +.mc4wp-form .col-one-third { + width: 30%; +} +.mc4wp-form .col-three-forth, .mc4wp-form .col-one-third { + display: table; + height: 50px; + float: left; +} +@media screen and (max-width: 768px) { + .mc4wp-form .col-three-forth, .mc4wp-form .col-one-third { + width: 50% !important; + display: table !important; + } +} +.mc4wp-form .form-control { + background: #fff; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + -ms-border-radius: 30px; + border-radius: 30px; + border-top-right-radius: 0px !important; + border-bottom-right-radius: 0px !important; +} +.mc4wp-form .form-group { + position: relative; + width: 100%; + display: table-cell; + vertical-align: middle; +} +@media screen and (max-width: 480px) { + .mc4wp-form .form-group { + width: 100%; + } +} +.mc4wp-form .form-group input::-webkit-input-placeholder { + color: #4d4d4d; +} +.mc4wp-form .form-group input::-moz-input-placeholder { + color: #4d4d4d; +} +.mc4wp-form .form-group input::-ms-input-placeholder { + color: #4d4d4d; +} +.mc4wp-form .form-group input::-o-input-placeholder { + color: #4d4d4d; +} +.mc4wp-form .form-group input::input-placeholder { + color: #4d4d4d; +} +.mc4wp-form #email { + font-size: 14px; + width: 100%; + border: none; + border-bottom: transparent; + color: #4d4d4d !important; +} +.mc4wp-form button { + border-top-left-radius: 0px !important; + border-bottom-left-radius: 0px !important; + background: rgb(0, 86, 167); + color: #fff; + border: none; + padding: 10px 20px; + text-transform: uppercase; + height: 50px; + width: 100%; + display: block; +} +.no-gutters { + margin: 0 !important; +} +.pagination li { + margin: 2px 0; +} +.pagination li a { + color: #000; + background: #fff; + margin: 2px 0; +} +.pagination li a:first-child { + border: 1px solid #e6e6e6; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + border-radius: 2px; +} +.pagination li a:hover, .pagination li a:focus { + background: #499bea; + color: #fff; + border: 1px solid #499bea; +} +@media screen and (max-width: 768px) { + .pagination li a { + padding: 7px 15px; + } +} + +@media screen and (max-width: 480px) { + .page-no-screen { + display: none; + } + .page-no-screen a { + display: none !important; + } +} +.pagination li.active a { + background: rgb(0, 86, 167); + border: 1px solid rgb(0, 86, 167); +} +.pagination li.active a:hover, .pagination li.active a:focus { + background: rgb(0, 86, 167); + color: #fff; + border: 1px solid rgb(0, 86, 167); +} +.no-gutters { + margin: 0 !important; + padding: 0 !important; +} +.f-blog { + position: relative; + padding-left: 0; + margin-bottom: 0px; + display: block; + overflow: hidden; +} +.f-blog .blog-img img{ + position: relative; + top: 0; + left: 0; + display: block; + width: 70px; + height: 60px; + margin-right: 8px; + float: left; +} +.f-blog .desc i { + display: inline-block; + font-size: 15px; + margin-bottom: 5px; +} +.f-blog .desc h2 { + display: inline-block; + font-size: 14px; + margin-bottom: 5px; +} +.f-blog .desc h2 a { + color: #fff; +} +.f-blog .desc .admin { + font-size: 12px; +} +.post p{ + color: #808080; +} +.contact-info-wrap-flex { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + width: 100%; + margin-bottom: 3em; +} +.contact-info-wrap-flex .con-info { + width: 100%; + background: #fff; + padding: 1.5em; + background: white; + margin-bottom: 30px; +} +@media screen and (max-width: 768px) { + .contact-info-wrap-flex .con-info { + width: 100%; + margin: 4px !important; + } +} +.contact-info-wrap-flex p { + margin-bottom: 0; + color: #000; +} +.contact-info-wrap-flex p span i { + color: rgb(0, 86, 167); +} +.contact-info-wrap-flex p a { + color: #000; +} +.form-control { + -webkit-box-shadow: none; + -moz-box-shadow: none; + -ms-box-shadow: none; + -o-box-shadow: none; + box-shadow: none; + border: 1px solid #f0f0f0; + font-size: 16px !important; + font-weight: 300; + background: white; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + -ms-border-radius: 0px; + border-radius: 0px; +} +.form-control:focus, .form-control:active { + background: #fff; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid #e6e6e6; +} +input[type="text"] { + height: 50px; +} +.form-group { + margin-bottom: 30px; +} +@media screen and (max-width: 768px) { + .form-group #fname { + margin-bottom: 30px; + } +} +.form-group label { + font-weight: 400; +} +.form-group .btn-modify { + text-transform: uppercase; + letter-spacing: 1px; + font-weight: 700; + font-size: 13px; + padding: 10px 15px; +} +.colorlib-social-icons { + margin: 0; + padding: 0; +} +.colorlib-social-icons li { + margin: 0; + padding: 0; + list-style: none; + display: -moz-inline-stack; + display: inline-block; + zoom: 1; + *display: inline; +} +.colorlib-social-icons li a { + display: -moz-inline-stack; + display: inline-block; + zoom: 1; + color: #499bef; + padding-left: 10px; + padding-right: 10px; +} +.colorlib-social-icons li a i { + font-size: 20px; +} +.colorlib-heading { + margin-bottom: 30px; +} +.colorlib-heading h2 { + font-size: 50px; + font-weight: 300; + margin-bottom: 30px; + position: relative; +} +@media screen and (max-width: 768px) { + .colorlib-heading h2 { + font-size: 30px; + } +} +#colorlib-footer { + background: #303133; + color: rgba(255, 255, 255, 0.6); +} + +.footer-row { + padding-top: 4em; + padding-bottom: 3em; +} + +#colorlib-footer .colorlib-widget p { + font-size: 13px; + color: #808080; +} +@media screen and (max-width: 768px) { + #colorlib-footer .colorlib-widget { + margin-bottom: 40px; + width: 100%; + float: left; + padding-right: 20px; + padding-left: 20px; + } +} +#colorlib-footer .colorlib-footer-links { + padding: 0; + margin: 0; +} +@media screen and (max-width: 768px) { + #colorlib-footer .colorlib-footer-links { + margin-bottom: 30px; + } +} +#colorlib-footer .colorlib-footer-links li { + padding: 0; + margin: 0 0 10px 0; + list-style: none; + display: block; + font-size: 13px; +} +#colorlib-footer .colorlib-footer-links li a { + color: rgba(255, 255, 255, 0.9); + text-decoration: none; +} +#colorlib-footer .colorlib-footer-links li a i { + padding-right: 10px; + color: #fff; +} +#colorlib-footer .colorlib-social-icons li a { + padding-left: 10px; + padding-right: 10px; +} +#colorlib-footer .colorlib-social-icons li a [class^="icon-"], +#colorlib-footer .colorlib-social-icons li a [class*=" icon-"]{ + color: inherit; +} +#colorlib-footer .colorlib-social-icons li a:first-child { + padding-left: 0; +} +#colorlib-footer h4 { + margin-bottom: 30px; + font-size: 12px; + color: #e6e6e6; + text-transform: uppercase; + letter-spacing: 3px; + font-weight: 700; +} + +@media only screen and (max-width: 768px) { + #colorlib-footer .secondary { + margin-top: 2em; + } +} + +@media only screen and (min-width: 768px) { + #colorlib-footer .secondary { + margin-top: 5em; + } +} + +@media only screen and (min-width: 990px) { + #colorlib-footer .secondary { + margin-top: 0; + } +} + +.copy { + background: #262626; + padding: 2em 0; +} +.copy p { + margin-bottom: 0; + color: #fff; + font-size: 13px; +} +.copy p small a { + color: rgba(255, 255, 255, 0.7); +} +#map { + width: 100%; + height: 500px; + position: relative; +} +@media screen and (max-width: 1200px) { + #map { + height: 200px; + } +} +#colorlib-offcanvas { + position: absolute; + z-index: 1901; + width: 270px; + background: #1a1a1a; + top: 0; + right: 0; + top: 0; + bottom: 0; + padding: 75px 40px 40px 40px; + overflow-y: auto; + display: none; + -moz-transform: translateX(270px); + -webkit-transform: translateX(270px); + -ms-transform: translateX(270px); + -o-transform: translateX(270px); + transform: translateX(270px); + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +@media screen and (max-width: 1200px) { + #colorlib-offcanvas { + display: block; + } +} +.offcanvas #colorlib-offcanvas { + -moz-transform: translateX(0px); + -webkit-transform: translateX(0px); + -ms-transform: translateX(0px); + -o-transform: translateX(0px); + transform: translateX(0px); +} +#colorlib-offcanvas a { + color: rgba(255, 255, 255, 0.5); + background-color: transparent; +} +#colorlib-offcanvas a:hover { + color: rgba(255, 255, 255, 0.8); +} +#colorlib-offcanvas ul { + padding: 0; + margin: 0; +} +#colorlib-offcanvas ul li { + padding: 0; + margin: 0; + list-style: none; +} +#colorlib-offcanvas ul li > ul { + display: none; +} +#colorlib-offcanvas ul li.open > ul { + display: inline-block; + background-color: #1a1a1a; + position: inherit; + width: 250px; + font-size: 12px; + padding: 20px 0 20px; + border: none !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + transition-duration: .75s; +} +#colorlib-offcanvas ul li.offcanvas-has-dropdown > a { + display: block; + position: relative; +} +#colorlib-offcanvas ul li.offcanvas-has-dropdown > a:after { + position: absolute; + right: 0px; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + content: "\e0c5"; + font-size: 20px; + color: rgba(255, 255, 255, 0.2); + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +#colorlib-offcanvas ul li.offcanvas-has-dropdown.active a:after { + -webkit-transform: rotate(-180deg); + -moz-transform: rotate(-180deg); + -ms-transform: rotate(-180deg); + -o-transform: rotate(-180deg); + transform: rotate(-180deg); +} +#colorlib-offcanvas ul li.btn-cta { + margin-top: 5px; +} +#colorlib-offcanvas ul li.btn-cta a { + border-bottom: 1px solid rgb(0, 86, 167); + padding-bottom: 5px; +} +.gototop { + position: fixed; + bottom: 20px; + right: 20px; + z-index: 999; + opacity: 0; + visibility: hidden; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; +} +.gototop.active { + opacity: 1; + visibility: visible; +} +.gototop a { + width: 50px; + height: 50px; + display: table; + background: black; + color: #fff; + text-align: center; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + border-radius: 50%; +} +.gototop a i { + height: 50px; + display: table-cell; + vertical-align: middle; +} +.gototop a:hover, .gototop a:active, .gototop a:focus { + text-decoration: none; + outline: none; +} +.colorlib-nav-toggle { + width: 25px; + height: 25px; + cursor: pointer; + text-decoration: none; + top: 1.2em !important; +} +.colorlib-nav-toggle.active i::before, .colorlib-nav-toggle.active i::after { + background: #303133; +} +.colorlib-nav-toggle:hover, .colorlib-nav-toggle:focus, .colorlib-nav-toggle:active { + outline: none; + border-bottom: none !important; +} +.colorlib-nav-toggle i { + position: relative; + display: inline-block; + width: 25px; + height: 2px; + color: #252525; + font: bold 14px/.4 Helvetica; + text-transform: uppercase; + text-indent: -55px; + background: #252525; + -webkit-transition: all .2s ease-out; + -o-transition: all .2s ease-out; + transition: all .2s ease-out; +} +.colorlib-nav-toggle i::before, .colorlib-nav-toggle i::after { + content: ''; + width: 25px; + height: 2px; + background: #252525; + position: absolute; + left: 0; + -webkit-transition: all .2s ease-out; + -o-transition: all .2s ease-out; + transition: all .2s ease-out; +} +.colorlib-nav-toggle.colorlib-nav-white > i { + color: #fff; + background: #fff; +} +.colorlib-nav-toggle.colorlib-nav-white > i::before, .colorlib-nav-toggle.colorlib-nav-white > i::after { + background: #fff; +} +.colorlib-nav-toggle i::before { + top: -7px; +} +.colorlib-nav-toggle i::after { + bottom: -7px; +} +.colorlib-nav-toggle:hover i::before { + top: -10px; +} +.colorlib-nav-toggle:hover i::after { + bottom: -10px; +} +.colorlib-nav-toggle.active i { + background: transparent; +} +.colorlib-nav-toggle.active i::before { + top: 0; + -webkit-transform: rotateZ(45deg); + -moz-transform: rotateZ(45deg); + -ms-transform: rotateZ(45deg); + -o-transform: rotateZ(45deg); + transform: rotateZ(45deg); + background: #fff; +} +.colorlib-nav-toggle.active i::after { + bottom: 0; + -webkit-transform: rotateZ(-45deg); + -moz-transform: rotateZ(-45deg); + -ms-transform: rotateZ(-45deg); + -o-transform: rotateZ(-45deg); + transform: rotateZ(-45deg); + background: #fff; +} +.colorlib-nav-toggle { + position: absolute; + right: 0px; + top: 65px; + z-index: 21; + padding: 6px 0 0 0; + display: block; + margin: 0 auto; + display: none; + height: 44px; + width: 44px; + z-index: 2001; + border-bottom: none !important; +} +@media screen and (max-width: 1200px) { + .colorlib-nav-toggle { + display: block; + } +} +.btn { + margin-right: 4px; + margin-bottom: 4px; + font-size: 14px; + font-weight: 400; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + -ms-border-radius: 30px; + border-radius: 30px; + -webkit-transition: 0.5s; + -o-transition: 0.5s; + transition: 0.5s; + padding: 8px 20px; +} +.btn.btn-md { + padding: 8px 20px !important; +} +.btn.btn-lg { + padding: 18px 36px !important; +} +.btn:hover, .btn:active, .btn:focus { + -webkit-box-shadow: none !important; + box-shadow: none !important; + outline: none !important; +} +.btn-primary { + background: rgb(0, 86, 167); + color: #fff; + border: 1px solid rgb(0, 86, 167); +} +.btn-primary:hover, .btn-primary:focus, .btn-primary:active { + background: #fff; + border-color: #fff; + color: rgb(0, 86, 167); +} +.btn-primary.btn-outline { + background: transparent; + color: rgb(0, 86, 167); + border: 1px solid rgb(0, 86, 167); +} +.btn-primary.btn-outline:hover, .btn-primary.btn-outline:focus, .btn-primary.btn-outline:active { + background: rgb(0, 86, 167); + color: #fff; +} +.btn-success { + background: #5cb85c; + color: #fff; + border: 1px solid #5cb85c; +} +.btn-success:hover, .btn-success:focus, .btn-success:active { + background: #4cae4c !important; + border-color: #4cae4c !important; +} +.btn-success.btn-outline { + background: transparent; + color: #5cb85c; + border: 2px solid #5cb85c; +} +.btn-success.btn-outline:hover, .btn-success.btn-outline:focus, .btn-success.btn-outline:active { + background: #5cb85c; + color: #fff; +} +.btn-info { + background: #5bc0de; + color: #fff; + border: 1px solid #5bc0de; +} +.btn-info:hover, .btn-info:focus, .btn-info:active { + background: #46b8da !important; + border-color: #46b8da !important; +} +.btn-info.btn-outline { + background: transparent; + color: #5bc0de; + border: 1px solid #5bc0de; +} +.btn-info.btn-outline:hover, .btn-info.btn-outline:focus, .btn-info.btn-outline:active { + background: #5bc0de; + color: #fff; +} +.btn-warning { + background: #f0ad4e; + color: #fff; + border: 1px solid #f0ad4e; +} +.btn-warning:hover, .btn-warning:focus, .btn-warning:active { + background: #eea236 !important; + border-color: #eea236 !important; +} +.btn-warning.btn-outline { + background: transparent; + color: #f0ad4e; + border: 1px solid #f0ad4e; +} +.btn-warning.btn-outline:hover, .btn-warning.btn-outline:focus, .btn-warning.btn-outline:active { + background: #f0ad4e; + color: #fff; +} +.btn-danger { + background: #d9534f; + color: #fff; + border: 1px solid #d9534f; +} +.btn-danger:hover, .btn-danger:focus, .btn-danger:active { + background: #d43f3a !important; + border-color: #d43f3a !important; +} +.btn-danger.btn-outline { + background: transparent; + color: #d9534f; + border: 1px solid #d9534f; +} +.btn-danger.btn-outline:hover, .btn-danger.btn-outline:focus, .btn-danger.btn-outline:active { + background: #d9534f; + color: #fff; +} +.btn-outline { + background: none; + border: 1px solid gray; + font-size: 16px; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +.btn-outline:hover, .btn-outline:focus, .btn-outline:active { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn.with-arrow { + position: relative; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; +} +.btn.with-arrow i { + visibility: hidden; + opacity: 0; + position: absolute; + right: 0px; + top: 50%; + margin-top: -8px; + -webkit-transition: 0.2s; + -o-transition: 0.2s; + transition: 0.2s; +} +.btn.with-arrow:hover { + padding-right: 50px; +} +.btn.with-arrow:hover i { + color: #fff; + right: 18px; + visibility: visible; + opacity: 1; +} +.row-pb-lg { + padding-bottom: 7em !important; +} +.row-pb-md { + padding-bottom: 5em !important; +} +.row-pb-sm { + padding-bottom: 3em !important; +} +.nopadding { + padding: 0 !important; + margin: 0 !important; +} + +.js .animate-box { + opacity: 0; +} +.js .customize-partial-edit-shortcuts-shown .animate-box{ + opacity: 1; +} + + /*----------------------------------------------*/ +/*----------------------------------------------*/ +.ewf-section__overlay-color { + position: absolute; + z-index: 0; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: .85; +} +.team_bottom{ + padding-bottom: 112px; +} +/*----------------Responsive---------------*/ +@media screen and (max-width: 767px) { + .video-hero .display-tc p{ + font-size: 22px; + } + .about_top h2{ + margin-top: 30px; + } + .colorlib-work-featured .mobile-wrap .mobile-img{ + margin-bottom: 30px; + height: auto; + } +} + +@media screen and (max-width: 768px){ + .colorlib-work-featured .mobile-wrap .mobile-img{ + height: auto; + } +} +@media screen and (max-width: 1024px){ + .colorlib-work-featured .mobile-wrap .mobile-img{ + height: auto; + } + .mc4wp-form .col-three-forth{ + display: block; + width: auto; + } +} + +/*-----------------------------------------------*/ +.ewf-text-align--left +{ + text-align: left; +} + +.ewf-text-align--center +{ + text-align: center; +} + +.ewf-text-align--right +{ + text-align: right; +} +.ewf-section--spacing-sm-top +{ + padding-top: 35px; +} + +.ewf-section--spacing-md-top +{ + padding-top: 70px; +} + +.ewf-section--spacing-lg-top +{ + padding-top: 105px; +} + +.ewf-section--spacing-none-top +{ + padding-top: 0; +} + +.ewf-section--spacing-sm-bottom +{ + padding-bottom: 35px; +} + +.ewf-section--spacing-md-bottom +{ + padding-bottom: 70px; +} + +.ewf-section--spacing-lg-bottom +{ + padding-bottom: 105px; +} + +.ewf-section--spacing-none-bottom +{ + padding-bottom: 0; +} + +.overlay { + position: relative; + z-index: 0; +} + +.overlay::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.97); + /* !!! */ + z-index: -1; +} + +div#particles-js { + height: 500px; + top: 0; +} + +.copyright-link { + color: #fff; +} + +.copyright-link:hover { + color: #499bef; +} + +@media only screen and (max-width: 990px) { + .footer-logo { + width: 120px; + margin-right: 30px; + } +} + +@media only screen and (min-width: 990px) { + .footer-logo { + width: 90px; + margin-right: 0; + } +} + +@media only screen and (min-width: 1200px) { + .footer-logo { + width: 120px; + } +} + +li.dropdown-nav { + position: relative; +} + +.colorlib-loader { + position: fixed; + top: 0px; + left: 0px; + background-color: #fff; + height: 100%; + width: 100%; + z-index: 69; +} + +.colorlib-event-loader { + background-color: transparent !important; +} + +.colorlib-loader #loader{ + position:absolute; + width:2vw; + height:2vw; + background:#0037ff; + top:50%; + left:50%; + border-radius:50%; + z-index:1500; + -webkit-animation:forward 2.3s linear infinite; + -moz-animation:forward 2.3s linear infinite; + -o-animation:forward 2.3s linear infinite; + animation:forward 2.3s linear infinite +} + +.colorlib-event-loader #loader{ + width:0.75vw !important; + height:0.75vw !important; +} + +.colorlib-loader>#loader:nth-of-type(1){ + -webkit-animation-delay:-.46s; + -moz-animation-delay:-.46s; + -o-animation-delay:-.46s; + animation-delay:-.46s +} + +.colorlib-loader>#loader:nth-of-type(2){ + -webkit-animation-delay:-.92s; + -moz-animation-delay:-.92s; + -o-animation-delay:-.92s; + animation-delay:-.92s +} + +.colorlib-loader>#loader:nth-of-type(3){ + -webkit-animation-delay:-1.38s; + -moz-animation-delay:-1.38s; + -o-animation-delay:-1.38s; + animation-delay:-1.38s +} + +.colorlib-loader>#loader:nth-of-type(4){ + -webkit-animation-delay:-1.84s; + -moz-animation-delay:-1.84s; + -o-animation-delay:-1.84s; + animation-delay:-1.84s +} + +@-webkit-keyframes forward{ + 0%{ + left:40%; + opacity:0; + background:#499bea; + } + 10%{ + left:45%; + opacity:1 + } + 90%{ + left:55%; + opacity:1 + } + 100%{ + left:62%; + opacity:0 + } +} + +@-moz-keyframes forward{ + 0%{ + left:40%; + opacity:0; + background:#499bea; + } + 10%{ + left:45%; + opacity:1 + } + 90%{ + left:55%; + opacity:1 + } + 100%{ + left:62%; + opacity:0 + } +} + +@-o-keyframes forward{ + 0%{ + left:40%; + opacity:0; + background:#499bea; + } + 10%{ + left:45%; + opacity:1 + } + 90%{ + left:55%; + opacity:1 + } + 100%{ + left:62%; + opacity:0 + } +} + +@keyframes forward{ + 0%{ + left:40%; + opacity:0; + background:#499bea; + } + 10%{ + left:45%; + opacity:1 + } + 90%{ + left:55%; + opacity:1 + } + 100%{ + left:62%; + opacity:0 + } +} \ No newline at end of file diff --git a/blog/assets/css/style.css.map b/blog/assets/css/style.css.map new file mode 100644 index 0000000..0159d35 --- /dev/null +++ b/blog/assets/css/style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAkEA,UASC;EARA,WAAW,EAAE,SAAS;EACtB,GAAG,EAAC,0CAA0C;EAC9C,GAAG,EAAC,yQAG6D;EACjE,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;;;;;;;AA8CnB,IAAK;EACJ,WAAW,EAzHG,4BAA2B;EA0HzC,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,OAAyB;EAChC,UAAU,EA5GM,IAAY;;;AA8G7B,KAAM;EACL,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,MAAM;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;ECqDX,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;ADrDhC,gBAAa;EACZ,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;;AAElB,sBAAQ;EC+CR,kBAAkB,EAAE,EAAW;EAC1B,aAAa,EAAE,EAAW;EACvB,UAAU,EAAE,EAAW;ED/C9B,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,OAAO,EAAE,GAAG;EACZ,UAAU,EAAE,kBAAc;EAC1B,OAAO,EAAE,EAAE;;;AAId,CAAE;EACD,KAAK,EEqnBwB,OAAW;EDplBvC,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;ADjChC,0BAA2B;EAC1B,KAAK,EEknBuB,OAAW;EFjnBvC,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,IAAI;;;AAGvB,CAAE;EACD,aAAa,EAAE,IAAI;;;AAGpB,8BAA+B;EAC9B,KAAK,EA1JQ,IAAI;EA2JjB,WAAW,EArKK,gCAAgC;EAsKhD,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,UAAU;;;AAEnB,mBAAoB;EAClB,KAAK,EAzJU,IAAY;EA0J3B,UAAU,EEimBkB,OAAW;;;AF9lBzC,gBAAiB;EACf,KAAK,EA9JU,IAAY;EA+J3B,UAAU,EE4lBkB,OAAW;;;AF1lBzC,WAAY;EACV,KAAK,EAlKU,IAAY;EAmK3B,UAAU,EEwlBkB,OAAW;;;AF3kBzC,eAAgB;EACf,MAAM,EAAE,CAAC;;AACT,oCAA2C;EAF5C,eAAgB;IAGd,MAAM,EAAE,CAAC;;;AAEV,yBAAS;EACR,OAAO,EAAE,SAAS;;AAClB,oCAA2C;EAF5C,yBAAS;IAGP,OAAO,EAAE,QAAQ;;;AAInB,gCAAiB;EAChB,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,GAAG;;AAChB,kCAAC;EACA,QAAQ,EAAE,QAAQ;EAClB,KAAK,EA3MM,IAAI;EA4Mf,YAAY,EAAE,IAAI;;AAClB,oCAAC;EACA,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,CAAC;EACP,KAAK,EEijBqB,OAAW;;AF5iBvC,oCAA2C;EAD5C,uBAAQ;IAEN,OAAO,EAAE,IAAI;;;AAGf,kBAAG;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,SAAS;;AACjB,qBAAG;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,MAAM;EACf,WAAW,EAAE,GAAG;;AAChB,uBAAE;EACD,QAAQ,EAAE,QAAQ;EAClB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE,kBAAc;ECzDvB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD0D7B,6BAAO;EACN,KAAK,EA3OI,IAAI;;AA8Of,kCAAe;EACd,QAAQ,EAAE,QAAQ;;AAClB,4CAAU;EACT,KAAK,EAAE,KAAK;EACZ,kBAAkB,EAAE,sCAAmC;EACvD,eAAe,EAAE,sCAAmC;EACpD,UAAU,EAAE,sCAAmC;EAC/C,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,MAAM;EAClB,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,CAAC;EACP,UAAU,EAAE,IAAI;EAChB,UAAU,EA5PD,IAAI;EA6Pb,OAAO,EAAE,IAAI;EAxNhB,qBAAqB,EAyNK,GAAG;EAxN1B,kBAAkB,EAwNK,GAAG;EAvNzB,iBAAiB,EAuNK,GAAG;EAtNrB,aAAa,EAsNK,GAAG;EChF7B,kBAAkB,EAAE,EAAW;EAC1B,aAAa,EAAE,EAAW;EACvB,UAAU,EAAE,EAAW;;ADgF5B,mDAAS;EACR,MAAM,EAAE,IAAI;EACZ,IAAI,EAAE,IAAI;EACV,MAAM,EAAE,iBAAiB;EACzB,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,CAAC;EACT,KAAK,EAAE,CAAC;EACR,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,IAAI;EACpB,mBAAmB,EAAE,IAAI;EACzB,YAAY,EAAE,GAAG;EACjB,WAAW,EAAE,IAAI;;AAGlB,+CAAG;EACF,OAAO,EAAE,KAAK;EACd,aAAa,EAAE,GAAG;;AAClB,0DAAa;EACZ,aAAa,EAAE,CAAC;;AAEjB,iDAAE;EACD,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,OAA0B;EACjC,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,IAAI;EACpB,SAAS,EAAE,IAAI;EACf,cAAc,EAAE,CAAC;;AACjB,uDAAQ;EACP,KAAK,EAtRI,IAAY;;AA4RxB,sFAAE;EACD,KAAK,EApSG,IAAI;;AAySd,+BAAE;EACD,OAAO,EAAE,mBAAmB;EAC5B,KAAK,EApSO,IAAY;;AAqSxB,oCAAK;EACJ,UAAU,EAAE,OAAsB;EAClC,OAAO,EAAE,QAAQ;EAhRtB,OAAO,EAAC,iBAAiB;EACzB,OAAO,EAAC,YAAY;EACpB,IAAI,EAAC,CAAC;EACN,QAAQ,EAAC,MAAM;EC6Id,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;ED3I/B,qBAAqB,EA4QM,KAAK;EA3Q7B,kBAAkB,EA2QM,KAAK;EA1Q5B,iBAAiB,EA0QM,KAAK;EAzQxB,aAAa,EAyQM,KAAK;;AAG5B,0CAAK;EACJ,kBAAkB,EAAE,sCAAmC;EACvD,eAAe,EAAE,sCAAmC;EACpD,UAAU,EAAE,sCAAmC;;AAMlD,gCAAI;EACH,KAAK,EAAE,eAAsB;EAC7B,QAAQ,EAAE,QAAQ;;AAElB,sCAAO;EACN,OAAO,EAAE,CAAC;EACV,iBAAiB,EAAE,oBAAoB;EACvC,SAAS,EAAE,oBAAoB;;;AAQrC;cACc;EACb,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,UAAU;EAC/B,iBAAiB,EAAE,SAAS;EAC5B,QAAQ,EAAE,QAAQ;;;AAGnB,iBAAkB;EACjB,QAAQ,EAAE,MAAM;;AAChB,oCAAyC;EAF1C,iBAAkB;IAGhB,MAAM,EAAE,KAAK;;;AAEd,mBAAE;EACD,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,KAAK;EACjB,WAAW,EAAE,KAAK;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,MAAM;EAClB,UAAU,EA7VK,IAAY;EA+V3B,kBAAkB,EAAE,uCAAoC;EACxD,eAAe,EAAE,uCAAoC;EACrD,cAAc,EAAE,uCAAoC;EACpD,aAAa,EAAE,uCAAoC;EACnD,UAAU,EAAE,uCAAoC;EArUhD,qBAAqB,EAsUE,GAAG;EArUvB,kBAAkB,EAqUE,GAAG;EApUtB,iBAAiB,EAoUE,GAAG;EAnUlB,aAAa,EAmUE,GAAG;;AAE1B,qBAAE;EACD,UAAU,EAAE,MAAM;EAClB,OAAO,EAAE,UAAU;EACnB,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,IAAI;;AAIjB,0BAAS;EACR,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,kBAAiB;EC7M7B,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD+M/B,gCAAS;EACR,UAAU,EAAE,kBAAiB;;AAE9B,yBAAE;EACD,iBAAiB,EAAE,UAAU;EAC7B,cAAc,EAAE,UAAU;EAC1B,aAAa,EAAE,UAAU;EACzB,YAAY,EAAE,UAAU;EACxB,SAAS,EAAE,UAAU;;;AAMxB,gBAAiB;EAChB,UAAU,EAAE,KAAK;EACjB,UAAU,EAAE,sDAA8D;EAC1E,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,IAAI;;AACX,qBAAK;EACJ,SAAS,EAAE,IAAI;;AACf,iCAAc;EACb,OAAO,EAAE,oBAAmB;;AAG9B,4BAAY;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,CAAC;EACV,aAAa,EAAE,CAAC;;AAEhB,oCAAQ;EACP,QAAQ,EAAE,QAAQ;EAClB,QAAQ,EAAE,MAAM;;AAChB,uCAAG;EACF,iBAAiB,EAAE,SAAS;EAC5B,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,QAAQ;;AAClB,yDAAiB;EAChB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EArVZ,gBAAgB,EAAE,OAA2B;;EAC7C,UAAU,EAAE,iHAA4G;EACxH,UAAU,EAAE,sKAAgK;EAC5K,UAAU,EAAE,oHAA+G;EAC3H,UAAU,EAAE,+GAA0G;EACtH,UAAU,EAAE,gHAA2G;EACvH,UAAU,EAAE,4GAAuG;EACnH,UAAU,EAAE,4FAAwG;;AAmVnH,8CAAkB;EACjB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,MAAM;;AAEZ,mDAAE;EACD,UAAU,EAAE,wBAAoB;EAChC,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,OAAO;;AACf,+DAAc;EACb,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,WAAW;EACvB,UAAU,EEoUc,OAAW;;AF9TvC,gDAAoB;EACnB,OAAO,EAAE,IAAI;;AAGd,yCAAY;EACX,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE,CAAC;;AACV,8DAAqB;EACpB,OAAO,EAAE,UAAU;EACnB,cAAc,EAAE,MAAM;EACtB,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE,GAAG;;AACZ,oCAA2C;EAL5C,8DAAqB;IAMnB,UAAU,EAAE,MAAM;;;AAGlB,qEAAC;EACA,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OAAO;;AAGhB,oIAAO;EACN,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,KAAoB;;AAE5B,iEAAG;EACF,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,GAAG;;AAChB,oCAA0C;EAL3C,iEAAG;IAMD,SAAS,EAAE,IAAI;;;AAGjB,iEAAG;EACF,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,IAAI;;AACnB,mEAAC;EACA,KAAK,EAAE,OAAsB;EAC7B,aAAa,EAAE,gCAChB;;AAED,+EAAgB;EACf,SAAS,EAAE,IAAI;;AACf,oCAAyC;EAF1C,+EAAgB;IAGd,SAAS,EAAE,IAAI;;;AAEhB;gBACe;EACf,SAAS,EAAE,IAAI;EACf,KAAK,EAnfO,IAAY;;AAofxB;4BAAY;EACX,KAAK,EEmJmB,OAAa;;AFhJvC,mEAAI;EACH,SAAS,EAAE,IAAI;EACf,cAAc,EAAE,SAAS;EACzB,cAAc,EAAE,GAAG;EACnB,KAAK,EA5fO,IAAY;EA6fxB,OAAO,EAAE,oBAAoB;EAC7B,MAAM,EAAE,IAAI;;AACZ,6EAAW;EACV,UAAU,EAhgBC,IAAY;EAigBvB,KAAK,EAxgBG,IAAI;;AA0gBb,oCAA2C;EAX5C,mEAAI;IAYF,KAAK,EAAE,IAAI;;;;AAWjB,sBAAsB;EACrB,UAAU,EAAE,OAAyB;;;AAGtC;;;;;;;;;kBASmB;EAClB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;;AACX,oCAA0C;EAZ3C;;;;;;;;;oBASmB;IAIjB,OAAO,EAAE,KAAK;;;;AAIhB,oBAAoB;EACnB,OAAO,EAAE,cAAc;;AACvB,oCAAyC;EAF1C,oBAAoB;IAGlB,OAAO,EAAE,eAAe;;;;AAI1B,iBAAiB;EAChB,UAAU,EE+MmB,OAAW;;AF9MxC,mBAAC;EACA,KAAK,EAAE,eAAuB;;;AAKhC,uBAAuB;EACtB,KAAK,EAAE,IAAI;;AACX,oCAAY;EACX,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,QAAQ;EACpB,OAAO,EAAE,CAAC;EACV,UAAU,EA1jBK,IAAY;EA2jB3B,OAAO,EAAE,IAAI;;;AAId,sBAAM;EACL,WAAW,EAAE,MAAM;;AAEpB,8BAAc;EACb,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,IAAI;EACf,kBAAkB,EAAE,IAAI;EACxB,eAAe,EAAE,IAAI;EACrB,cAAc,EAAE,IAAI;EACpB,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,wBAAqB;EACjC,MAAM,EAAE,4BAA+B;;AACvC,2EAAkB;EACjB,UAAU,EAAE,IAAI;EAChB,YAAY,EE4Ke,OAAW;;AFzKxC,4BAAW;EACV,aAAa,EAAE,IAAI;;AACnB,wCAAY;EACX,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;AACT,8CAAM;EACL,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,iBAAiB,EAAE,gBAAgB;EACnC,cAAc,EAAE,gBAAgB;EAChC,aAAa,EAAE,gBAAgB;EAC/B,YAAY,EAAE,gBAAgB;EAC9B,SAAS,EAAE,gBAAgB;EAC3B,KAAK,EAAE,IAAI;;AAEZ,sDAAc;EACb,aAAa,EAAE,IAAI;;AAItB,sCAAsB;EACrB,MAAM,EAAE,OAAO;EACf,MAAM,EAAC,QAAQ;;AAEhB,2BAAU;EACT,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,eAAe;;;AAK1B,SAAS;EACR,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,QAAQ;EC7cjB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD6chC,YAAE;EACD,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AAChB,cAAC;EACA,KAAK,EA1nBS,IAAY;;AA6nB5B,eAAK;EACJ,YAAY,EAAE,IAAI;;AAEnB,eAAM;EACL,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,CAAC;;AACP,iBAAE;EACD,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,KAAK,EAvoBS,IAAY;;;AA6oB7B,aAAa;EACZ,aAAa,EAAE,GAAG;;;;AAGnB;iCACmC;EAClC,UAAU,EAAE,CAAC;;;AAEd;;;oDAGqD;EACpD,GAAG,EAAE,KAAK;EAEV,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,QAAQ;ECrfjB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;EDqfhC,OAAO,EAAE,CAAC;;;AAMX;oDACoD;EACnD,KAAK,EAAE,IAAI;;AACX;0DAAQ;EACP,YAAY,EAAE,cAAc;;;AAI9B;oDACoD;EACnD,KAAK,EAAE,IAAI;;AACX;0DAAQ;EACP,WAAW,EAAE,YAAY;;;AAO1B;;;0DAAE;EACD,KAAK,EA/rBO,IAAI;;AAksBhB;;;gEAAE;EACD,KAAK,EAnsBM,IAAI;;;AAwsBlB,+CAA+C;EAC9C,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,WAAW;EACvB,MAAM,EAAE,4BAA+B;;AACvC,iDAAC;EACA,MAAM,EAAE,IAAI;;AAEb,qDAAO;EACN,UAAU,EAAE,WAAW;;;AAMxB;gDAAE;EACD,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,kBAAqB;EAC5B,UAAU,EAAE,WAAW;;AAGvB;sDAAE;EACD,KAAK,EAAE,kBAAqB;;;AAQ/B,uBAAuB;EACtB,OAAO,EAAE,eAAe;;AACxB,oCAA0C;EAF3C,uBAAuB;IAGrB,OAAO,EAAE,eAAe;;;;AAK1B,KAAK;EACJ,QAAQ,EAAE,QAAQ;;AAClB,qBAAe;EACd,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,UAAU,EAAE,sBAAuB;EACnC,OAAO,EAAE,CAAC;ECxkBV,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;ADwkB/B,2BAAK;EACJ,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,CAAC;EACP,MAAM,EAAE,CAAC;EACT,KAAK,EAAE,CAAC;EACR,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE,IAAI;;AACb,8BAAE;EACD,KAAK,EAAE,wBAAqB;EAC5B,aAAa,EAAE,IAAI;;AAEpB,gCAAI;EACH,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,wBAAqB;;AAG9B,wDAAgB;EACf,eAAe,EAAE,IAAI;;AAItB,wDAAe;EACd,OAAO,EAAE,CAAC;;;AAQZ,4BAAU;EACT,aAAa,EAAE,GAAG;;AAEnB,uBAAK;EACJ,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,IAAI;;AACnB,oCAAwC;EAVzC,uBAAK;IAWH,MAAM,EAAE,KAAK;;;AAEd,oCAAwC;EAbzC,uBAAK;IAcH,MAAM,EAAE,KAAK;;;AAId,0BAAE;EACD,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,CAAC;;AAChB,4BAAC;EACA,KAAK,EAhzBK,IAAI;;AAmzBhB,8BAAM;EACL,QAAQ,EAAE,QAAQ;EAClB,WAAW,EA/zBG,gCAAgC;;AAg0B9C,mCAAI;EACH,KAAK,EAvzBK,IAAI;;AAyzBf,wCAAS;EACR,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,CAAC;EACP,SAAS,EAAE,IAAI;;AAEhB,0CAAW;EACV,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;;AAGpB,0BAAE;EACD,MAAM,EAAE,UAAU;EAClB,OAAO,EAAE,CAAC;;AACV,6BAAE;EACD,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;;;AAQpB,UAAU;EACT,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,eAAe;EACxB,UAAU,EA90BM,IAAY;EA8B3B,qBAAqB,EAizBC,GAAG;EAhzBtB,kBAAkB,EAgzBC,GAAG;EA/yBrB,iBAAiB,EA+yBC,GAAG;EA9yBjB,aAAa,EA8yBC,GAAG;;AAE1B,oCAAwC;EANzC,UAAU;IAOR,aAAa,EAAE,IAAI;;;AAEpB,oBAAS;EACR,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,KAAK;EACV,IAAI,EAAE,KAAK;EACX,WAAW,EAAE,GAAG;EA/zBhB,qBAAqB,EAg0BE,GAAG;EA/zBvB,kBAAkB,EA+zBE,GAAG;EA9zBtB,iBAAiB,EA8zBE,GAAG;EA7zBlB,aAAa,EA6zBE,GAAG;;AAE3B,gBAAK;EACJ,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,IAAI;EAChB,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAI;;AAEpB,qBAAU;EACT,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,UAAU;EAClB,MAAM,EAAE,IAAI;;AACZ,uBAAC;EACA,KAAK,EAl3BM,IAAI;EAm3Bf,SAAS,EAAE,IAAI;EACf,WAAW,EA93BG,gCAAgC;EA+3B9C,cAAc,EAAE,GAAG;;AACnB,yBAAC;EACA,KAAK,EErHqB,OAAW;;;AF4HzC,oBAAqB;EACpB,OAAO,EAAE,KAAK;EACd,eAAe,EAAE,KAAK;EACtB,qBAAqB,EAAE,KAAK;EAC5B,mBAAmB,EAAE,aAAa;;AAClC,kCAAa;EACZ,MAAM,EAAE,wBAAwB;;AAEjC,wCAAoB;EACnB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,KAAoB;EAE3B,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,IAAI;;AAEpB,8CAA0B;EACzB,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,KAAK;EACd,cAAc,EAAE,SAAS;EACzB,cAAc,EAAE,GAAG;EACnB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAyB;;;AAMlC,OAAO;EACN,KAAK,EAAC,IAAI;EACV,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,GAAG;;AAClB,iBAAS;EACR,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,EAAE;EACX,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,IAAI;;AAEZ,aAAK;EACJ,OAAO,EAAE,GAAG;EACZ,KAAK,EAAE,GAAG;EACV,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,CAAC;EACV,UAAU,EAr6BK,IAAY;;AAu6B1B,kBAAC;EACA,KAAK,EA/6BK,IAAI;;AAm7Bf,wBAAI;EACH,YAAY,EAAE,IAAI;;;AAKtB,MAAM;EACL,aAAa,EAAE,GAAG;;AAEjB,0BAAE;EACD,SAAS,EAAE,eAAe;;AAG5B,gBAAS;EACR,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;AACV,mBAAE;EACD,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;;AAEf,0BAAI;EACH,KAAK,EAx8BI,IAAI;;;AAi9BlB,UAAU;EAt6BT,OAAO,EAAE,WAAW;EAClB,OAAO,EAAE,QAAQ;EACjB,OAAO,EAAE,WAAW;EACpB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,IAAI;EAGf,SAAS,EAAE,IAAI;EACf,iBAAiB,EAAE,IAAI;EACvB,cAAc,EAAE,IAAI;EAg6BpB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,YAAY;;AACrB,iDAA2B;EAC1B,KAAK,EAAE,GAAG;;AACV,oCAA0C;EAF3C,iDAA2B;IAGzB,KAAK,EAAE,IAAI;;;AAGb,yBAAc;EACb,OAAO,EAAE,GAAG;EACZ,KAAK,EAAE,GAAG;EACV,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,QAAQ,EAAE,QAAQ;EAv7BnB,OAAO,EAAE,WAAW;EAClB,OAAO,EAAE,QAAQ;EACjB,OAAO,EAAE,WAAW;EACpB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,IAAI;EAGf,SAAS,EAAE,IAAI;EACf,iBAAiB,EAAE,IAAI;EACvB,cAAc,EAAE,IAAI;;AAi7BnB,oCAA0C;EAT3C,yBAAc;IAUZ,KAAK,EAAE,IAAI;;;AAEZ,gCAAQ;EACP,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,MAAM,EAAE,IAAI;EACZ,IAAI,EAAE,IAAI;EACV,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,EAAE;;AAGZ,iCAAO;EACN,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,CAAC;;AACV,0CAAQ;EACP,OAAO,EAAE,UAAU;EACnB,cAAc,EAAE,MAAM;EACtB,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,CAAC;;AAEX,gDAAc;EACb,OAAO,EAAE,KAAK;EACd,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,eAAe;EAC1B,KAAK,EAAE,wBAAqB;;AAE7B,oCAAE;EACD,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,IAAI;;AACnB,oCAA0C;EAN3C,oCAAE;IAOA,SAAS,EAAE,IAAI;;;AAEhB,sCAAC;EACA,KAAK,EArgCO,IAAY;;AAwgC1B,mCAAC;EACA,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,wBACR;;AACA,8CAAY;EACX,cAAc,EAAE,GAAG;EACnB,KAAK,EAAE,KAAoB;EAC3B,OAAO,EAAE,SAAS;EAClB,UAAU,EErRgB,OAAW;;;AF0RzC,WAAW;EACV,OAAO,EAAE,GAAG;;AACZ,oCAA0C;EAF3C,WAAW;IAGT,OAAO,EAAE,OAAO;;;;AAGlB,UAAU;EACT,aAAa,EAAE,KAAK;EACpB,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;;AAClB,gBAAK;EACJ,YAAY,EAAE,KAAK;;AACnB,mBAAE;EACD,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,aAAa,EAAE,IAAI;;AAEpB,qBAAI;EACH,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,OAAyB;;AAGlC,eAAI;EACH,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,MAAM,EAAE,cAAsB;EAxhC9B,qBAAqB,EAyhCE,GAAG;EAxhCvB,kBAAkB,EAwhCE,GAAG;EAvhCtB,iBAAiB,EAuhCE,GAAG;EAthClB,aAAa,EAshCE,GAAG;;;AAI5B,WAAW;EACV,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,IAAI;EACnB,KAAK,EAAE,KACR;;;AAGA,eAAe;EAhiCd,OAAO,EAAE,WAAW;EAClB,OAAO,EAAE,QAAQ;EACjB,OAAO,EAAE,WAAW;EACpB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,IAAI;EAGf,SAAS,EAAE,IAAI;EACf,iBAAiB,EAAE,IAAI;EACvB,cAAc,EAAE,IAAI;EA0hCpB,KAAK,EAAE,IAAI;;AACX,qBAAK;EACJ,KAAK,EAAE,GAAG;EACV,OAAO,EAAE,eAAe;;AACxB,oCAA0C;EAH3C,qBAAK;IAIH,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,GAAG;;;;AAKd,oCAAyC;EAD1C,cAAc;IAEZ,OAAO,EAAE,IAAI;;;;AAGf;;SAES;EACR,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,QAAQ,EAAE,QAAQ;;;AAGnB,UAAW;EACV,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;AACT,aAAG;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,IAAI;;AACpB,yCAAc;EACb,OAAO,EAAE,UAAU;EACnB,cAAc,EAAE,GAAG;;AAEpB,oBAAO;EACN,KAAK,EAAE,IAAI;;AACX,wBAAI;EACH,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,GAAG;;AAGpB,mBAAM;EACL,YAAY,EAAE,IAAI;;AAClB,sBAAG;EACF,MAAM,EAAE,aAAa;EACrB,SAAS,EAAE,IAAI;EACf,cAAc,EAAE,SAAS;EACzB,KAAK,EAjoCK,IAAI;;AAkoCd,oCAA0C;EAL3C,sBAAG;IAMD,UAAU,EAAE,GAAG;;;AAGjB,0BAAO;EACN,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,KAAK,EAAE,CAAC;EACR,SAAS,EAAE,IAAI;EACf,KAAK,EEzYqB,OAAW;;AF0YrC,oCAA0C;EAN3C,0BAAO;IAOL,GAAG,EAAE,GAAG;IACR,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,GAAG;;;;AAOvB,SAAS;EACR,OAAO,EAAE,KAAK;EC1+Bb,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;;AD2+BjC,SAAS;EACR,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,IAAI;EC/+BlB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD++BhC,YAAE;EACD,SAAS,EAAE,IAAI;;AACf,oCAAwC;EAFzC,YAAE;IAGA,SAAS,EAAE,IAAI;;;AAEhB,cAAC;EACA,MAAM,EAAE,eAAe;EACvB,aAAa,EAAE,eAAe;EAC9B,KAAK,EAAE,kBAAuC;;AAC9C,0BAAa;EACZ,YAAY,EAAE,CAAC;;AAIhB,qBAAC;EACA,MAAM,EAAE,eAAe;EACvB,aAAa,EAAE,eAAe;EAC9B,KAAK,EAAE,kBAAyB;;;AAOpC,eAAe;EA5oCd,OAAO,EAAE,WAAW;EAClB,OAAO,EAAE,QAAQ;EACjB,OAAO,EAAE,WAAW;EACpB,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,IAAI;EAGf,SAAS,EAAE,IAAI;EACf,iBAAiB,EAAE,IAAI;EACvB,cAAc,EAAE,IAAI;EAsoCpB,KAAK,EAAE,IAAI;;AACX,qDAAqB;EACpB,KAAK,EAAE,GAAG;EACV,OAAO,EAAE,OAAO;;AAChB,oCAAyC;EAH1C,qDAAqB;IAInB,OAAO,EAAE,GAAG;;;AAIb,oCAAyC;EAD1C,8BAAc;IAEZ,KAAK,EAAE,GAAG;;;AAIX,oCAAyC;EAD1C,qBAAK;IAEH,KAAK,EAAE,GAAG;;;AAGV,0BAAC;EACA,KAAK,EA7sCK,IAAI;;AA8sCd,gCAAO;EACN,KAAK,EE7coB,OAAW;;AFidvC,4BAAM;EACL,QAAQ,EAAE,QAAQ;EAClB,WAAW,EA/tCG,gCAAgC;;AAguC9C,iCAAI;EACH,KAAK,EAvtCK,IAAI;;AAytCf,sCAAS;EACR,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,CAAC;EACP,SAAS,EAAE,IAAI;;AAEhB,wCAAW;EACV,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;;AAEnB,kCAAK;EACJ,SAAS,EAAE,IAAI;;;AAOnB,MAAM;EACL,aAAa,EAAE,IAAI;;;AAIpB,kBAAkB;EACjB,aAAa,EAAE,GAAG;;AAEjB,yBAAI;EACH,aAAa,EAAE,IAAI;;AACnB,2BAAC;EACA,SAAS,EAAE,IAAI;EACf,KAAK,EEtfqB,OAAW;;;AF4fzC,aAAc;EACb,kBAAkB,EAAE,IAAI;EACxB,eAAe,EAAE,IAAI;EACrB,cAAc,EAAE,IAAI;EACpB,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,eAAe;EAC1B,WAAW,EAAE,GAAG;EAjuCf,qBAAqB,EAkuCC,GAAG;EAjuCtB,kBAAkB,EAiuCC,GAAG;EAhuCrB,iBAAiB,EAguCC,GAAG;EA/tCjB,aAAa,EA+tCC,GAAG;;AAE1B,yCAAkB;EACjB,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,4BAAwB;;;AAIlC,kBAAmB;EAClB,MAAM,EAAE,IAAI;;;AAEb,WAAY;EACX,aAAa,EAAE,IAAI;;AACnB,uBAAW;EACV,cAAc,EAAE,SAAS;EACzB,cAAc,EAAE,GAAG;EACnB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,SAAS;;;AAKpB,wBAAyB;EACxB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;AACV,2BAAG;EACF,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,IAAI;EAtwCjB,OAAO,EAAC,iBAAiB;EACzB,OAAO,EAAC,YAAY;EACpB,IAAI,EAAC,CAAC;EACN,QAAQ,EAAC,MAAM;;AAqwCd,6BAAE;EAxwCH,OAAO,EAAC,iBAAiB;EACzB,OAAO,EAAC,YAAY;EACpB,IAAI,EAAC,CAAC;EACN,QAAQ,EAAC,MAAM;EAuwCb,KAAK,EEtiBsB,OAAW;EFuiBtC,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AACnB,+BAAE;EACD,SAAS,EAAE,IAAI;;;AAOnB,WAAW;EACV,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,GAAG;EAChB,cAAc,EAAE,GAAG;EACnB,cAAc,EAAE,SAAS;EACzB,KAAK,EA1zCQ,IAAI;;;AA6zClB,mBAAoB;EACnB,aAAa,EAAE,GAAG;;AAClB,yCAAwB;EACvB,aAAa,EAAE,GAAG;;AAEnB,sBAAG;EACF,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;EAChB,KAAK,EAt0CO,IAAI;;AAw0CjB,wBAAI;EACH,OAAO,EAAE,KAAK;EACd,aAAa,EAAE,IAAI;EACnB,cAAc,EAAE,SAAS;EACzB,SAAS,EAAE,IAAI;EACf,cAAc,EAAE,GAAG;;AACnB,0BAAC;EACA,KAAK,EAAE,OAAO;;;AAKjB,qBAAqB;EACpB,eAAe,EAAE,KAAK;EACtB,mBAAmB,EAAE,aAAa;EAClC,iBAAiB,EAAE,SAAS;EAC5B,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAl1CW,IAAY;;AAm1C5B,8BAAQ;EACP,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,kBAAqB;EACjC,WAAW,EAAE,GAAG;;AAGhB,4CAAE;EACD,KAAK,EAAE,eAAuB;EAC9B,SAAS,EAAE,IAAI;;AAEhB,2CAAC;EACA,SAAS,EAAE,IAAI;;;AAKjB,mCAAW;EACV,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;;AACV,oCAAyC;EAH1C,mCAAW;IAIT,KAAK,EAAE,IAAI;;;AAEZ,oEAAiC;EAChC,KAAK,EAAE,OAAyB;;AAEjC,iEAA8B;EAC7B,KAAK,EAAE,OAAyB;;AAEjC,gEAA6B;EAC5B,KAAK,EAAE,OAAyB;;AAEjC,+DAA4B;EAC3B,KAAK,EAAE,OAAyB;;AAEjC,4DAAyB;EACxB,KAAK,EAAE,OAAyB;;AAGlC,8BAAO;EACN,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,cAAsB;EAC9B,UAAU,EAn4CK,IAAY;EAo4C3B,KAAK,EAAE,kBAAoC;;AAE5C,8BAAO;EACN,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAI;EACX,sBAAsB,EAAE,cAAa;EACrC,yBAAyB,EAAE,cAAa;EACxC,UAAU,EEjpBkB,OAAW;EFkpBvC,KAAK,EA74CU,IAAY;EA84C3B,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;;;AAKf,kBAAmB;EAClB,UAAU,EAAE,eAAe;;AAC3B,2CAAyB;EACxB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;AACT,oCAAwC;EAHzC,2CAAyB;IAIvB,aAAa,EAAE,IAAI;;;AAEpB,8CAAG;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,UAAU;EAClB,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,KAAK;;AACd,gDAAE;EACD,KAAK,EAAE,kBAAqB;EAC5B,eAAe,EAAE,IAAI;;AACrB,sDAAQ;EACP,eAAe,EAAE,SAAS;;AAO5B,gDAAE;EACD,YAAY,EAAE,IAAI;EAClB,aAAa,EAAE,IAAI;;AACnB,4DAAa;EACZ,YAAY,EAAE,CAAC;;AAMnB,qBAAG;EACF,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,IAAI;;;AAKjB,IAAK;EACJ,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,KAAK;EACb,QAAQ,EAAE,QAAQ;;AAClB,oCAA0C;EAJ3C,IAAK;IAKH,MAAM,EAAE,KAAK;;;;AAKf,qBAAsB;EACrB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,KAAyB;EACrC,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,mBAAmB;EAC5B,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,IAAI;EAz8Cb,cAAc,EAAE,iBAAuB;EACvC,iBAAiB,EAAE,iBAAuB;EAC1C,aAAa,EAAE,iBAAuB;EACtC,YAAY,EAAE,iBAAuB;EACrC,SAAS,EAAE,iBAAuB;EC0JjC,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD4yChC,oCAAwC;EAdzC,qBAAsB;IAepB,OAAO,EAAE,KAAK;;;AAEf,gCAAa;EA/8Cb,cAAc,EAAE,eAAuB;EACvC,iBAAiB,EAAE,eAAuB;EAC1C,aAAa,EAAE,eAAuB;EACtC,YAAY,EAAE,eAAuB;EACrC,SAAS,EAAE,eAAuB;;AA88ClC,uBAAE;EACD,KAAK,EAAE,wBAAoB;;AAC3B,6BAAQ;EACP,KAAK,EAAE,wBAAoB;;AAG7B,wBAAG;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;;AACT,2BAAG;EACF,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,IAAI;;AAChB,gCAAK;EACJ,YAAY,EAAE,IAAI;EAClB,OAAO,EAAE,IAAI;;AAGb,sDAAI;EACH,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;;AAClB,4DAAQ;EACP,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;EAt7Cf,WAAW,EAAE,SAAS;EACtB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,YAAY,EAAE,MAAM;EACpB,cAAc,EAAE,IAAI;EACpB,WAAW,EAAE,CAAC;;EAGd,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EA86C7B,OAAO,EAAE,OAAO;EAChB,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,wBAAoB;EC/0C/B,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;ADm1C3B,iEAAQ;EACP,iBAAiB,EAAE,eAAe;EAClC,cAAc,EAAE,eAAe;EAC/B,aAAa,EAAE,eAAe;EAC9B,YAAY,EAAE,eAAe;EAC7B,SAAS,EAAE,eAAe;;;AASjC,QAAS;EACR,QAAQ,EAAE,KAAK;EACf,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,MAAM;ECz2CjB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;ADy2ChC,eAAS;EACR,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,OAAO;;AAEpB,UAAE;EACD,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,kBAAc;EAC1B,KAAK,EA3hDU,IAAY;EA4hD3B,UAAU,EAAE,MAAM;EA9/ClB,qBAAqB,EA+/CE,GAAG;EA9/CvB,kBAAkB,EA8/CE,GAAG;EA7/CtB,iBAAiB,EA6/CE,GAAG;EA5/ClB,aAAa,EA4/CE,GAAG;;AAC1B,YAAE;EACD,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,UAAU;EACnB,cAAc,EAAE,MAAM;;AAGvB,qDAA2B;EAC1B,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,IAAI;;;AAQhB,sBAAuB;EACrB,KAAK,EAAC,IAAI;EACV,MAAM,EAAC,IAAI;EACX,MAAM,EAAE,OAAO;EACf,eAAe,EAAE,IAAI;EACrB,GAAG,EAAE,eAAe;;AAEpB,+EAAoB;EACnB,UAAU,EA5jDE,IAAI;;AA+jDjB,yFAA2B;EAC1B,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,eAAc;;AAE9B,wBAAE;EACD,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,GAAG;EACX,KAAK,EAAE,OAAO;EACd,IAAI,EAAC,sBAAsB;EAC3B,cAAc,EAAE,SAAS;EACzB,WAAW,EAAC,KAAK;EACjB,UAAU,EAAE,OAAO;EACnB,UAAU,EAAE,gBAAgB;;AAC5B,iEAAoB;EACnB,OAAO,EAAC,EAAE;EACV,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,GAAG;EACX,UAAU,EAAE,OAAO;EACnB,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAC,CAAC;EACN,UAAU,EAAC,gBAAgB;;AAI5B,+CAAI;EACH,KAAK,EAplDQ,IAAY;EAqlDzB,UAAU,EA5lDA,IAAI;;AA6lDd,+GAAoB;EACnB,UAAU,EA9lDD,IAAI;;;AAomDlB,gCAAiC;EAC/B,GAAG,EAAE,IAAI;;;AAEX,+BAAgC;EAC9B,MAAM,EAAE,IAAI;;;AAEd,sCAAuC;EACrC,GAAG,EAAE,KAAK;;;AAEZ,qCAAsC;EACpC,MAAM,EAAE,KAAK;;;AAEf,+BAAgC;EAC/B,UAAU,EAAE,WAAW;;;AAExB,uCAAwC;EACtC,GAAG,EAAC,CAAC;EACL,iBAAiB,EAAE,cAAc;EAC9B,cAAc,EAAE,cAAc;EAC7B,aAAa,EAAE,cAAc;EAC5B,YAAY,EAAE,cAAc;EACzB,SAAS,EAAE,cAAc;EACzB,UAAU,EAnnDH,IAAY;;;AAqnD7B,sCAAuC;EACrC,MAAM,EAAC,CAAC;EACR,iBAAiB,EAAE,eAAe;EAC/B,cAAc,EAAE,eAAe;EAC9B,aAAa,EAAE,eAAe;EAC7B,YAAY,EAAE,eAAe;EAC1B,SAAS,EAAE,eAAe;EAC1B,UAAU,EA5nDH,IAAY;;;AA8nD7B,sBAAuB;EACrB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;EACV,GAAG,EAAE,IAAI;EACT,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,SAAS;EAClB,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,IAAI;EAEb,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,eAAc;;AAC7B,oCAA0C;EAd5C,sBAAuB;IAepB,OAAO,EAAE,KAAK;;;;AAKjB,IAAK;EACJ,YAAY,EAAE,GAAG;EACjB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAxnDf,qBAAqB,EAynDC,CAAC;EAxnDpB,kBAAkB,EAwnDC,CAAC;EAvnDnB,iBAAiB,EAunDC,CAAC;EAtnDf,aAAa,EAsnDC,CAAC;ECh/CvB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;EDg/ChC,OAAO,EAAE,QAAQ;;AACjB,WAAS;EACR,OAAO,EAAE,mBAAkB;;AAE5B,WAAS;EACR,OAAO,EAAE,oBAAmB;;AAE7B,mCAA2B;EAC1B,UAAU,EAAE,eAAc;EAC1B,OAAO,EAAE,eAAc;;;AAGzB,YAAa;EACZ,UAAU,EE36BmB,OAAW;EF46BxC,KAAK,EAvqDW,IAAY;EAwqD5B,MAAM,EAAE,iBAAwB;;AAChC,2DAA2B;EAC1B,UAAU,EAAE,kBAAqC;EACjD,YAAY,EAAE,kBAAqC;;AAEpD,wBAAc;EACb,UAAU,EAAE,WAAW;EACvB,KAAK,EEp7BuB,OAAW;EFq7BvC,MAAM,EAAE,iBAAwB;;AAChC,+FAA2B;EAC1B,UAAU,EEv7BiB,OAAW;EFw7BtC,KAAK,EAnrDS,IAAY;;;AAurD7B,YAAa;EACZ,UAAU,EEpjCmB,OAAc;EFqjC3C,KAAK,EAzrDW,IAAY;EA0rD5B,MAAM,EAAE,iBAAwB;;AAChC,2DAA2B;EAC1B,UAAU,EAAE,kBAAoC;EAChD,YAAY,EAAE,kBAAoC;;AAEnD,wBAAc;EACb,UAAU,EAAE,WAAW;EACvB,KAAK,EE7jCuB,OAAc;EF8jC1C,MAAM,EAAE,iBAAwB;;AAChC,+FAA2B;EAC1B,UAAU,EEhkCiB,OAAc;EFikCzC,KAAK,EArsDS,IAAY;;;AAysD7B,SAAU;EACT,UAAU,EEhkCmB,OAAW;EFikCxC,KAAK,EA3sDW,IAAY;EA4sD5B,MAAM,EAAE,iBAAqB;;AAC7B,kDAA2B;EAC1B,UAAU,EAAE,kBAAiC;EAC7C,YAAY,EAAE,kBAAiC;;AAEhD,qBAAc;EACb,UAAU,EAAE,WAAW;EACvB,KAAK,EEzkCuB,OAAW;EF0kCvC,MAAM,EAAE,iBAAqB;;AAC7B,sFAA2B;EAC1B,UAAU,EE5kCiB,OAAW;EF6kCtC,KAAK,EAvtDS,IAAY;;;AA2tD7B,YAAa;EACZ,UAAU,EEtlCmB,OAAc;EFulC3C,KAAK,EA7tDW,IAAY;EA8tD5B,MAAM,EAAE,iBAAwB;;AAChC,2DAA2B;EAC1B,UAAU,EAAE,kBAAoC;EAChD,YAAY,EAAE,kBAAoC;;AAEnD,wBAAc;EACb,UAAU,EAAE,WAAW;EACvB,KAAK,EE/lCuB,OAAc;EFgmC1C,MAAM,EAAE,iBAAwB;;AAChC,+FAA2B;EAC1B,UAAU,EElmCiB,OAAc;EFmmCzC,KAAK,EAzuDS,IAAY;;;AA6uD7B,WAAY;EACX,UAAU,EEtmCmB,OAAa;EFumC1C,KAAK,EA/uDW,IAAY;EAgvD5B,MAAM,EAAE,iBAAuB;;AAC/B,wDAA2B;EAC1B,UAAU,EAAE,kBAAmC;EAC/C,YAAY,EAAE,kBAAmC;;AAElD,uBAAc;EACb,UAAU,EAAE,WAAW;EACvB,KAAK,EE/mCuB,OAAa;EFgnCzC,MAAM,EAAE,iBAAuB;;AAC/B,4FAA2B;EAC1B,UAAU,EElnCiB,OAAa;EFmnCxC,KAAK,EA3vDS,IAAY;;;AAgwD7B,YAAa;EACZ,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,cAAoC;EAC5C,SAAS,EAAE,IAAI;EC5lDd,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD4lDhC,2DAA2B;EAC1B,UAAU,EAAE,IAAI;;;AAIlB,eAAgB;EACf,QAAQ,EAAE,QAAQ;ECpmDjB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;ADomDhC,iBAAE;EACD,UAAU,EAAE,MAAM;EAClB,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,GAAG;EACV,GAAG,EAAE,GAAG;EACR,UAAU,EAAE,IAAI;EC5mDhB,kBAAkB,EAAE,IAAW;EAC1B,aAAa,EAAE,IAAW;EACvB,UAAU,EAAE,IAAW;;AD6mDhC,qBAAQ;EACP,aAAa,EAAE,IAAI;;AACnB,uBAAE;EACD,KAAK,EAzxDS,IAAY;EA0xD1B,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,OAAO;EACnB,OAAO,EAAE,CAAC;;;AAKb,aAAc;EACb,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,WAAW;EACvB,MAAM,EAAE,4BAA4B;EACpC,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;;AACd,yCAAkB;EACjB,OAAO,EAAE,IAAI;EACf,UAAU,EAAE,IAAI;EAChB,YAAY,EEhjCgB,OAAW;;;AFojCzC,UAAW;EACV,cAAc,EAAE,cAAc;;;AAE/B,UAAW;EACV,cAAc,EAAE,cAAc;;;AAE/B,UAAW;EACV,cAAc,EAAE,cAAc;;;AAG/B,UAAW;EACR,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,YAAY;;;AAGvB,kBAAmB;EAClB,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,GAAG;EACT,GAAG,EAAE,GAAG;EACR,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,+CAA+C;;;AAI3D,gBAAM;EACL,OAAO,EAAE,CAAC", +"sources": ["../sass/style.scss","../sass/bootstrap/mixins/_vendor-prefixes.scss","../sass/bootstrap/_variables.scss"], +"names": [], +"file": "style.css" +} \ No newline at end of file diff --git a/blog/assets/img/3D-Printing/3D_printer.jpg b/blog/assets/img/3D-Printing/3D_printer.jpg new file mode 100644 index 0000000..f0e1395 Binary files /dev/null and b/blog/assets/img/3D-Printing/3D_printer.jpg differ diff --git a/blog/assets/img/3D-Printing/3D_printing_html_0.gif b/blog/assets/img/3D-Printing/3D_printing_html_0.gif new file mode 100644 index 0000000..4a45cab Binary files /dev/null and b/blog/assets/img/3D-Printing/3D_printing_html_0.gif differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/Current_areas.png b/blog/assets/img/A-Dive-into-Git_Directory/Current_areas.png new file mode 100644 index 0000000..a11d139 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/Current_areas.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/Recovering_from_commit.png b/blog/assets/img/A-Dive-into-Git_Directory/Recovering_from_commit.png new file mode 100644 index 0000000..5e5d084 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/Recovering_from_commit.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/Undo_Working_tree.png b/blog/assets/img/A-Dive-into-Git_Directory/Undo_Working_tree.png new file mode 100644 index 0000000..e3c4ebb Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/Undo_Working_tree.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/Undo_staging_area.png b/blog/assets/img/A-Dive-into-Git_Directory/Undo_staging_area.png new file mode 100644 index 0000000..015b118 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/Undo_staging_area.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/branch_deletion.png b/blog/assets/img/A-Dive-into-Git_Directory/branch_deletion.png new file mode 100644 index 0000000..168d5c4 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/branch_deletion.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/branching_intro.png b/blog/assets/img/A-Dive-into-Git_Directory/branching_intro.png new file mode 100644 index 0000000..a5cb5f9 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/branching_intro.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/detached_head.png b/blog/assets/img/A-Dive-into-Git_Directory/detached_head.png new file mode 100644 index 0000000..044b6b3 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/detached_head.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/fast_forward_merge.png b/blog/assets/img/A-Dive-into-Git_Directory/fast_forward_merge.png new file mode 100644 index 0000000..c8114a5 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/fast_forward_merge.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/file1_content.png b/blog/assets/img/A-Dive-into-Git_Directory/file1_content.png new file mode 100644 index 0000000..2817c87 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/file1_content.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_branch.png b/blog/assets/img/A-Dive-into-Git_Directory/git_branch.png new file mode 100644 index 0000000..f65ac66 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_branch.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_clone.png b/blog/assets/img/A-Dive-into-Git_Directory/git_clone.png new file mode 100644 index 0000000..d1f5ed6 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_clone.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_commit.png b/blog/assets/img/A-Dive-into-Git_Directory/git_commit.png new file mode 100644 index 0000000..ba8a177 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_commit.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_config.png b/blog/assets/img/A-Dive-into-Git_Directory/git_config.png new file mode 100644 index 0000000..d9beeb2 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_config.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_diff.png b/blog/assets/img/A-Dive-into-Git_Directory/git_diff.png new file mode 100644 index 0000000..00cf209 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_diff.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_fetch.png b/blog/assets/img/A-Dive-into-Git_Directory/git_fetch.png new file mode 100644 index 0000000..3e5ff32 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_fetch.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_log.png b/blog/assets/img/A-Dive-into-Git_Directory/git_log.png new file mode 100644 index 0000000..387963e Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_log.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_merge1.png b/blog/assets/img/A-Dive-into-Git_Directory/git_merge1.png new file mode 100644 index 0000000..c0e3ea0 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_merge1.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_merge_current.png b/blog/assets/img/A-Dive-into-Git_Directory/git_merge_current.png new file mode 100644 index 0000000..007cfe4 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_merge_current.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_push.png b/blog/assets/img/A-Dive-into-Git_Directory/git_push.png new file mode 100644 index 0000000..b5a08d7 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_push.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_remote.png b/blog/assets/img/A-Dive-into-Git_Directory/git_remote.png new file mode 100644 index 0000000..e53bb4a Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_remote.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_rm.png b/blog/assets/img/A-Dive-into-Git_Directory/git_rm.png new file mode 100644 index 0000000..f733142 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_rm.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_stash1.png b/blog/assets/img/A-Dive-into-Git_Directory/git_stash1.png new file mode 100644 index 0000000..0a30d2d Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_stash1.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_stash2.png b/blog/assets/img/A-Dive-into-Git_Directory/git_stash2.png new file mode 100644 index 0000000..2a3d9fc Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_stash2.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/git_upstream.png b/blog/assets/img/A-Dive-into-Git_Directory/git_upstream.png new file mode 100644 index 0000000..ec9f02a Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/git_upstream.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/initial_empty_git.png b/blog/assets/img/A-Dive-into-Git_Directory/initial_empty_git.png new file mode 100644 index 0000000..cde4ec8 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/initial_empty_git.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/merge_conflict.png b/blog/assets/img/A-Dive-into-Git_Directory/merge_conflict.png new file mode 100644 index 0000000..0493186 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/merge_conflict.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/resolve_conflict.png b/blog/assets/img/A-Dive-into-Git_Directory/resolve_conflict.png new file mode 100644 index 0000000..5b56b4b Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/resolve_conflict.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/three_areas_git.png b/blog/assets/img/A-Dive-into-Git_Directory/three_areas_git.png new file mode 100644 index 0000000..befab28 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/three_areas_git.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/three_way.png b/blog/assets/img/A-Dive-into-Git_Directory/three_way.png new file mode 100644 index 0000000..875cb4f Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/three_way.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/three_way_performed.png b/blog/assets/img/A-Dive-into-Git_Directory/three_way_performed.png new file mode 100644 index 0000000..0152b1e Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/three_way_performed.png differ diff --git a/blog/assets/img/A-Dive-into-Git_Directory/tracking_changes.png b/blog/assets/img/A-Dive-into-Git_Directory/tracking_changes.png new file mode 100644 index 0000000..0b4e7b6 Binary files /dev/null and b/blog/assets/img/A-Dive-into-Git_Directory/tracking_changes.png differ diff --git a/blog/assets/img/A-future-called-quantum/cnot-1x.png b/blog/assets/img/A-future-called-quantum/cnot-1x.png new file mode 100644 index 0000000..f050a5b Binary files /dev/null and b/blog/assets/img/A-future-called-quantum/cnot-1x.png differ diff --git a/blog/assets/img/A-future-called-quantum/qc.jpg b/blog/assets/img/A-future-called-quantum/qc.jpg new file mode 100644 index 0000000..d2f6d79 Binary files /dev/null and b/blog/assets/img/A-future-called-quantum/qc.jpg differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/after_gets.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/after_gets.png new file mode 100644 index 0000000..361968c Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/after_gets.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/before_gets.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/before_gets.png new file mode 100644 index 0000000..f3885dd Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/before_gets.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/break_points.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/break_points.png new file mode 100644 index 0000000..9cbe942 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/break_points.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/disass.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/disass.png new file mode 100644 index 0000000..63b0da0 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/disass.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/final.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/final.png new file mode 100644 index 0000000..f5b9135 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/final.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/illegal_instruction.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/illegal_instruction.png new file mode 100644 index 0000000..4367723 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/illegal_instruction.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/random_input.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/random_input.png new file mode 100644 index 0000000..6e86823 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/random_input.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/seg_fault.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/seg_fault.png new file mode 100644 index 0000000..a1ce8a3 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/seg_fault.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/source_code1.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/source_code1.png new file mode 100644 index 0000000..dae4a4b Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/source_code1.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/use_python.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/use_python.png new file mode 100644 index 0000000..6ba8d14 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/use_python.png differ diff --git a/blog/assets/img/A-step-ahead-in-Reverse-Engineering/warning.png b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/warning.png new file mode 100644 index 0000000..416f896 Binary files /dev/null and b/blog/assets/img/A-step-ahead-in-Reverse-Engineering/warning.png differ diff --git a/blog/assets/img/Alpha-Beta-Pruning/Connect4_Minimax.png b/blog/assets/img/Alpha-Beta-Pruning/Connect4_Minimax.png new file mode 100644 index 0000000..c374aa4 Binary files /dev/null and b/blog/assets/img/Alpha-Beta-Pruning/Connect4_Minimax.png differ diff --git a/blog/assets/img/Alpha-Beta-Pruning/Connect4_Pruned.png b/blog/assets/img/Alpha-Beta-Pruning/Connect4_Pruned.png new file mode 100644 index 0000000..3bac4c5 Binary files /dev/null and b/blog/assets/img/Alpha-Beta-Pruning/Connect4_Pruned.png differ diff --git a/blog/assets/img/Alpha-Beta-Pruning/Decision_Tree.png b/blog/assets/img/Alpha-Beta-Pruning/Decision_Tree.png new file mode 100644 index 0000000..48047ae Binary files /dev/null and b/blog/assets/img/Alpha-Beta-Pruning/Decision_Tree.png differ diff --git a/blog/assets/img/Alpha-Beta-Pruning/Pruned_tree.png b/blog/assets/img/Alpha-Beta-Pruning/Pruned_tree.png new file mode 100644 index 0000000..cff2b10 Binary files /dev/null and b/blog/assets/img/Alpha-Beta-Pruning/Pruned_tree.png differ diff --git a/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/68e4e8f7b09faacb94cee0668038114b.png b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/68e4e8f7b09faacb94cee0668038114b.png new file mode 100644 index 0000000..4a65ead Binary files /dev/null and b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/68e4e8f7b09faacb94cee0668038114b.png differ diff --git a/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/9f9b14c7c8387a18adb56f643fec59b1.png b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/9f9b14c7c8387a18adb56f643fec59b1.png new file mode 100644 index 0000000..acfadf7 Binary files /dev/null and b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/9f9b14c7c8387a18adb56f643fec59b1.png differ diff --git a/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/a6b070f48cfe509264f8c5f7a071d50b.png b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/a6b070f48cfe509264f8c5f7a071d50b.png new file mode 100644 index 0000000..177fe22 Binary files /dev/null and b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/a6b070f48cfe509264f8c5f7a071d50b.png differ diff --git a/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/b2a391379b56b8a80b9048295901b39b.emf b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/b2a391379b56b8a80b9048295901b39b.emf new file mode 100644 index 0000000..94b3ba9 Binary files /dev/null and b/blog/assets/img/Applications-of-Neural-Networks-in-Power-Systems/b2a391379b56b8a80b9048295901b39b.emf differ diff --git a/blog/assets/img/Audio-Processing-NLP/mfcc.png b/blog/assets/img/Audio-Processing-NLP/mfcc.png new file mode 100644 index 0000000..9a73c14 Binary files /dev/null and b/blog/assets/img/Audio-Processing-NLP/mfcc.png differ diff --git a/blog/assets/img/Audio-Processing-NLP/wave.png b/blog/assets/img/Audio-Processing-NLP/wave.png new file mode 100644 index 0000000..86dffd9 Binary files /dev/null and b/blog/assets/img/Audio-Processing-NLP/wave.png differ diff --git a/blog/assets/img/Automate-The-Industries/Image1.jpg b/blog/assets/img/Automate-The-Industries/Image1.jpg new file mode 100644 index 0000000..f71cce2 Binary files /dev/null and b/blog/assets/img/Automate-The-Industries/Image1.jpg differ diff --git a/blog/assets/img/Automate-The-Industries/Image2.jpg b/blog/assets/img/Automate-The-Industries/Image2.jpg new file mode 100644 index 0000000..08c6385 Binary files /dev/null and b/blog/assets/img/Automate-The-Industries/Image2.jpg differ diff --git a/blog/assets/img/Automate-The-Industries/Image3.jpg b/blog/assets/img/Automate-The-Industries/Image3.jpg new file mode 100644 index 0000000..f6d027b Binary files /dev/null and b/blog/assets/img/Automate-The-Industries/Image3.jpg differ diff --git a/blog/assets/img/Automate-The-Industries/Image4.jpg b/blog/assets/img/Automate-The-Industries/Image4.jpg new file mode 100644 index 0000000..6d8b942 Binary files /dev/null and b/blog/assets/img/Automate-The-Industries/Image4.jpg differ diff --git a/blog/assets/img/BLE/BLE Architecture.jpg b/blog/assets/img/BLE/BLE Architecture.jpg new file mode 100644 index 0000000..29ad285 Binary files /dev/null and b/blog/assets/img/BLE/BLE Architecture.jpg differ diff --git a/blog/assets/img/BLE/Link Layer.png b/blog/assets/img/BLE/Link Layer.png new file mode 100644 index 0000000..1d925af Binary files /dev/null and b/blog/assets/img/BLE/Link Layer.png differ diff --git a/blog/assets/img/Bit-Manipulation/grid1.png b/blog/assets/img/Bit-Manipulation/grid1.png new file mode 100644 index 0000000..5323510 Binary files /dev/null and b/blog/assets/img/Bit-Manipulation/grid1.png differ diff --git a/blog/assets/img/Bit-Manipulation/grid2.png b/blog/assets/img/Bit-Manipulation/grid2.png new file mode 100644 index 0000000..2e0b40d Binary files /dev/null and b/blog/assets/img/Bit-Manipulation/grid2.png differ diff --git a/blog/assets/img/Bit-Manipulation/optimal1.png b/blog/assets/img/Bit-Manipulation/optimal1.png new file mode 100644 index 0000000..39827ad Binary files /dev/null and b/blog/assets/img/Bit-Manipulation/optimal1.png differ diff --git a/blog/assets/img/Bit-Manipulation/optimal2.png b/blog/assets/img/Bit-Manipulation/optimal2.png new file mode 100644 index 0000000..82f2e2b Binary files /dev/null and b/blog/assets/img/Bit-Manipulation/optimal2.png differ diff --git a/blog/assets/img/BitTorrent-Explained/pic1.png b/blog/assets/img/BitTorrent-Explained/pic1.png new file mode 100644 index 0000000..dfc40ed Binary files /dev/null and b/blog/assets/img/BitTorrent-Explained/pic1.png differ diff --git a/blog/assets/img/BitTorrent-Explained/pic2.jpg b/blog/assets/img/BitTorrent-Explained/pic2.jpg new file mode 100644 index 0000000..638e248 Binary files /dev/null and b/blog/assets/img/BitTorrent-Explained/pic2.jpg differ diff --git a/blog/assets/img/BoT/image1.jpg b/blog/assets/img/BoT/image1.jpg new file mode 100644 index 0000000..4c78a15 Binary files /dev/null and b/blog/assets/img/BoT/image1.jpg differ diff --git a/blog/assets/img/Compro1/BIJYViEh-aABuJnQqmPPzVhNDMKjIJFAw6VGRdCd8OvVct8bD4FlU9149DiI7TlRPGWUgxHq3XNBuKDJkXotl-RFH4QObPULzi7MgSVsvu8HiNZa1VJEDpMz_Siz2HT4qBHORM1H.jpg b/blog/assets/img/Compro1/BIJYViEh-aABuJnQqmPPzVhNDMKjIJFAw6VGRdCd8OvVct8bD4FlU9149DiI7TlRPGWUgxHq3XNBuKDJkXotl-RFH4QObPULzi7MgSVsvu8HiNZa1VJEDpMz_Siz2HT4qBHORM1H.jpg new file mode 100644 index 0000000..11eaf84 Binary files /dev/null and b/blog/assets/img/Compro1/BIJYViEh-aABuJnQqmPPzVhNDMKjIJFAw6VGRdCd8OvVct8bD4FlU9149DiI7TlRPGWUgxHq3XNBuKDJkXotl-RFH4QObPULzi7MgSVsvu8HiNZa1VJEDpMz_Siz2HT4qBHORM1H.jpg differ diff --git a/blog/assets/img/Compro1/M2tjsegWNC1ddIIXDq8PW7oOq-L9OjAM6MuJ11rs8OAl_PTHuhOQBGioTKztW1yWAHlbHhAx1WkSLb5EQm6GM5rGhnnAPKQsMvfyXnu0fv_CfuKkAMW7_ntvUBYFwS7ybKKNjdLw.jpg b/blog/assets/img/Compro1/M2tjsegWNC1ddIIXDq8PW7oOq-L9OjAM6MuJ11rs8OAl_PTHuhOQBGioTKztW1yWAHlbHhAx1WkSLb5EQm6GM5rGhnnAPKQsMvfyXnu0fv_CfuKkAMW7_ntvUBYFwS7ybKKNjdLw.jpg new file mode 100644 index 0000000..2e97d6a Binary files /dev/null and b/blog/assets/img/Compro1/M2tjsegWNC1ddIIXDq8PW7oOq-L9OjAM6MuJ11rs8OAl_PTHuhOQBGioTKztW1yWAHlbHhAx1WkSLb5EQm6GM5rGhnnAPKQsMvfyXnu0fv_CfuKkAMW7_ntvUBYFwS7ybKKNjdLw.jpg differ diff --git a/blog/assets/img/Compro1/opmyfRvgD9xbWHuRU0GmT3aHDgAv5w0H1hpWXHYthAOikFenCJb8aKsmFLEZiNB_3rCSImpF80PgXE9XFTydsdpDs8fESjYLicvZ1fb3tYISJLoNjBFdz3LnAuEFKL0v6gJR3ekN.jpg b/blog/assets/img/Compro1/opmyfRvgD9xbWHuRU0GmT3aHDgAv5w0H1hpWXHYthAOikFenCJb8aKsmFLEZiNB_3rCSImpF80PgXE9XFTydsdpDs8fESjYLicvZ1fb3tYISJLoNjBFdz3LnAuEFKL0v6gJR3ekN.jpg new file mode 100644 index 0000000..2356f83 Binary files /dev/null and b/blog/assets/img/Compro1/opmyfRvgD9xbWHuRU0GmT3aHDgAv5w0H1hpWXHYthAOikFenCJb8aKsmFLEZiNB_3rCSImpF80PgXE9XFTydsdpDs8fESjYLicvZ1fb3tYISJLoNjBFdz3LnAuEFKL0v6gJR3ekN.jpg differ diff --git a/blog/assets/img/DP_on_Trees/1.png b/blog/assets/img/DP_on_Trees/1.png new file mode 100644 index 0000000..55ce2cd Binary files /dev/null and b/blog/assets/img/DP_on_Trees/1.png differ diff --git a/blog/assets/img/DP_on_Trees/10.png b/blog/assets/img/DP_on_Trees/10.png new file mode 100644 index 0000000..bce502a Binary files /dev/null and b/blog/assets/img/DP_on_Trees/10.png differ diff --git a/blog/assets/img/DP_on_Trees/11.png b/blog/assets/img/DP_on_Trees/11.png new file mode 100644 index 0000000..9b2dcab Binary files /dev/null and b/blog/assets/img/DP_on_Trees/11.png differ diff --git a/blog/assets/img/DP_on_Trees/12.png b/blog/assets/img/DP_on_Trees/12.png new file mode 100644 index 0000000..428caf9 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/12.png differ diff --git a/blog/assets/img/DP_on_Trees/13.png b/blog/assets/img/DP_on_Trees/13.png new file mode 100644 index 0000000..ae9d7c1 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/13.png differ diff --git a/blog/assets/img/DP_on_Trees/14.png b/blog/assets/img/DP_on_Trees/14.png new file mode 100644 index 0000000..5ef9d23 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/14.png differ diff --git a/blog/assets/img/DP_on_Trees/15.png b/blog/assets/img/DP_on_Trees/15.png new file mode 100644 index 0000000..933e4ce Binary files /dev/null and b/blog/assets/img/DP_on_Trees/15.png differ diff --git a/blog/assets/img/DP_on_Trees/16.png b/blog/assets/img/DP_on_Trees/16.png new file mode 100644 index 0000000..f812957 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/16.png differ diff --git a/blog/assets/img/DP_on_Trees/17.png b/blog/assets/img/DP_on_Trees/17.png new file mode 100644 index 0000000..051ba7f Binary files /dev/null and b/blog/assets/img/DP_on_Trees/17.png differ diff --git a/blog/assets/img/DP_on_Trees/18.png b/blog/assets/img/DP_on_Trees/18.png new file mode 100644 index 0000000..1045294 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/18.png differ diff --git a/blog/assets/img/DP_on_Trees/19.png b/blog/assets/img/DP_on_Trees/19.png new file mode 100644 index 0000000..f608f9f Binary files /dev/null and b/blog/assets/img/DP_on_Trees/19.png differ diff --git a/blog/assets/img/DP_on_Trees/2.png b/blog/assets/img/DP_on_Trees/2.png new file mode 100644 index 0000000..28846fe Binary files /dev/null and b/blog/assets/img/DP_on_Trees/2.png differ diff --git a/blog/assets/img/DP_on_Trees/20.png b/blog/assets/img/DP_on_Trees/20.png new file mode 100644 index 0000000..e67ab62 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/20.png differ diff --git a/blog/assets/img/DP_on_Trees/21.png b/blog/assets/img/DP_on_Trees/21.png new file mode 100644 index 0000000..2651693 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/21.png differ diff --git a/blog/assets/img/DP_on_Trees/22.png b/blog/assets/img/DP_on_Trees/22.png new file mode 100644 index 0000000..b2afc6b Binary files /dev/null and b/blog/assets/img/DP_on_Trees/22.png differ diff --git a/blog/assets/img/DP_on_Trees/23.png b/blog/assets/img/DP_on_Trees/23.png new file mode 100644 index 0000000..117d870 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/23.png differ diff --git a/blog/assets/img/DP_on_Trees/24.png b/blog/assets/img/DP_on_Trees/24.png new file mode 100644 index 0000000..721eaf2 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/24.png differ diff --git a/blog/assets/img/DP_on_Trees/25.png b/blog/assets/img/DP_on_Trees/25.png new file mode 100644 index 0000000..1204fad Binary files /dev/null and b/blog/assets/img/DP_on_Trees/25.png differ diff --git a/blog/assets/img/DP_on_Trees/26.png b/blog/assets/img/DP_on_Trees/26.png new file mode 100644 index 0000000..70cb8be Binary files /dev/null and b/blog/assets/img/DP_on_Trees/26.png differ diff --git a/blog/assets/img/DP_on_Trees/27.png b/blog/assets/img/DP_on_Trees/27.png new file mode 100644 index 0000000..a746569 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/27.png differ diff --git a/blog/assets/img/DP_on_Trees/28.png b/blog/assets/img/DP_on_Trees/28.png new file mode 100644 index 0000000..f320403 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/28.png differ diff --git a/blog/assets/img/DP_on_Trees/29.png b/blog/assets/img/DP_on_Trees/29.png new file mode 100644 index 0000000..765fccc Binary files /dev/null and b/blog/assets/img/DP_on_Trees/29.png differ diff --git a/blog/assets/img/DP_on_Trees/3.png b/blog/assets/img/DP_on_Trees/3.png new file mode 100644 index 0000000..b6651d1 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/3.png differ diff --git a/blog/assets/img/DP_on_Trees/30.png b/blog/assets/img/DP_on_Trees/30.png new file mode 100644 index 0000000..f365978 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/30.png differ diff --git a/blog/assets/img/DP_on_Trees/31.png b/blog/assets/img/DP_on_Trees/31.png new file mode 100644 index 0000000..1e33789 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/31.png differ diff --git a/blog/assets/img/DP_on_Trees/32.png b/blog/assets/img/DP_on_Trees/32.png new file mode 100644 index 0000000..a459e1f Binary files /dev/null and b/blog/assets/img/DP_on_Trees/32.png differ diff --git a/blog/assets/img/DP_on_Trees/33.png b/blog/assets/img/DP_on_Trees/33.png new file mode 100644 index 0000000..8ab601f Binary files /dev/null and b/blog/assets/img/DP_on_Trees/33.png differ diff --git a/blog/assets/img/DP_on_Trees/34.png b/blog/assets/img/DP_on_Trees/34.png new file mode 100644 index 0000000..7ed73dc Binary files /dev/null and b/blog/assets/img/DP_on_Trees/34.png differ diff --git a/blog/assets/img/DP_on_Trees/4.png b/blog/assets/img/DP_on_Trees/4.png new file mode 100644 index 0000000..185f31d Binary files /dev/null and b/blog/assets/img/DP_on_Trees/4.png differ diff --git a/blog/assets/img/DP_on_Trees/5.png b/blog/assets/img/DP_on_Trees/5.png new file mode 100644 index 0000000..399bfcb Binary files /dev/null and b/blog/assets/img/DP_on_Trees/5.png differ diff --git a/blog/assets/img/DP_on_Trees/6.png b/blog/assets/img/DP_on_Trees/6.png new file mode 100644 index 0000000..f24c8a3 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/6.png differ diff --git a/blog/assets/img/DP_on_Trees/7.png b/blog/assets/img/DP_on_Trees/7.png new file mode 100644 index 0000000..18c569e Binary files /dev/null and b/blog/assets/img/DP_on_Trees/7.png differ diff --git a/blog/assets/img/DP_on_Trees/8.png b/blog/assets/img/DP_on_Trees/8.png new file mode 100644 index 0000000..9be20b5 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/8.png differ diff --git a/blog/assets/img/DP_on_Trees/9.png b/blog/assets/img/DP_on_Trees/9.png new file mode 100644 index 0000000..267afc2 Binary files /dev/null and b/blog/assets/img/DP_on_Trees/9.png differ diff --git a/blog/assets/img/Disjoint-set-data-structures/1.png b/blog/assets/img/Disjoint-set-data-structures/1.png new file mode 100644 index 0000000..2992d4b Binary files /dev/null and b/blog/assets/img/Disjoint-set-data-structures/1.png differ diff --git a/blog/assets/img/Docker/docker-vm-container.png b/blog/assets/img/Docker/docker-vm-container.png new file mode 100644 index 0000000..55a3999 Binary files /dev/null and b/blog/assets/img/Docker/docker-vm-container.png differ diff --git a/blog/assets/img/EKRANOPLAN/ekranoplan_resize_md.jpg b/blog/assets/img/EKRANOPLAN/ekranoplan_resize_md.jpg new file mode 100644 index 0000000..61864d6 Binary files /dev/null and b/blog/assets/img/EKRANOPLAN/ekranoplan_resize_md.jpg differ diff --git a/blog/assets/img/ELF-file-in-Linux/ELFHeader.png b/blog/assets/img/ELF-file-in-Linux/ELFHeader.png new file mode 100644 index 0000000..5190eea Binary files /dev/null and b/blog/assets/img/ELF-file-in-Linux/ELFHeader.png differ diff --git a/blog/assets/img/ELF-file-in-Linux/ProgramHeader.png b/blog/assets/img/ELF-file-in-Linux/ProgramHeader.png new file mode 100644 index 0000000..1a1ecd2 Binary files /dev/null and b/blog/assets/img/ELF-file-in-Linux/ProgramHeader.png differ diff --git a/blog/assets/img/ELF-file-in-Linux/SectionHeader.png b/blog/assets/img/ELF-file-in-Linux/SectionHeader.png new file mode 100644 index 0000000..2c39575 Binary files /dev/null and b/blog/assets/img/ELF-file-in-Linux/SectionHeader.png differ diff --git a/blog/assets/img/Future-of-computing-Quantum-computing/4-Qubit.png b/blog/assets/img/Future-of-computing-Quantum-computing/4-Qubit.png new file mode 100644 index 0000000..3ba73ed Binary files /dev/null and b/blog/assets/img/Future-of-computing-Quantum-computing/4-Qubit.png differ diff --git a/blog/assets/img/Future-of-computing-Quantum-computing/Bits.png b/blog/assets/img/Future-of-computing-Quantum-computing/Bits.png new file mode 100644 index 0000000..d02008d Binary files /dev/null and b/blog/assets/img/Future-of-computing-Quantum-computing/Bits.png differ diff --git a/blog/assets/img/Future-of-computing-Quantum-computing/Equation.png b/blog/assets/img/Future-of-computing-Quantum-computing/Equation.png new file mode 100644 index 0000000..47a2d8b Binary files /dev/null and b/blog/assets/img/Future-of-computing-Quantum-computing/Equation.png differ diff --git a/blog/assets/img/Future-of-computing-Quantum-computing/double_slit_expt.jpg b/blog/assets/img/Future-of-computing-Quantum-computing/double_slit_expt.jpg new file mode 100644 index 0000000..4dc86a0 Binary files /dev/null and b/blog/assets/img/Future-of-computing-Quantum-computing/double_slit_expt.jpg differ diff --git a/blog/assets/img/FutureOfDrones/drones1.png b/blog/assets/img/FutureOfDrones/drones1.png new file mode 100644 index 0000000..7b098de Binary files /dev/null and b/blog/assets/img/FutureOfDrones/drones1.png differ diff --git a/blog/assets/img/FutureOfDrones/drones2.png b/blog/assets/img/FutureOfDrones/drones2.png new file mode 100644 index 0000000..ee2c794 Binary files /dev/null and b/blog/assets/img/FutureOfDrones/drones2.png differ diff --git a/blog/assets/img/FutureOfDrones/drones3.png b/blog/assets/img/FutureOfDrones/drones3.png new file mode 100644 index 0000000..9947b87 Binary files /dev/null and b/blog/assets/img/FutureOfDrones/drones3.png differ diff --git a/blog/assets/img/FutureOfDrones/drones4.png b/blog/assets/img/FutureOfDrones/drones4.png new file mode 100644 index 0000000..d3063b5 Binary files /dev/null and b/blog/assets/img/FutureOfDrones/drones4.png differ diff --git a/blog/assets/img/FutureOfDrones/drones5.png b/blog/assets/img/FutureOfDrones/drones5.png new file mode 100644 index 0000000..e468572 Binary files /dev/null and b/blog/assets/img/FutureOfDrones/drones5.png differ diff --git a/blog/assets/img/FutureOfDrones/pollination.png b/blog/assets/img/FutureOfDrones/pollination.png new file mode 100644 index 0000000..4a40e15 Binary files /dev/null and b/blog/assets/img/FutureOfDrones/pollination.png differ diff --git a/blog/assets/img/GAN/1.jpg b/blog/assets/img/GAN/1.jpg new file mode 100644 index 0000000..ad45b7e Binary files /dev/null and b/blog/assets/img/GAN/1.jpg differ diff --git a/blog/assets/img/GAN/2.jpg b/blog/assets/img/GAN/2.jpg new file mode 100644 index 0000000..2928a24 Binary files /dev/null and b/blog/assets/img/GAN/2.jpg differ diff --git a/blog/assets/img/GAN/3.jpg b/blog/assets/img/GAN/3.jpg new file mode 100644 index 0000000..6b99382 Binary files /dev/null and b/blog/assets/img/GAN/3.jpg differ diff --git a/blog/assets/img/GAN/4.jpg b/blog/assets/img/GAN/4.jpg new file mode 100644 index 0000000..f3ecb9a Binary files /dev/null and b/blog/assets/img/GAN/4.jpg differ diff --git a/blog/assets/img/GAN/GAN.png b/blog/assets/img/GAN/GAN.png new file mode 100644 index 0000000..3164a04 Binary files /dev/null and b/blog/assets/img/GAN/GAN.png differ diff --git a/blog/assets/img/GAN/acgan.jpeg b/blog/assets/img/GAN/acgan.jpeg new file mode 100644 index 0000000..0d46833 Binary files /dev/null and b/blog/assets/img/GAN/acgan.jpeg differ diff --git a/blog/assets/img/GAN/dcgan.jpeg b/blog/assets/img/GAN/dcgan.jpeg new file mode 100644 index 0000000..42d89f9 Binary files /dev/null and b/blog/assets/img/GAN/dcgan.jpeg differ diff --git a/blog/assets/img/GAN/discogan.png b/blog/assets/img/GAN/discogan.png new file mode 100644 index 0000000..1a046e3 Binary files /dev/null and b/blog/assets/img/GAN/discogan.png differ diff --git a/blog/assets/img/GAN/ideal-gen-model.jpeg b/blog/assets/img/GAN/ideal-gen-model.jpeg new file mode 100644 index 0000000..bd00ae4 Binary files /dev/null and b/blog/assets/img/GAN/ideal-gen-model.jpeg differ diff --git a/blog/assets/img/GAN/minimax-objective.jpeg b/blog/assets/img/GAN/minimax-objective.jpeg new file mode 100644 index 0000000..35e678c Binary files /dev/null and b/blog/assets/img/GAN/minimax-objective.jpeg differ diff --git a/blog/assets/img/GPT2_gen/decoder.png b/blog/assets/img/GPT2_gen/decoder.png new file mode 100644 index 0000000..6328d2f Binary files /dev/null and b/blog/assets/img/GPT2_gen/decoder.png differ diff --git a/blog/assets/img/GPT2_gen/transformer_block.svg b/blog/assets/img/GPT2_gen/transformer_block.svg new file mode 100644 index 0000000..8335b65 --- /dev/null +++ b/blog/assets/img/GPT2_gen/transformer_block.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blog/assets/img/Genome-Editing/figure1.jpg b/blog/assets/img/Genome-Editing/figure1.jpg new file mode 100644 index 0000000..77d105b Binary files /dev/null and b/blog/assets/img/Genome-Editing/figure1.jpg differ diff --git a/blog/assets/img/Genome-Editing/figure2.jpg b/blog/assets/img/Genome-Editing/figure2.jpg new file mode 100644 index 0000000..b7f0f32 Binary files /dev/null and b/blog/assets/img/Genome-Editing/figure2.jpg differ diff --git a/blog/assets/img/Hello-World/intro.png b/blog/assets/img/Hello-World/intro.png new file mode 100644 index 0000000..a7e182c Binary files /dev/null and b/blog/assets/img/Hello-World/intro.png differ diff --git a/blog/assets/img/High-Lift-devices/boost.jpg b/blog/assets/img/High-Lift-devices/boost.jpg new file mode 100644 index 0000000..5ce006c Binary files /dev/null and b/blog/assets/img/High-Lift-devices/boost.jpg differ diff --git a/blog/assets/img/High-Lift-devices/chords.gif b/blog/assets/img/High-Lift-devices/chords.gif new file mode 100644 index 0000000..46e61b1 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/chords.gif differ diff --git a/blog/assets/img/High-Lift-devices/flaps.gif b/blog/assets/img/High-Lift-devices/flaps.gif new file mode 100644 index 0000000..daf5590 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/flaps.gif differ diff --git a/blog/assets/img/High-Lift-devices/img1.jpg b/blog/assets/img/High-Lift-devices/img1.jpg new file mode 100644 index 0000000..f2b575c Binary files /dev/null and b/blog/assets/img/High-Lift-devices/img1.jpg differ diff --git a/blog/assets/img/High-Lift-devices/img2.png b/blog/assets/img/High-Lift-devices/img2.png new file mode 100644 index 0000000..05763d0 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/img2.png differ diff --git a/blog/assets/img/High-Lift-devices/img3.jpg b/blog/assets/img/High-Lift-devices/img3.jpg new file mode 100644 index 0000000..d5e6e77 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/img3.jpg differ diff --git a/blog/assets/img/High-Lift-devices/lerx.jpg b/blog/assets/img/High-Lift-devices/lerx.jpg new file mode 100644 index 0000000..9f1124a Binary files /dev/null and b/blog/assets/img/High-Lift-devices/lerx.jpg differ diff --git a/blog/assets/img/High-Lift-devices/lerx.png b/blog/assets/img/High-Lift-devices/lerx.png new file mode 100644 index 0000000..c168da5 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/lerx.png differ diff --git a/blog/assets/img/High-Lift-devices/lerx2.jpg b/blog/assets/img/High-Lift-devices/lerx2.jpg new file mode 100644 index 0000000..d5e6e77 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/lerx2.jpg differ diff --git a/blog/assets/img/High-Lift-devices/phew.jpg b/blog/assets/img/High-Lift-devices/phew.jpg new file mode 100644 index 0000000..252d310 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/phew.jpg differ diff --git a/blog/assets/img/High-Lift-devices/slats1.png b/blog/assets/img/High-Lift-devices/slats1.png new file mode 100644 index 0000000..31b21d3 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/slats1.png differ diff --git a/blog/assets/img/High-Lift-devices/slats2.png b/blog/assets/img/High-Lift-devices/slats2.png new file mode 100644 index 0000000..1f3b9e2 Binary files /dev/null and b/blog/assets/img/High-Lift-devices/slats2.png differ diff --git a/blog/assets/img/How Computers LearnToPlayGames/Alpha-Go.jpg b/blog/assets/img/How Computers LearnToPlayGames/Alpha-Go.jpg new file mode 100644 index 0000000..25e2c1f Binary files /dev/null and b/blog/assets/img/How Computers LearnToPlayGames/Alpha-Go.jpg differ diff --git a/blog/assets/img/How Computers LearnToPlayGames/Monte-Carlo-Tree-Search.png b/blog/assets/img/How Computers LearnToPlayGames/Monte-Carlo-Tree-Search.png new file mode 100644 index 0000000..e057288 Binary files /dev/null and b/blog/assets/img/How Computers LearnToPlayGames/Monte-Carlo-Tree-Search.png differ diff --git a/blog/assets/img/How Computers LearnToPlayGames/chess.jpg b/blog/assets/img/How Computers LearnToPlayGames/chess.jpg new file mode 100644 index 0000000..5d50416 Binary files /dev/null and b/blog/assets/img/How Computers LearnToPlayGames/chess.jpg differ diff --git a/blog/assets/img/How Computers LearnToPlayGames/decision_tree.png b/blog/assets/img/How Computers LearnToPlayGames/decision_tree.png new file mode 100644 index 0000000..869da12 Binary files /dev/null and b/blog/assets/img/How Computers LearnToPlayGames/decision_tree.png differ diff --git a/blog/assets/img/How Computers LearnToPlayGames/q-learning.jpg b/blog/assets/img/How Computers LearnToPlayGames/q-learning.jpg new file mode 100644 index 0000000..b738b68 Binary files /dev/null and b/blog/assets/img/How Computers LearnToPlayGames/q-learning.jpg differ diff --git a/blog/assets/img/Intro-to-cloud/image1.png b/blog/assets/img/Intro-to-cloud/image1.png new file mode 100644 index 0000000..cee9680 Binary files /dev/null and b/blog/assets/img/Intro-to-cloud/image1.png differ diff --git a/blog/assets/img/Intro-to-cloud/image2.jpg b/blog/assets/img/Intro-to-cloud/image2.jpg new file mode 100644 index 0000000..3888196 Binary files /dev/null and b/blog/assets/img/Intro-to-cloud/image2.jpg differ diff --git a/blog/assets/img/Introduction-to-Kubernetes-Architecture/architecture.png b/blog/assets/img/Introduction-to-Kubernetes-Architecture/architecture.png new file mode 100644 index 0000000..fe7a307 Binary files /dev/null and b/blog/assets/img/Introduction-to-Kubernetes-Architecture/architecture.png differ diff --git a/blog/assets/img/Introduction-to-Kubernetes-Architecture/container vs VM.png b/blog/assets/img/Introduction-to-Kubernetes-Architecture/container vs VM.png new file mode 100644 index 0000000..05241c2 Binary files /dev/null and b/blog/assets/img/Introduction-to-Kubernetes-Architecture/container vs VM.png differ diff --git a/blog/assets/img/Introduction-to-Kubernetes-Architecture/containerevolution.png b/blog/assets/img/Introduction-to-Kubernetes-Architecture/containerevolution.png new file mode 100644 index 0000000..60fe0e2 Binary files /dev/null and b/blog/assets/img/Introduction-to-Kubernetes-Architecture/containerevolution.png differ diff --git a/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/LSTM.png b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/LSTM.png new file mode 100644 index 0000000..555700c Binary files /dev/null and b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/LSTM.png differ diff --git a/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/LSTM2.png b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/LSTM2.png new file mode 100644 index 0000000..8da4d22 Binary files /dev/null and b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/LSTM2.png differ diff --git a/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/RNN.png b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/RNN.png new file mode 100644 index 0000000..7b1447a Binary files /dev/null and b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/RNN.png differ diff --git a/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/sampleoutput1.png b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/sampleoutput1.png new file mode 100644 index 0000000..bb3c131 Binary files /dev/null and b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/sampleoutput1.png differ diff --git a/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/sampleoutput2.png b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/sampleoutput2.png new file mode 100644 index 0000000..a69b835 Binary files /dev/null and b/blog/assets/img/Long-Short-Term-Memory-Neural-Networks/sampleoutput2.png differ diff --git a/blog/assets/img/Minimax-algorithm/tic_tac_toe1.png b/blog/assets/img/Minimax-algorithm/tic_tac_toe1.png new file mode 100644 index 0000000..5968b2d Binary files /dev/null and b/blog/assets/img/Minimax-algorithm/tic_tac_toe1.png differ diff --git a/blog/assets/img/Minimax-algorithm/tic_tac_toe2.png b/blog/assets/img/Minimax-algorithm/tic_tac_toe2.png new file mode 100644 index 0000000..ba084e2 Binary files /dev/null and b/blog/assets/img/Minimax-algorithm/tic_tac_toe2.png differ diff --git a/blog/assets/img/Minimax-algorithm/tree1.png b/blog/assets/img/Minimax-algorithm/tree1.png new file mode 100644 index 0000000..312bab9 Binary files /dev/null and b/blog/assets/img/Minimax-algorithm/tree1.png differ diff --git a/blog/assets/img/Minimax-algorithm/tree2.png b/blog/assets/img/Minimax-algorithm/tree2.png new file mode 100644 index 0000000..85e6783 Binary files /dev/null and b/blog/assets/img/Minimax-algorithm/tree2.png differ diff --git a/blog/assets/img/Minimax-algorithm/tree3.png b/blog/assets/img/Minimax-algorithm/tree3.png new file mode 100644 index 0000000..9dc55f5 Binary files /dev/null and b/blog/assets/img/Minimax-algorithm/tree3.png differ diff --git a/blog/assets/img/NanoMedicine/1.jpg b/blog/assets/img/NanoMedicine/1.jpg new file mode 100644 index 0000000..e729681 Binary files /dev/null and b/blog/assets/img/NanoMedicine/1.jpg differ diff --git a/blog/assets/img/NanoMedicine/2.jpg b/blog/assets/img/NanoMedicine/2.jpg new file mode 100644 index 0000000..2fbed5a Binary files /dev/null and b/blog/assets/img/NanoMedicine/2.jpg differ diff --git a/blog/assets/img/NanoMedicine/3.jpg b/blog/assets/img/NanoMedicine/3.jpg new file mode 100644 index 0000000..2736eb8 Binary files /dev/null and b/blog/assets/img/NanoMedicine/3.jpg differ diff --git a/blog/assets/img/NanoMedicine/4.jpg b/blog/assets/img/NanoMedicine/4.jpg new file mode 100644 index 0000000..ff9e32c Binary files /dev/null and b/blog/assets/img/NanoMedicine/4.jpg differ diff --git a/blog/assets/img/NanoMedicine/5.jpg b/blog/assets/img/NanoMedicine/5.jpg new file mode 100644 index 0000000..0f57d1f Binary files /dev/null and b/blog/assets/img/NanoMedicine/5.jpg differ diff --git a/blog/assets/img/Neural-Style-Transfer/Feed_Forward.png b/blog/assets/img/Neural-Style-Transfer/Feed_Forward.png new file mode 100644 index 0000000..42aa7d3 Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/Feed_Forward.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/Instance_Normalisation.png b/blog/assets/img/Neural-Style-Transfer/Instance_Normalisation.png new file mode 100644 index 0000000..743cb11 Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/Instance_Normalisation.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/Network_Details.png b/blog/assets/img/Neural-Style-Transfer/Network_Details.png new file mode 100644 index 0000000..a83e435 Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/Network_Details.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/Normalisation.png b/blog/assets/img/Neural-Style-Transfer/Normalisation.png new file mode 100644 index 0000000..797c0fa Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/Normalisation.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/Total_Loss.png b/blog/assets/img/Neural-Style-Transfer/Total_Loss.png new file mode 100644 index 0000000..2eaa87e Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/Total_Loss.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/VGG_style.png b/blog/assets/img/Neural-Style-Transfer/VGG_style.png new file mode 100644 index 0000000..9f37285 Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/VGG_style.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/content_Loss.png b/blog/assets/img/Neural-Style-Transfer/content_Loss.png new file mode 100644 index 0000000..c3bad4d Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/content_Loss.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/style_loss1.png b/blog/assets/img/Neural-Style-Transfer/style_loss1.png new file mode 100644 index 0000000..8e4dd06 Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/style_loss1.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/style_loss2.png b/blog/assets/img/Neural-Style-Transfer/style_loss2.png new file mode 100644 index 0000000..e1233bf Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/style_loss2.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/style_prediction.png b/blog/assets/img/Neural-Style-Transfer/style_prediction.png new file mode 100644 index 0000000..a7c6d9f Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/style_prediction.png differ diff --git a/blog/assets/img/Neural-Style-Transfer/style_rep.png b/blog/assets/img/Neural-Style-Transfer/style_rep.png new file mode 100644 index 0000000..58a21a4 Binary files /dev/null and b/blog/assets/img/Neural-Style-Transfer/style_rep.png differ diff --git a/blog/assets/img/POW-consensus-blockchain/byzantine_problem.png b/blog/assets/img/POW-consensus-blockchain/byzantine_problem.png new file mode 100644 index 0000000..54023f6 Binary files /dev/null and b/blog/assets/img/POW-consensus-blockchain/byzantine_problem.png differ diff --git a/blog/assets/img/POW-consensus-blockchain/faulty_fork.png b/blog/assets/img/POW-consensus-blockchain/faulty_fork.png new file mode 100644 index 0000000..845540d Binary files /dev/null and b/blog/assets/img/POW-consensus-blockchain/faulty_fork.png differ diff --git a/blog/assets/img/Public-key-crypto/asymmetric_key_encryption.jpg b/blog/assets/img/Public-key-crypto/asymmetric_key_encryption.jpg new file mode 100644 index 0000000..b7ce400 Binary files /dev/null and b/blog/assets/img/Public-key-crypto/asymmetric_key_encryption.jpg differ diff --git a/blog/assets/img/Public-key-crypto/cryptosystem.jpg b/blog/assets/img/Public-key-crypto/cryptosystem.jpg new file mode 100644 index 0000000..f91d1ce Binary files /dev/null and b/blog/assets/img/Public-key-crypto/cryptosystem.jpg differ diff --git a/blog/assets/img/Public-key-crypto/symmetric_key_encryption.jpg b/blog/assets/img/Public-key-crypto/symmetric_key_encryption.jpg new file mode 100644 index 0000000..6410674 Binary files /dev/null and b/blog/assets/img/Public-key-crypto/symmetric_key_encryption.jpg differ diff --git a/blog/assets/img/Radar-Imaging/1.gif b/blog/assets/img/Radar-Imaging/1.gif new file mode 100644 index 0000000..635a411 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/1.gif differ diff --git a/blog/assets/img/Radar-Imaging/2.PNG b/blog/assets/img/Radar-Imaging/2.PNG new file mode 100644 index 0000000..c02bf66 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/2.PNG differ diff --git a/blog/assets/img/Radar-Imaging/3.png b/blog/assets/img/Radar-Imaging/3.png new file mode 100644 index 0000000..bae3bf7 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/3.png differ diff --git a/blog/assets/img/Radar-Imaging/4.png b/blog/assets/img/Radar-Imaging/4.png new file mode 100644 index 0000000..ef29358 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/4.png differ diff --git a/blog/assets/img/Radar-Imaging/5.PNG b/blog/assets/img/Radar-Imaging/5.PNG new file mode 100644 index 0000000..7f70e76 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/5.PNG differ diff --git a/blog/assets/img/Radar-Imaging/6.PNG b/blog/assets/img/Radar-Imaging/6.PNG new file mode 100644 index 0000000..e859229 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/6.PNG differ diff --git a/blog/assets/img/Radar-Imaging/7.PNG b/blog/assets/img/Radar-Imaging/7.PNG new file mode 100644 index 0000000..d85dfd4 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/7.PNG differ diff --git a/blog/assets/img/Radar-Imaging/8.PNG b/blog/assets/img/Radar-Imaging/8.PNG new file mode 100644 index 0000000..689efc5 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/8.PNG differ diff --git a/blog/assets/img/Radar-Imaging/9.jpg b/blog/assets/img/Radar-Imaging/9.jpg new file mode 100644 index 0000000..637cf68 Binary files /dev/null and b/blog/assets/img/Radar-Imaging/9.jpg differ diff --git a/blog/assets/img/Raspberry-Pi-Tutorial/ActiveClientTable.png b/blog/assets/img/Raspberry-Pi-Tutorial/ActiveClientTable.png new file mode 100644 index 0000000..0290f38 Binary files /dev/null and b/blog/assets/img/Raspberry-Pi-Tutorial/ActiveClientTable.png differ diff --git a/blog/assets/img/Raspberry-Pi-Tutorial/putty.png b/blog/assets/img/Raspberry-Pi-Tutorial/putty.png new file mode 100644 index 0000000..1f0013a Binary files /dev/null and b/blog/assets/img/Raspberry-Pi-Tutorial/putty.png differ diff --git a/blog/assets/img/Raspberry-Pi-Tutorial/raspbian.png b/blog/assets/img/Raspberry-Pi-Tutorial/raspbian.png new file mode 100644 index 0000000..b247c87 Binary files /dev/null and b/blog/assets/img/Raspberry-Pi-Tutorial/raspbian.png differ diff --git a/blog/assets/img/Raspberry-Pi-Tutorial/view.png b/blog/assets/img/Raspberry-Pi-Tutorial/view.png new file mode 100644 index 0000000..8e13200 Binary files /dev/null and b/blog/assets/img/Raspberry-Pi-Tutorial/view.png differ diff --git a/blog/assets/img/Reinforcement-Learning/ago.jpg b/blog/assets/img/Reinforcement-Learning/ago.jpg new file mode 100644 index 0000000..859a95f Binary files /dev/null and b/blog/assets/img/Reinforcement-Learning/ago.jpg differ diff --git a/blog/assets/img/Reinforcement-Learning/mdp.png b/blog/assets/img/Reinforcement-Learning/mdp.png new file mode 100644 index 0000000..9f6dea6 Binary files /dev/null and b/blog/assets/img/Reinforcement-Learning/mdp.png differ diff --git a/blog/assets/img/Robots-can-see-in-3D/visualisation.jpg b/blog/assets/img/Robots-can-see-in-3D/visualisation.jpg new file mode 100644 index 0000000..8656199 Binary files /dev/null and b/blog/assets/img/Robots-can-see-in-3D/visualisation.jpg differ diff --git a/blog/assets/img/SEO/gif.gif b/blog/assets/img/SEO/gif.gif new file mode 100644 index 0000000..15c9639 Binary files /dev/null and b/blog/assets/img/SEO/gif.gif differ diff --git a/blog/assets/img/SEO/titlemeta.png b/blog/assets/img/SEO/titlemeta.png new file mode 100644 index 0000000..e662207 Binary files /dev/null and b/blog/assets/img/SEO/titlemeta.png differ diff --git a/blog/assets/img/Smartphones-and-health/image1.jpg b/blog/assets/img/Smartphones-and-health/image1.jpg new file mode 100644 index 0000000..634e267 Binary files /dev/null and b/blog/assets/img/Smartphones-and-health/image1.jpg differ diff --git a/blog/assets/img/Solving-Switch-Riddle-using-RL/DIAL.png b/blog/assets/img/Solving-Switch-Riddle-using-RL/DIAL.png new file mode 100644 index 0000000..dd6f810 Binary files /dev/null and b/blog/assets/img/Solving-Switch-Riddle-using-RL/DIAL.png differ diff --git a/blog/assets/img/Solving-Switch-Riddle-using-RL/DIALarchitecture.png b/blog/assets/img/Solving-Switch-Riddle-using-RL/DIALarchitecture.png new file mode 100644 index 0000000..8990872 Binary files /dev/null and b/blog/assets/img/Solving-Switch-Riddle-using-RL/DIALarchitecture.png differ diff --git a/blog/assets/img/Solving-Switch-Riddle-using-RL/SwitchRiddle.png b/blog/assets/img/Solving-Switch-Riddle-using-RL/SwitchRiddle.png new file mode 100644 index 0000000..8d244f7 Binary files /dev/null and b/blog/assets/img/Solving-Switch-Riddle-using-RL/SwitchRiddle.png differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image1.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image1.jpg new file mode 100644 index 0000000..a1477f0 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image1.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image10.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image10.jpg new file mode 100644 index 0000000..bec417c Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image10.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image11.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image11.jpg new file mode 100644 index 0000000..96341b8 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image11.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image12.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image12.jpg new file mode 100644 index 0000000..91644c5 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image12.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image13.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image13.jpg new file mode 100644 index 0000000..3c8a421 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image13.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image14.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image14.jpg new file mode 100644 index 0000000..8e4f129 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image14.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image15.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image15.jpg new file mode 100644 index 0000000..2325ff2 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image15.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image16.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image16.jpg new file mode 100644 index 0000000..6c74da4 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image16.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image17.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image17.jpg new file mode 100644 index 0000000..4805423 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image17.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image18.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image18.jpg new file mode 100644 index 0000000..2dda3dc Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image18.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image2.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image2.jpg new file mode 100644 index 0000000..c2e6619 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image2.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image20.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image20.jpg new file mode 100644 index 0000000..a45c54d Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image20.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image21.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image21.jpg new file mode 100644 index 0000000..c2593cf Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image21.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image22.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image22.jpg new file mode 100644 index 0000000..a45c54d Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image22.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image23.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image23.jpg new file mode 100644 index 0000000..63e1fc5 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image23.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image24.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image24.jpg new file mode 100644 index 0000000..7fc1c73 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image24.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image25.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image25.jpg new file mode 100644 index 0000000..72a1940 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image25.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image26.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image26.jpg new file mode 100644 index 0000000..706a37c Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image26.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image27.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image27.jpg new file mode 100644 index 0000000..3a87a43 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image27.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image28.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image28.jpg new file mode 100644 index 0000000..f7fdfe0 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image28.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image3.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image3.jpg new file mode 100644 index 0000000..d80a42a Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image3.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image4.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image4.jpg new file mode 100644 index 0000000..1f2f672 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image4.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image5.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image5.jpg new file mode 100644 index 0000000..e10f314 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image5.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image6.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image6.jpg new file mode 100644 index 0000000..f375c24 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image6.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image7.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image7.jpg new file mode 100644 index 0000000..c2e6619 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image7.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image8.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image8.jpg new file mode 100644 index 0000000..c84c17b Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image8.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image9.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image9.jpg new file mode 100644 index 0000000..b979f92 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/Image9.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/README.md b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/README.md new file mode 100644 index 0000000..27a67e7 --- /dev/null +++ b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/README.md @@ -0,0 +1,2 @@ +# Decomposition-of-graphs-blog- +Images of my blog diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/basic.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/basic.jpg new file mode 100644 index 0000000..a1477f0 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/basic.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/dfs1.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/dfs1.jpg new file mode 100644 index 0000000..c2e6619 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/dfs1.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/dfs2.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/dfs2.jpg new file mode 100644 index 0000000..d80a42a Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/dfs2.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/graph (20).png b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/graph (20).png new file mode 100644 index 0000000..7dcbaee Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/graph (20).png differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/image18final.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/image18final.jpg new file mode 100644 index 0000000..909e421 Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/image18final.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/image19.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/image19.jpg new file mode 100644 index 0000000..7b4637a Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/image19.jpg differ diff --git a/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/metagraph.jpg b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/metagraph.jpg new file mode 100644 index 0000000..c2593cf Binary files /dev/null and b/blog/assets/img/Solving-a-traffic-problem-using-graph-decomposition/metagraph.jpg differ diff --git a/blog/assets/img/Speed-Printing/image1.jpg b/blog/assets/img/Speed-Printing/image1.jpg new file mode 100644 index 0000000..2d15d31 Binary files /dev/null and b/blog/assets/img/Speed-Printing/image1.jpg differ diff --git a/blog/assets/img/Speed-Printing/image2.jpg b/blog/assets/img/Speed-Printing/image2.jpg new file mode 100644 index 0000000..d1461cb Binary files /dev/null and b/blog/assets/img/Speed-Printing/image2.jpg differ diff --git a/blog/assets/img/Speed-Printing/image3.jpg b/blog/assets/img/Speed-Printing/image3.jpg new file mode 100644 index 0000000..a51b1d3 Binary files /dev/null and b/blog/assets/img/Speed-Printing/image3.jpg differ diff --git a/blog/assets/img/State-Management-In-Flutter/image1.png b/blog/assets/img/State-Management-In-Flutter/image1.png new file mode 100644 index 0000000..cb61a50 Binary files /dev/null and b/blog/assets/img/State-Management-In-Flutter/image1.png differ diff --git a/blog/assets/img/State-Management-In-Flutter/image2.png b/blog/assets/img/State-Management-In-Flutter/image2.png new file mode 100644 index 0000000..e98e997 Binary files /dev/null and b/blog/assets/img/State-Management-In-Flutter/image2.png differ diff --git a/blog/assets/img/State-Management-In-Flutter/image3.png b/blog/assets/img/State-Management-In-Flutter/image3.png new file mode 100644 index 0000000..dcafd3b Binary files /dev/null and b/blog/assets/img/State-Management-In-Flutter/image3.png differ diff --git a/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image1.jpeg b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image1.jpeg new file mode 100644 index 0000000..7dcea8b Binary files /dev/null and b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image1.jpeg differ diff --git a/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image2.jpeg b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image2.jpeg new file mode 100644 index 0000000..eabe7f1 Binary files /dev/null and b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image2.jpeg differ diff --git a/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image3.jpeg b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image3.jpeg new file mode 100644 index 0000000..c723097 Binary files /dev/null and b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image3.jpeg differ diff --git a/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image4.jpeg b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image4.jpeg new file mode 100644 index 0000000..4389219 Binary files /dev/null and b/blog/assets/img/THE_AIRBAG_SYSTEM_FOR_2-WHEELER_VEHICLE/image4.jpeg differ diff --git a/blog/assets/img/TarjansAlgo/dorecursively.png b/blog/assets/img/TarjansAlgo/dorecursively.png new file mode 100644 index 0000000..92f2212 Binary files /dev/null and b/blog/assets/img/TarjansAlgo/dorecursively.png differ diff --git a/blog/assets/img/TarjansAlgo/final.png b/blog/assets/img/TarjansAlgo/final.png new file mode 100644 index 0000000..5baae59 Binary files /dev/null and b/blog/assets/img/TarjansAlgo/final.png differ diff --git a/blog/assets/img/TarjansAlgo/pickanonode.png b/blog/assets/img/TarjansAlgo/pickanonode.png new file mode 100644 index 0000000..5b1aa64 Binary files /dev/null and b/blog/assets/img/TarjansAlgo/pickanonode.png differ diff --git a/blog/assets/img/TarjansAlgo/strt2.png b/blog/assets/img/TarjansAlgo/strt2.png new file mode 100644 index 0000000..3848d1b Binary files /dev/null and b/blog/assets/img/TarjansAlgo/strt2.png differ diff --git a/blog/assets/img/TarjansAlgo/strt3.png b/blog/assets/img/TarjansAlgo/strt3.png new file mode 100644 index 0000000..1553fe6 Binary files /dev/null and b/blog/assets/img/TarjansAlgo/strt3.png differ diff --git a/blog/assets/img/TarjansAlgo/strt4.png b/blog/assets/img/TarjansAlgo/strt4.png new file mode 100644 index 0000000..dbac1bf Binary files /dev/null and b/blog/assets/img/TarjansAlgo/strt4.png differ diff --git a/blog/assets/img/TarjansAlgo/strtDFS.png b/blog/assets/img/TarjansAlgo/strtDFS.png new file mode 100644 index 0000000..3377b19 Binary files /dev/null and b/blog/assets/img/TarjansAlgo/strtDFS.png differ diff --git a/blog/assets/img/Trying-to-understand-Trie/image1.png b/blog/assets/img/Trying-to-understand-Trie/image1.png new file mode 100644 index 0000000..17bbb40 Binary files /dev/null and b/blog/assets/img/Trying-to-understand-Trie/image1.png differ diff --git a/blog/assets/img/Varistor/1.png b/blog/assets/img/Varistor/1.png new file mode 100644 index 0000000..998f1a8 Binary files /dev/null and b/blog/assets/img/Varistor/1.png differ diff --git a/blog/assets/img/Varistor/2.jpg b/blog/assets/img/Varistor/2.jpg new file mode 100644 index 0000000..4dfb47b Binary files /dev/null and b/blog/assets/img/Varistor/2.jpg differ diff --git a/blog/assets/img/Varistor/3.jpg b/blog/assets/img/Varistor/3.jpg new file mode 100644 index 0000000..6e738bc Binary files /dev/null and b/blog/assets/img/Varistor/3.jpg differ diff --git a/blog/assets/img/Varistor/4.png b/blog/assets/img/Varistor/4.png new file mode 100644 index 0000000..cbeed5c Binary files /dev/null and b/blog/assets/img/Varistor/4.png differ diff --git a/blog/assets/img/War-of-the-currents/image1.png b/blog/assets/img/War-of-the-currents/image1.png new file mode 100644 index 0000000..8f98a4d Binary files /dev/null and b/blog/assets/img/War-of-the-currents/image1.png differ diff --git a/blog/assets/img/War-of-the-currents/image2.png b/blog/assets/img/War-of-the-currents/image2.png new file mode 100644 index 0000000..dd564a7 Binary files /dev/null and b/blog/assets/img/War-of-the-currents/image2.png differ diff --git a/blog/assets/img/War-of-the-currents/image3.png b/blog/assets/img/War-of-the-currents/image3.png new file mode 100644 index 0000000..cb531f7 Binary files /dev/null and b/blog/assets/img/War-of-the-currents/image3.png differ diff --git a/blog/assets/img/WhatisML/Logistic-curve.svg b/blog/assets/img/WhatisML/Logistic-curve.svg new file mode 100644 index 0000000..541845e --- /dev/null +++ b/blog/assets/img/WhatisML/Logistic-curve.svg @@ -0,0 +1 @@ +Graph of Logistics CurveOriginally Produced by GNUPLOT 4.2 patchlevel 2, hand compressed00.51−6−4−20246 \ No newline at end of file diff --git a/blog/assets/img/WhatisML/download2.png b/blog/assets/img/WhatisML/download2.png new file mode 100644 index 0000000..2583613 Binary files /dev/null and b/blog/assets/img/WhatisML/download2.png differ diff --git a/blog/assets/img/WhatisML/download3.png b/blog/assets/img/WhatisML/download3.png new file mode 100644 index 0000000..ce95a37 Binary files /dev/null and b/blog/assets/img/WhatisML/download3.png differ diff --git a/blog/assets/img/WhatisML/o-FACEBOOK-FACIAL-RECOGNITION-570.jpg b/blog/assets/img/WhatisML/o-FACEBOOK-FACIAL-RECOGNITION-570.jpg new file mode 100644 index 0000000..7b22d92 Binary files /dev/null and b/blog/assets/img/WhatisML/o-FACEBOOK-FACIAL-RECOGNITION-570.jpg differ diff --git a/blog/assets/img/WhatisML/overfitting_21.png b/blog/assets/img/WhatisML/overfitting_21.png new file mode 100644 index 0000000..d16d79d Binary files /dev/null and b/blog/assets/img/WhatisML/overfitting_21.png differ diff --git a/blog/assets/img/Why-Machine-Learning-Matters/MLimage_1.png b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_1.png new file mode 100644 index 0000000..d073add Binary files /dev/null and b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_1.png differ diff --git a/blog/assets/img/Why-Machine-Learning-Matters/MLimage_2.png b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_2.png new file mode 100644 index 0000000..2a15ea4 Binary files /dev/null and b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_2.png differ diff --git a/blog/assets/img/Why-Machine-Learning-Matters/MLimage_3.png b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_3.png new file mode 100644 index 0000000..474f8c6 Binary files /dev/null and b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_3.png differ diff --git a/blog/assets/img/Why-Machine-Learning-Matters/MLimage_4.png b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_4.png new file mode 100644 index 0000000..abdcdb5 Binary files /dev/null and b/blog/assets/img/Why-Machine-Learning-Matters/MLimage_4.png differ diff --git a/blog/assets/img/ZeroKnowledgeProof/application.jpg b/blog/assets/img/ZeroKnowledgeProof/application.jpg new file mode 100644 index 0000000..2d1f1f8 Binary files /dev/null and b/blog/assets/img/ZeroKnowledgeProof/application.jpg differ diff --git a/blog/assets/img/ZeroKnowledgeProof/cave.gif b/blog/assets/img/ZeroKnowledgeProof/cave.gif new file mode 100644 index 0000000..6cda659 Binary files /dev/null and b/blog/assets/img/ZeroKnowledgeProof/cave.gif differ diff --git a/blog/assets/img/ZeroKnowledgeProof/introduction.jpg b/blog/assets/img/ZeroKnowledgeProof/introduction.jpg new file mode 100644 index 0000000..6a41954 Binary files /dev/null and b/blog/assets/img/ZeroKnowledgeProof/introduction.jpg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/1.jpeg b/blog/assets/img/a-comprehensive-guide-to-lifi/1.jpeg new file mode 100644 index 0000000..3bf8d24 Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/1.jpeg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/2.jpg b/blog/assets/img/a-comprehensive-guide-to-lifi/2.jpg new file mode 100644 index 0000000..a5680ae Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/2.jpg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/3.png b/blog/assets/img/a-comprehensive-guide-to-lifi/3.png new file mode 100644 index 0000000..13f0b06 Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/3.png differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/4.jpg b/blog/assets/img/a-comprehensive-guide-to-lifi/4.jpg new file mode 100644 index 0000000..113954d Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/4.jpg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/5.jpeg b/blog/assets/img/a-comprehensive-guide-to-lifi/5.jpeg new file mode 100644 index 0000000..c3d2278 Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/5.jpeg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/6.jpg b/blog/assets/img/a-comprehensive-guide-to-lifi/6.jpg new file mode 100644 index 0000000..a3f1edf Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/6.jpg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/7.jpg b/blog/assets/img/a-comprehensive-guide-to-lifi/7.jpg new file mode 100644 index 0000000..919e8a9 Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/7.jpg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/8.jpg b/blog/assets/img/a-comprehensive-guide-to-lifi/8.jpg new file mode 100644 index 0000000..d8c26fc Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/8.jpg differ diff --git a/blog/assets/img/a-comprehensive-guide-to-lifi/9.png b/blog/assets/img/a-comprehensive-guide-to-lifi/9.png new file mode 100644 index 0000000..b126ac0 Binary files /dev/null and b/blog/assets/img/a-comprehensive-guide-to-lifi/9.png differ diff --git a/blog/assets/img/alterego/alterego.jpg b/blog/assets/img/alterego/alterego.jpg new file mode 100644 index 0000000..d763e3f Binary files /dev/null and b/blog/assets/img/alterego/alterego.jpg differ diff --git a/blog/assets/img/amateur-radio/image1.jpg b/blog/assets/img/amateur-radio/image1.jpg new file mode 100644 index 0000000..44f2c60 Binary files /dev/null and b/blog/assets/img/amateur-radio/image1.jpg differ diff --git a/blog/assets/img/amazon-go/1.jpeg b/blog/assets/img/amazon-go/1.jpeg new file mode 100644 index 0000000..398f065 Binary files /dev/null and b/blog/assets/img/amazon-go/1.jpeg differ diff --git a/blog/assets/img/amazon-go/2.png b/blog/assets/img/amazon-go/2.png new file mode 100644 index 0000000..eb01717 Binary files /dev/null and b/blog/assets/img/amazon-go/2.png differ diff --git a/blog/assets/img/amazon-go/3.jpg b/blog/assets/img/amazon-go/3.jpg new file mode 100644 index 0000000..b870616 Binary files /dev/null and b/blog/assets/img/amazon-go/3.jpg differ diff --git a/blog/assets/img/amazon-go/4.jpg b/blog/assets/img/amazon-go/4.jpg new file mode 100644 index 0000000..6c815ea Binary files /dev/null and b/blog/assets/img/amazon-go/4.jpg differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image1.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image1.png new file mode 100644 index 0000000..bad265c Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image1.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image10.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image10.png new file mode 100644 index 0000000..bc95d66 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image10.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image11.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image11.png new file mode 100644 index 0000000..ac4ee06 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image11.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image12.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image12.png new file mode 100644 index 0000000..48eb7f5 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image12.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image13.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image13.png new file mode 100644 index 0000000..063d0a4 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image13.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image14.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image14.png new file mode 100644 index 0000000..9545343 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image14.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image2.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image2.png new file mode 100644 index 0000000..6844c70 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image2.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image3.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image3.png new file mode 100644 index 0000000..18852f9 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image3.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image4.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image4.png new file mode 100644 index 0000000..39b12bb Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image4.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image5.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image5.png new file mode 100644 index 0000000..8f84299 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image5.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image6.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image6.png new file mode 100644 index 0000000..3b10d4f Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image6.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image7.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image7.png new file mode 100644 index 0000000..172c86f Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image7.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image8.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image8.png new file mode 100644 index 0000000..73152ee Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image8.png differ diff --git a/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image9.png b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image9.png new file mode 100644 index 0000000..e57fd15 Binary files /dev/null and b/blog/assets/img/an-intuition-on-how-RNN-and-LSTM-works/image9.png differ diff --git a/blog/assets/img/augmented-reality/Augmented1.jpg b/blog/assets/img/augmented-reality/Augmented1.jpg new file mode 100644 index 0000000..4d62d65 Binary files /dev/null and b/blog/assets/img/augmented-reality/Augmented1.jpg differ diff --git a/blog/assets/img/augmented-reality/Facebook.jpg b/blog/assets/img/augmented-reality/Facebook.jpg new file mode 100644 index 0000000..010f270 Binary files /dev/null and b/blog/assets/img/augmented-reality/Facebook.jpg differ diff --git a/blog/assets/img/authors/17aakashsingh1999.jpg b/blog/assets/img/authors/17aakashsingh1999.jpg new file mode 100644 index 0000000..3e32c09 Binary files /dev/null and b/blog/assets/img/authors/17aakashsingh1999.jpg differ diff --git a/blog/assets/img/authors/AdithyaKannan250.jpg b/blog/assets/img/authors/AdithyaKannan250.jpg new file mode 100644 index 0000000..72a0721 Binary files /dev/null and b/blog/assets/img/authors/AdithyaKannan250.jpg differ diff --git a/blog/assets/img/authors/AdithyaRajesh.jpg b/blog/assets/img/authors/AdithyaRajesh.jpg new file mode 100644 index 0000000..b806b7a Binary files /dev/null and b/blog/assets/img/authors/AdithyaRajesh.jpg differ diff --git a/blog/assets/img/authors/AdityaRangarajan.jpeg b/blog/assets/img/authors/AdityaRangarajan.jpeg new file mode 100644 index 0000000..908f08a Binary files /dev/null and b/blog/assets/img/authors/AdityaRangarajan.jpeg differ diff --git a/blog/assets/img/authors/Aj163.png b/blog/assets/img/authors/Aj163.png new file mode 100644 index 0000000..ae0e8bf Binary files /dev/null and b/blog/assets/img/authors/Aj163.png differ diff --git a/blog/assets/img/authors/AnirudhAA.jpeg b/blog/assets/img/authors/AnirudhAA.jpeg new file mode 100644 index 0000000..f7769f0 Binary files /dev/null and b/blog/assets/img/authors/AnirudhAA.jpeg differ diff --git a/blog/assets/img/authors/AnirudhAchal.JPG b/blog/assets/img/authors/AnirudhAchal.JPG new file mode 100644 index 0000000..06e82c0 Binary files /dev/null and b/blog/assets/img/authors/AnirudhAchal.JPG differ diff --git a/blog/assets/img/authors/Ashwin_Hebbar.jpg b/blog/assets/img/authors/Ashwin_Hebbar.jpg new file mode 100644 index 0000000..2661683 Binary files /dev/null and b/blog/assets/img/authors/Ashwin_Hebbar.jpg differ diff --git a/blog/assets/img/authors/Chans321.jpg b/blog/assets/img/authors/Chans321.jpg new file mode 100644 index 0000000..1ddb1ab Binary files /dev/null and b/blog/assets/img/authors/Chans321.jpg differ diff --git a/blog/assets/img/authors/DarrenFernandes.jpeg b/blog/assets/img/authors/DarrenFernandes.jpeg new file mode 100644 index 0000000..b40c004 Binary files /dev/null and b/blog/assets/img/authors/DarrenFernandes.jpeg differ diff --git a/blog/assets/img/authors/EktaRamnani.jpg b/blog/assets/img/authors/EktaRamnani.jpg new file mode 100644 index 0000000..d374aca Binary files /dev/null and b/blog/assets/img/authors/EktaRamnani.jpg differ diff --git a/blog/assets/img/authors/HarshithRanjan.jpg b/blog/assets/img/authors/HarshithRanjan.jpg new file mode 100644 index 0000000..e2c4451 Binary files /dev/null and b/blog/assets/img/authors/HarshithRanjan.jpg differ diff --git a/blog/assets/img/authors/JaiMandal250jpg b/blog/assets/img/authors/JaiMandal250jpg new file mode 100644 index 0000000..69a9963 Binary files /dev/null and b/blog/assets/img/authors/JaiMandal250jpg differ diff --git a/blog/assets/img/authors/KaushikAlwala.jpeg b/blog/assets/img/authors/KaushikAlwala.jpeg new file mode 100644 index 0000000..f9e1a0a Binary files /dev/null and b/blog/assets/img/authors/KaushikAlwala.jpeg differ diff --git a/blog/assets/img/authors/KushagraRawat.jpg b/blog/assets/img/authors/KushagraRawat.jpg new file mode 100644 index 0000000..e49a89c Binary files /dev/null and b/blog/assets/img/authors/KushagraRawat.jpg differ diff --git a/blog/assets/img/authors/Madhuparna.jpeg b/blog/assets/img/authors/Madhuparna.jpeg new file mode 100644 index 0000000..71c39cc Binary files /dev/null and b/blog/assets/img/authors/Madhuparna.jpeg differ diff --git a/blog/assets/img/authors/ManojAB.jpg b/blog/assets/img/authors/ManojAB.jpg new file mode 100644 index 0000000..d0ab45e Binary files /dev/null and b/blog/assets/img/authors/ManojAB.jpg differ diff --git a/blog/assets/img/authors/NamamAgarwal.jpeg b/blog/assets/img/authors/NamamAgarwal.jpeg new file mode 100644 index 0000000..5fa5ee8 Binary files /dev/null and b/blog/assets/img/authors/NamamAgarwal.jpeg differ diff --git a/blog/assets/img/authors/Nandini_photo.jpg b/blog/assets/img/authors/Nandini_photo.jpg new file mode 100644 index 0000000..05cf480 Binary files /dev/null and b/blog/assets/img/authors/Nandini_photo.jpg differ diff --git a/blog/assets/img/authors/NisargBShah.jpg b/blog/assets/img/authors/NisargBShah.jpg new file mode 100644 index 0000000..0c5580d Binary files /dev/null and b/blog/assets/img/authors/NisargBShah.jpg differ diff --git a/blog/assets/img/authors/Nishanth.jpg b/blog/assets/img/authors/Nishanth.jpg new file mode 100644 index 0000000..6c750ee Binary files /dev/null and b/blog/assets/img/authors/Nishanth.jpg differ diff --git a/blog/assets/img/authors/PrajwalSBelagavi.jpg b/blog/assets/img/authors/PrajwalSBelagavi.jpg new file mode 100644 index 0000000..648c3fd Binary files /dev/null and b/blog/assets/img/authors/PrajwalSBelagavi.jpg differ diff --git a/blog/assets/img/authors/PranavDV.jpeg b/blog/assets/img/authors/PranavDV.jpeg new file mode 100644 index 0000000..8df44af Binary files /dev/null and b/blog/assets/img/authors/PranavDV.jpeg differ diff --git a/blog/assets/img/authors/PreetiKalloli.jpeg b/blog/assets/img/authors/PreetiKalloli.jpeg new file mode 100644 index 0000000..743463c Binary files /dev/null and b/blog/assets/img/authors/PreetiKalloli.jpeg differ diff --git a/blog/assets/img/authors/PrithviPatil.jpg b/blog/assets/img/authors/PrithviPatil.jpg new file mode 100644 index 0000000..e83b3e5 Binary files /dev/null and b/blog/assets/img/authors/PrithviPatil.jpg differ diff --git a/blog/assets/img/authors/Profile Picture.png b/blog/assets/img/authors/Profile Picture.png new file mode 100644 index 0000000..bdd441f Binary files /dev/null and b/blog/assets/img/authors/Profile Picture.png differ diff --git a/blog/assets/img/authors/RohitMKulkarni.jpg b/blog/assets/img/authors/RohitMKulkarni.jpg new file mode 100644 index 0000000..67144d1 Binary files /dev/null and b/blog/assets/img/authors/RohitMKulkarni.jpg differ diff --git a/blog/assets/img/authors/RosaGeorge.jpeg b/blog/assets/img/authors/RosaGeorge.jpeg new file mode 100644 index 0000000..b89a0e3 Binary files /dev/null and b/blog/assets/img/authors/RosaGeorge.jpeg differ diff --git a/blog/assets/img/authors/SaurabhAgarwala.jpg b/blog/assets/img/authors/SaurabhAgarwala.jpg new file mode 100644 index 0000000..d6e7351 Binary files /dev/null and b/blog/assets/img/authors/SaurabhAgarwala.jpg differ diff --git a/blog/assets/img/authors/ShaswataBose.jpeg b/blog/assets/img/authors/ShaswataBose.jpeg new file mode 100644 index 0000000..fcbaaee Binary files /dev/null and b/blog/assets/img/authors/ShaswataBose.jpeg differ diff --git a/blog/assets/img/authors/Shreya_Namath.jpg b/blog/assets/img/authors/Shreya_Namath.jpg new file mode 100644 index 0000000..4bb51a5 Binary files /dev/null and b/blog/assets/img/authors/Shreya_Namath.jpg differ diff --git a/blog/assets/img/authors/Shruti-Deshpande.jpeg b/blog/assets/img/authors/Shruti-Deshpande.jpeg new file mode 100644 index 0000000..bef1395 Binary files /dev/null and b/blog/assets/img/authors/Shruti-Deshpande.jpeg differ diff --git a/blog/assets/img/authors/SmitRambhiya.jpg b/blog/assets/img/authors/SmitRambhiya.jpg new file mode 100644 index 0000000..f8feb5a Binary files /dev/null and b/blog/assets/img/authors/SmitRambhiya.jpg differ diff --git a/blog/assets/img/authors/VarunRaghavendra.jpg b/blog/assets/img/authors/VarunRaghavendra.jpg new file mode 100644 index 0000000..f08ccff Binary files /dev/null and b/blog/assets/img/authors/VarunRaghavendra.jpg differ diff --git a/blog/assets/img/authors/Vineeth.jpg b/blog/assets/img/authors/Vineeth.jpg new file mode 100644 index 0000000..20f8413 Binary files /dev/null and b/blog/assets/img/authors/Vineeth.jpg differ diff --git a/blog/assets/img/authors/Vishal.jpg b/blog/assets/img/authors/Vishal.jpg new file mode 100644 index 0000000..b681438 Binary files /dev/null and b/blog/assets/img/authors/Vishal.jpg differ diff --git a/blog/assets/img/authors/a_aditya.jpeg b/blog/assets/img/authors/a_aditya.jpeg new file mode 100644 index 0000000..03b8884 Binary files /dev/null and b/blog/assets/img/authors/a_aditya.jpeg differ diff --git a/blog/assets/img/authors/abhijith_kamath.jpeg b/blog/assets/img/authors/abhijith_kamath.jpeg new file mode 100644 index 0000000..195576a Binary files /dev/null and b/blog/assets/img/authors/abhijith_kamath.jpeg differ diff --git a/blog/assets/img/authors/abhinavpy.jpg b/blog/assets/img/authors/abhinavpy.jpg new file mode 100644 index 0000000..5f594b4 Binary files /dev/null and b/blog/assets/img/authors/abhinavpy.jpg differ diff --git a/blog/assets/img/authors/abhishek.jpg b/blog/assets/img/authors/abhishek.jpg new file mode 100644 index 0000000..88f3ef1 Binary files /dev/null and b/blog/assets/img/authors/abhishek.jpg differ diff --git a/blog/assets/img/authors/adilashique.jpg b/blog/assets/img/authors/adilashique.jpg new file mode 100644 index 0000000..2e8d077 Binary files /dev/null and b/blog/assets/img/authors/adilashique.jpg differ diff --git a/blog/assets/img/authors/adithyabk.jpg b/blog/assets/img/authors/adithyabk.jpg new file mode 100644 index 0000000..ac27925 Binary files /dev/null and b/blog/assets/img/authors/adithyabk.jpg differ diff --git a/blog/assets/img/authors/aditya-c.jpeg b/blog/assets/img/authors/aditya-c.jpeg new file mode 100644 index 0000000..7d7a6b0 Binary files /dev/null and b/blog/assets/img/authors/aditya-c.jpeg differ diff --git a/blog/assets/img/authors/aditya-kulkarni.jpg b/blog/assets/img/authors/aditya-kulkarni.jpg new file mode 100644 index 0000000..c5a8469 Binary files /dev/null and b/blog/assets/img/authors/aditya-kulkarni.jpg differ diff --git a/blog/assets/img/authors/aditya.jpg b/blog/assets/img/authors/aditya.jpg new file mode 100644 index 0000000..68683c9 Binary files /dev/null and b/blog/assets/img/authors/aditya.jpg differ diff --git a/blog/assets/img/authors/adityasoho.jpg b/blog/assets/img/authors/adityasoho.jpg new file mode 100644 index 0000000..63586b8 Binary files /dev/null and b/blog/assets/img/authors/adityasoho.jpg differ diff --git a/blog/assets/img/authors/adwait.jpg b/blog/assets/img/authors/adwait.jpg new file mode 100644 index 0000000..f874a38 Binary files /dev/null and b/blog/assets/img/authors/adwait.jpg differ diff --git a/blog/assets/img/authors/akashnair.jpeg b/blog/assets/img/authors/akashnair.jpeg new file mode 100644 index 0000000..e9f3c4f Binary files /dev/null and b/blog/assets/img/authors/akashnair.jpeg differ diff --git a/blog/assets/img/authors/akshara.jpg b/blog/assets/img/authors/akshara.jpg new file mode 100644 index 0000000..955d9aa Binary files /dev/null and b/blog/assets/img/authors/akshara.jpg differ diff --git a/blog/assets/img/authors/akshay.jpg b/blog/assets/img/authors/akshay.jpg new file mode 100644 index 0000000..782f346 Binary files /dev/null and b/blog/assets/img/authors/akshay.jpg differ diff --git a/blog/assets/img/authors/akulasricharan.jpg b/blog/assets/img/authors/akulasricharan.jpg new file mode 100644 index 0000000..091d377 Binary files /dev/null and b/blog/assets/img/authors/akulasricharan.jpg differ diff --git a/blog/assets/img/authors/alabhya01.jpg b/blog/assets/img/authors/alabhya01.jpg new file mode 100644 index 0000000..6236860 Binary files /dev/null and b/blog/assets/img/authors/alabhya01.jpg differ diff --git a/blog/assets/img/authors/ameyanrd.png b/blog/assets/img/authors/ameyanrd.png new file mode 100644 index 0000000..369e514 Binary files /dev/null and b/blog/assets/img/authors/ameyanrd.png differ diff --git a/blog/assets/img/authors/anand-thamban.jpg b/blog/assets/img/authors/anand-thamban.jpg new file mode 100644 index 0000000..9272644 Binary files /dev/null and b/blog/assets/img/authors/anand-thamban.jpg differ diff --git a/blog/assets/img/authors/aneesh.jpg b/blog/assets/img/authors/aneesh.jpg new file mode 100644 index 0000000..4f9dff2 Binary files /dev/null and b/blog/assets/img/authors/aneesh.jpg differ diff --git a/blog/assets/img/authors/anirudh.jpg b/blog/assets/img/authors/anirudh.jpg new file mode 100644 index 0000000..e3eec7e Binary files /dev/null and b/blog/assets/img/authors/anirudh.jpg differ diff --git a/blog/assets/img/authors/anirudhsundar.jpg b/blog/assets/img/authors/anirudhsundar.jpg new file mode 100644 index 0000000..91a7b23 Binary files /dev/null and b/blog/assets/img/authors/anirudhsundar.jpg differ diff --git a/blog/assets/img/authors/anumeha.jpeg b/blog/assets/img/authors/anumeha.jpeg new file mode 100644 index 0000000..dc1000b Binary files /dev/null and b/blog/assets/img/authors/anumeha.jpeg differ diff --git a/blog/assets/img/authors/anupama.jpeg b/blog/assets/img/authors/anupama.jpeg new file mode 100644 index 0000000..09e12b9 Binary files /dev/null and b/blog/assets/img/authors/anupama.jpeg differ diff --git a/blog/assets/img/authors/anurag.jpg b/blog/assets/img/authors/anurag.jpg new file mode 100644 index 0000000..3c336b7 Binary files /dev/null and b/blog/assets/img/authors/anurag.jpg differ diff --git a/blog/assets/img/authors/aravindg.jpg b/blog/assets/img/authors/aravindg.jpg new file mode 100644 index 0000000..2caff4e Binary files /dev/null and b/blog/assets/img/authors/aravindg.jpg differ diff --git a/blog/assets/img/authors/archit.jpg b/blog/assets/img/authors/archit.jpg new file mode 100644 index 0000000..00182f8 Binary files /dev/null and b/blog/assets/img/authors/archit.jpg differ diff --git a/blog/assets/img/authors/arpitharaghunandan.jpeg b/blog/assets/img/authors/arpitharaghunandan.jpeg new file mode 100644 index 0000000..e97bfdc Binary files /dev/null and b/blog/assets/img/authors/arpitharaghunandan.jpeg differ diff --git a/blog/assets/img/authors/aryaman.jpg b/blog/assets/img/authors/aryaman.jpg new file mode 100644 index 0000000..6b030fc Binary files /dev/null and b/blog/assets/img/authors/aryaman.jpg differ diff --git a/blog/assets/img/authors/ashrikant39.jpg b/blog/assets/img/authors/ashrikant39.jpg new file mode 100644 index 0000000..ef1ce96 Binary files /dev/null and b/blog/assets/img/authors/ashrikant39.jpg differ diff --git a/blog/assets/img/authors/avinashkumar.jpg b/blog/assets/img/authors/avinashkumar.jpg new file mode 100644 index 0000000..3706523 Binary files /dev/null and b/blog/assets/img/authors/avinashkumar.jpg differ diff --git a/blog/assets/img/authors/ayush.png b/blog/assets/img/authors/ayush.png new file mode 100644 index 0000000..84c0511 Binary files /dev/null and b/blog/assets/img/authors/ayush.png differ diff --git a/blog/assets/img/authors/bhaskar.jpeg b/blog/assets/img/authors/bhaskar.jpeg new file mode 100644 index 0000000..cbc6cde Binary files /dev/null and b/blog/assets/img/authors/bhaskar.jpeg differ diff --git a/blog/assets/img/authors/blog-author.jpg b/blog/assets/img/authors/blog-author.jpg new file mode 100644 index 0000000..06663c1 Binary files /dev/null and b/blog/assets/img/authors/blog-author.jpg differ diff --git a/blog/assets/img/authors/bsaiprasad.jpeg b/blog/assets/img/authors/bsaiprasad.jpeg new file mode 100644 index 0000000..84576e3 Binary files /dev/null and b/blog/assets/img/authors/bsaiprasad.jpeg differ diff --git a/blog/assets/img/authors/chethan.jpg b/blog/assets/img/authors/chethan.jpg new file mode 100644 index 0000000..2b95a4e Binary files /dev/null and b/blog/assets/img/authors/chethan.jpg differ diff --git a/blog/assets/img/authors/ck.jpg b/blog/assets/img/authors/ck.jpg new file mode 100644 index 0000000..115f763 Binary files /dev/null and b/blog/assets/img/authors/ck.jpg differ diff --git a/blog/assets/img/authors/deepakkavoor.jpg b/blog/assets/img/authors/deepakkavoor.jpg new file mode 100644 index 0000000..ac919fb Binary files /dev/null and b/blog/assets/img/authors/deepakkavoor.jpg differ diff --git a/blog/assets/img/authors/dharmick.jpg b/blog/assets/img/authors/dharmick.jpg new file mode 100644 index 0000000..585ab3a Binary files /dev/null and b/blog/assets/img/authors/dharmick.jpg differ diff --git a/blog/assets/img/authors/drishika.png b/blog/assets/img/authors/drishika.png new file mode 100644 index 0000000..64aeb54 Binary files /dev/null and b/blog/assets/img/authors/drishika.png differ diff --git a/blog/assets/img/authors/garvin-pokhra.jpg b/blog/assets/img/authors/garvin-pokhra.jpg new file mode 100644 index 0000000..5785bcf Binary files /dev/null and b/blog/assets/img/authors/garvin-pokhra.jpg differ diff --git a/blog/assets/img/authors/gaurang.jpg b/blog/assets/img/authors/gaurang.jpg new file mode 100644 index 0000000..9cb9891 Binary files /dev/null and b/blog/assets/img/authors/gaurang.jpg differ diff --git a/blog/assets/img/authors/guru.jpg b/blog/assets/img/authors/guru.jpg new file mode 100644 index 0000000..07c9291 Binary files /dev/null and b/blog/assets/img/authors/guru.jpg differ diff --git a/blog/assets/img/authors/gvaibhav1734.jpg b/blog/assets/img/authors/gvaibhav1734.jpg new file mode 100644 index 0000000..e673583 Binary files /dev/null and b/blog/assets/img/authors/gvaibhav1734.jpg differ diff --git a/blog/assets/img/authors/hrily.jpg b/blog/assets/img/authors/hrily.jpg new file mode 100644 index 0000000..c1f353a Binary files /dev/null and b/blog/assets/img/authors/hrily.jpg differ diff --git a/blog/assets/img/authors/ikjotsingh.jpg b/blog/assets/img/authors/ikjotsingh.jpg new file mode 100644 index 0000000..6611251 Binary files /dev/null and b/blog/assets/img/authors/ikjotsingh.jpg differ diff --git a/blog/assets/img/authors/isha.jpg b/blog/assets/img/authors/isha.jpg new file mode 100644 index 0000000..b61541d Binary files /dev/null and b/blog/assets/img/authors/isha.jpg differ diff --git a/blog/assets/img/authors/ishita.jpeg b/blog/assets/img/authors/ishita.jpeg new file mode 100644 index 0000000..385f3e3 Binary files /dev/null and b/blog/assets/img/authors/ishita.jpeg differ diff --git a/blog/assets/img/authors/jeshventh.jpg b/blog/assets/img/authors/jeshventh.jpg new file mode 100644 index 0000000..f1bbe16 Binary files /dev/null and b/blog/assets/img/authors/jeshventh.jpg differ diff --git a/blog/assets/img/authors/jyotsna.jpeg b/blog/assets/img/authors/jyotsna.jpeg new file mode 100644 index 0000000..bf27e0a Binary files /dev/null and b/blog/assets/img/authors/jyotsna.jpeg differ diff --git a/blog/assets/img/authors/kartik.jpeg b/blog/assets/img/authors/kartik.jpeg new file mode 100644 index 0000000..8187c90 Binary files /dev/null and b/blog/assets/img/authors/kartik.jpeg differ diff --git a/blog/assets/img/authors/kinshuk.jpg b/blog/assets/img/authors/kinshuk.jpg new file mode 100644 index 0000000..da694f5 Binary files /dev/null and b/blog/assets/img/authors/kinshuk.jpg differ diff --git a/blog/assets/img/authors/kirankumar.jpg b/blog/assets/img/authors/kirankumar.jpg new file mode 100644 index 0000000..1fe4506 Binary files /dev/null and b/blog/assets/img/authors/kirankumar.jpg differ diff --git a/blog/assets/img/authors/krishnakv98.jpeg b/blog/assets/img/authors/krishnakv98.jpeg new file mode 100644 index 0000000..d7e2197 Binary files /dev/null and b/blog/assets/img/authors/krishnakv98.jpeg differ diff --git a/blog/assets/img/authors/krithikvaidya.jpeg b/blog/assets/img/authors/krithikvaidya.jpeg new file mode 100644 index 0000000..aedc1ae Binary files /dev/null and b/blog/assets/img/authors/krithikvaidya.jpeg differ diff --git a/blog/assets/img/authors/mahim_agrawal.jpg b/blog/assets/img/authors/mahim_agrawal.jpg new file mode 100644 index 0000000..705aacd Binary files /dev/null and b/blog/assets/img/authors/mahim_agrawal.jpg differ diff --git a/blog/assets/img/authors/mahir.jpg b/blog/assets/img/authors/mahir.jpg new file mode 100644 index 0000000..c93dbb8 Binary files /dev/null and b/blog/assets/img/authors/mahir.jpg differ diff --git a/blog/assets/img/authors/manavsinghal.jpeg b/blog/assets/img/authors/manavsinghal.jpeg new file mode 100644 index 0000000..6e54bc3 Binary files /dev/null and b/blog/assets/img/authors/manavsinghal.jpeg differ diff --git a/blog/assets/img/authors/megh_bhalerao.jpeg b/blog/assets/img/authors/megh_bhalerao.jpeg new file mode 100644 index 0000000..a9f5fa6 Binary files /dev/null and b/blog/assets/img/authors/megh_bhalerao.jpeg differ diff --git a/blog/assets/img/authors/megha.jpg b/blog/assets/img/authors/megha.jpg new file mode 100644 index 0000000..fa782b6 Binary files /dev/null and b/blog/assets/img/authors/megha.jpg differ diff --git a/blog/assets/img/authors/mehak.jpg b/blog/assets/img/authors/mehak.jpg new file mode 100644 index 0000000..08787f4 Binary files /dev/null and b/blog/assets/img/authors/mehak.jpg differ diff --git a/blog/assets/img/authors/mohita.jpg b/blog/assets/img/authors/mohita.jpg new file mode 100644 index 0000000..34d6d66 Binary files /dev/null and b/blog/assets/img/authors/mohita.jpg differ diff --git a/blog/assets/img/authors/mokshjain.jpg b/blog/assets/img/authors/mokshjain.jpg new file mode 100644 index 0000000..eea0464 Binary files /dev/null and b/blog/assets/img/authors/mokshjain.jpg differ diff --git a/blog/assets/img/authors/natasha-jeppu.jpg b/blog/assets/img/authors/natasha-jeppu.jpg new file mode 100644 index 0000000..829b4cb Binary files /dev/null and b/blog/assets/img/authors/natasha-jeppu.jpg differ diff --git a/blog/assets/img/authors/nikhil.png b/blog/assets/img/authors/nikhil.png new file mode 100644 index 0000000..523c6b7 Binary files /dev/null and b/blog/assets/img/authors/nikhil.png differ diff --git a/blog/assets/img/authors/nisargJ.jpg b/blog/assets/img/authors/nisargJ.jpg new file mode 100644 index 0000000..523fceb Binary files /dev/null and b/blog/assets/img/authors/nisargJ.jpg differ diff --git a/blog/assets/img/authors/nishant_nayak.jpg b/blog/assets/img/authors/nishant_nayak.jpg new file mode 100644 index 0000000..a2ed23e Binary files /dev/null and b/blog/assets/img/authors/nishant_nayak.jpg differ diff --git a/blog/assets/img/authors/no_img.png b/blog/assets/img/authors/no_img.png new file mode 100644 index 0000000..07a1461 Binary files /dev/null and b/blog/assets/img/authors/no_img.png differ diff --git a/blog/assets/img/authors/palak.jpg b/blog/assets/img/authors/palak.jpg new file mode 100644 index 0000000..19b205f Binary files /dev/null and b/blog/assets/img/authors/palak.jpg differ diff --git a/blog/assets/img/authors/praful.jpg b/blog/assets/img/authors/praful.jpg new file mode 100644 index 0000000..36ed80f Binary files /dev/null and b/blog/assets/img/authors/praful.jpg differ diff --git a/blog/assets/img/authors/prajwal.jpg b/blog/assets/img/authors/prajwal.jpg new file mode 100644 index 0000000..bfcfef3 Binary files /dev/null and b/blog/assets/img/authors/prajwal.jpg differ diff --git a/blog/assets/img/authors/pranay_praveen.jpg b/blog/assets/img/authors/pranay_praveen.jpg new file mode 100644 index 0000000..7e13098 Binary files /dev/null and b/blog/assets/img/authors/pranay_praveen.jpg differ diff --git a/blog/assets/img/authors/pratham.jpg b/blog/assets/img/authors/pratham.jpg new file mode 100644 index 0000000..a829047 Binary files /dev/null and b/blog/assets/img/authors/pratham.jpg differ diff --git a/blog/assets/img/authors/pvgupta24.jpg b/blog/assets/img/authors/pvgupta24.jpg new file mode 100644 index 0000000..809d5d1 Binary files /dev/null and b/blog/assets/img/authors/pvgupta24.jpg differ diff --git a/blog/assets/img/authors/raghunathabhishek.png b/blog/assets/img/authors/raghunathabhishek.png new file mode 100644 index 0000000..afa7f1a Binary files /dev/null and b/blog/assets/img/authors/raghunathabhishek.png differ diff --git a/blog/assets/img/authors/rahul_rl.jpg b/blog/assets/img/authors/rahul_rl.jpg new file mode 100644 index 0000000..774d225 Binary files /dev/null and b/blog/assets/img/authors/rahul_rl.jpg differ diff --git a/blog/assets/img/authors/rajat.jpg b/blog/assets/img/authors/rajat.jpg new file mode 100644 index 0000000..66ce4dc Binary files /dev/null and b/blog/assets/img/authors/rajat.jpg differ diff --git a/blog/assets/img/authors/rakshana_g.jpg b/blog/assets/img/authors/rakshana_g.jpg new file mode 100644 index 0000000..49e4e60 Binary files /dev/null and b/blog/assets/img/authors/rakshana_g.jpg differ diff --git a/blog/assets/img/authors/rakshit_p.jpeg b/blog/assets/img/authors/rakshit_p.jpeg new file mode 100644 index 0000000..6ca1f45 Binary files /dev/null and b/blog/assets/img/authors/rakshit_p.jpeg differ diff --git a/blog/assets/img/authors/rakshitavaradarajan.jpg b/blog/assets/img/authors/rakshitavaradarajan.jpg new file mode 100644 index 0000000..a9fd13b Binary files /dev/null and b/blog/assets/img/authors/rakshitavaradarajan.jpg differ diff --git a/blog/assets/img/authors/rmhanchate.png b/blog/assets/img/authors/rmhanchate.png new file mode 100644 index 0000000..bfebe63 Binary files /dev/null and b/blog/assets/img/authors/rmhanchate.png differ diff --git a/blog/assets/img/authors/rohit-mp.jpg b/blog/assets/img/authors/rohit-mp.jpg new file mode 100644 index 0000000..2230cf2 Binary files /dev/null and b/blog/assets/img/authors/rohit-mp.jpg differ diff --git a/blog/assets/img/authors/rohitkhoja.jpg b/blog/assets/img/authors/rohitkhoja.jpg new file mode 100644 index 0000000..c2f17b5 Binary files /dev/null and b/blog/assets/img/authors/rohitkhoja.jpg differ diff --git a/blog/assets/img/authors/sachin.png b/blog/assets/img/authors/sachin.png new file mode 100644 index 0000000..b309011 Binary files /dev/null and b/blog/assets/img/authors/sachin.png differ diff --git a/blog/assets/img/authors/sachitk.jpg b/blog/assets/img/authors/sachitk.jpg new file mode 100644 index 0000000..a9c32d7 Binary files /dev/null and b/blog/assets/img/authors/sachitk.jpg differ diff --git a/blog/assets/img/authors/saharsh007.jpg b/blog/assets/img/authors/saharsh007.jpg new file mode 100644 index 0000000..1b87e46 Binary files /dev/null and b/blog/assets/img/authors/saharsh007.jpg differ diff --git a/blog/assets/img/authors/salman_shah.jpg b/blog/assets/img/authors/salman_shah.jpg new file mode 100644 index 0000000..dbec279 Binary files /dev/null and b/blog/assets/img/authors/salman_shah.jpg differ diff --git a/blog/assets/img/authors/samarth.jpg b/blog/assets/img/authors/samarth.jpg new file mode 100644 index 0000000..ce0d7e3 Binary files /dev/null and b/blog/assets/img/authors/samarth.jpg differ diff --git a/blog/assets/img/authors/sanath.jpg b/blog/assets/img/authors/sanath.jpg new file mode 100644 index 0000000..8a123f0 Binary files /dev/null and b/blog/assets/img/authors/sanath.jpg differ diff --git a/blog/assets/img/authors/sandeep.jpeg b/blog/assets/img/authors/sandeep.jpeg new file mode 100644 index 0000000..4509384 Binary files /dev/null and b/blog/assets/img/authors/sandeep.jpeg differ diff --git a/blog/assets/img/authors/sanjkeet.jpg b/blog/assets/img/authors/sanjkeet.jpg new file mode 100644 index 0000000..6932ad8 Binary files /dev/null and b/blog/assets/img/authors/sanjkeet.jpg differ diff --git a/blog/assets/img/authors/santosh.jpg b/blog/assets/img/authors/santosh.jpg new file mode 100644 index 0000000..37f0841 Binary files /dev/null and b/blog/assets/img/authors/santosh.jpg differ diff --git a/blog/assets/img/authors/satyam_shivam.jpg b/blog/assets/img/authors/satyam_shivam.jpg new file mode 100644 index 0000000..6172ba0 Binary files /dev/null and b/blog/assets/img/authors/satyam_shivam.jpg differ diff --git a/blog/assets/img/authors/shanthanu.jpeg b/blog/assets/img/authors/shanthanu.jpeg new file mode 100644 index 0000000..195eac6 Binary files /dev/null and b/blog/assets/img/authors/shanthanu.jpeg differ diff --git a/blog/assets/img/authors/sharayu_brahmankar.jpg b/blog/assets/img/authors/sharayu_brahmankar.jpg new file mode 100644 index 0000000..a79b2a5 Binary files /dev/null and b/blog/assets/img/authors/sharayu_brahmankar.jpg differ diff --git a/blog/assets/img/authors/shashank_p.jpg b/blog/assets/img/authors/shashank_p.jpg new file mode 100644 index 0000000..408bcfe Binary files /dev/null and b/blog/assets/img/authors/shashank_p.jpg differ diff --git a/blog/assets/img/authors/shreeraksha.jpg b/blog/assets/img/authors/shreeraksha.jpg new file mode 100644 index 0000000..d749c23 Binary files /dev/null and b/blog/assets/img/authors/shreeraksha.jpg differ diff --git a/blog/assets/img/authors/shreevarsha.jpg b/blog/assets/img/authors/shreevarsha.jpg new file mode 100644 index 0000000..999837f Binary files /dev/null and b/blog/assets/img/authors/shreevarsha.jpg differ diff --git a/blog/assets/img/authors/shreyas.jpeg b/blog/assets/img/authors/shreyas.jpeg new file mode 100644 index 0000000..bc2250c Binary files /dev/null and b/blog/assets/img/authors/shreyas.jpeg differ diff --git a/blog/assets/img/authors/shruthan.jpg b/blog/assets/img/authors/shruthan.jpg new file mode 100644 index 0000000..9350625 Binary files /dev/null and b/blog/assets/img/authors/shruthan.jpg differ diff --git a/blog/assets/img/authors/shuvam.jpg b/blog/assets/img/authors/shuvam.jpg new file mode 100644 index 0000000..b07b56e Binary files /dev/null and b/blog/assets/img/authors/shuvam.jpg differ diff --git a/blog/assets/img/authors/shwetha.png b/blog/assets/img/authors/shwetha.png new file mode 100644 index 0000000..9904b29 Binary files /dev/null and b/blog/assets/img/authors/shwetha.png differ diff --git a/blog/assets/img/authors/siddhartha.jpg b/blog/assets/img/authors/siddhartha.jpg new file mode 100644 index 0000000..cfa7516 Binary files /dev/null and b/blog/assets/img/authors/siddhartha.jpg differ diff --git a/blog/assets/img/authors/sinchana.jpg b/blog/assets/img/authors/sinchana.jpg new file mode 100644 index 0000000..7864ef5 Binary files /dev/null and b/blog/assets/img/authors/sinchana.jpg differ diff --git a/blog/assets/img/authors/sowjanya.jpg b/blog/assets/img/authors/sowjanya.jpg new file mode 100644 index 0000000..838958f Binary files /dev/null and b/blog/assets/img/authors/sowjanya.jpg differ diff --git a/blog/assets/img/authors/sravani.jpg b/blog/assets/img/authors/sravani.jpg new file mode 100644 index 0000000..1987d92 Binary files /dev/null and b/blog/assets/img/authors/sravani.jpg differ diff --git a/blog/assets/img/authors/subbalakshmi.jpg b/blog/assets/img/authors/subbalakshmi.jpg new file mode 100644 index 0000000..7966734 Binary files /dev/null and b/blog/assets/img/authors/subbalakshmi.jpg differ diff --git a/blog/assets/img/authors/suhas_ks.jpeg b/blog/assets/img/authors/suhas_ks.jpeg new file mode 100644 index 0000000..b04b63e Binary files /dev/null and b/blog/assets/img/authors/suhas_ks.jpeg differ diff --git a/blog/assets/img/authors/suraj.jpg b/blog/assets/img/authors/suraj.jpg new file mode 100644 index 0000000..0d8b20d Binary files /dev/null and b/blog/assets/img/authors/suraj.jpg differ diff --git a/blog/assets/img/authors/suraj.png b/blog/assets/img/authors/suraj.png new file mode 100644 index 0000000..814160e Binary files /dev/null and b/blog/assets/img/authors/suraj.png differ diff --git a/blog/assets/img/authors/suraj_jagganath.jpg b/blog/assets/img/authors/suraj_jagganath.jpg new file mode 100644 index 0000000..c2374de Binary files /dev/null and b/blog/assets/img/authors/suraj_jagganath.jpg differ diff --git a/blog/assets/img/authors/swathi.png b/blog/assets/img/authors/swathi.png new file mode 100644 index 0000000..94a193f Binary files /dev/null and b/blog/assets/img/authors/swathi.png differ diff --git a/blog/assets/img/authors/tanmai.jpg b/blog/assets/img/authors/tanmai.jpg new file mode 100644 index 0000000..499d57e Binary files /dev/null and b/blog/assets/img/authors/tanmai.jpg differ diff --git a/blog/assets/img/authors/tarun_mittal.jpg b/blog/assets/img/authors/tarun_mittal.jpg new file mode 100644 index 0000000..a5b3182 Binary files /dev/null and b/blog/assets/img/authors/tarun_mittal.jpg differ diff --git a/blog/assets/img/authors/test1.jpeg b/blog/assets/img/authors/test1.jpeg new file mode 100644 index 0000000..e2a81a9 Binary files /dev/null and b/blog/assets/img/authors/test1.jpeg differ diff --git a/blog/assets/img/authors/tirthsavla.jpg b/blog/assets/img/authors/tirthsavla.jpg new file mode 100644 index 0000000..20fbd3d Binary files /dev/null and b/blog/assets/img/authors/tirthsavla.jpg differ diff --git a/blog/assets/img/authors/vaibhav.png b/blog/assets/img/authors/vaibhav.png new file mode 100644 index 0000000..c4d7719 Binary files /dev/null and b/blog/assets/img/authors/vaibhav.png differ diff --git a/blog/assets/img/authors/varshini.jpg b/blog/assets/img/authors/varshini.jpg new file mode 100644 index 0000000..1e2e691 Binary files /dev/null and b/blog/assets/img/authors/varshini.jpg differ diff --git a/blog/assets/img/authors/varshini_c.jpeg b/blog/assets/img/authors/varshini_c.jpeg new file mode 100644 index 0000000..ff5afa6 Binary files /dev/null and b/blog/assets/img/authors/varshini_c.jpeg differ diff --git a/blog/assets/img/authors/vasista.jpg b/blog/assets/img/authors/vasista.jpg new file mode 100644 index 0000000..eb26f80 Binary files /dev/null and b/blog/assets/img/authors/vasista.jpg differ diff --git a/blog/assets/img/authors/vehan_doshi.jpeg b/blog/assets/img/authors/vehan_doshi.jpeg new file mode 100644 index 0000000..949d4ca Binary files /dev/null and b/blog/assets/img/authors/vehan_doshi.jpeg differ diff --git a/blog/assets/img/authors/viba-r-udupa.jpg b/blog/assets/img/authors/viba-r-udupa.jpg new file mode 100644 index 0000000..c75be5d Binary files /dev/null and b/blog/assets/img/authors/viba-r-udupa.jpg differ diff --git a/blog/assets/img/authors/vibhore.jpg b/blog/assets/img/authors/vibhore.jpg new file mode 100644 index 0000000..724ba7e Binary files /dev/null and b/blog/assets/img/authors/vibhore.jpg differ diff --git a/blog/assets/img/authors/videh.png b/blog/assets/img/authors/videh.png new file mode 100644 index 0000000..6e9ca71 Binary files /dev/null and b/blog/assets/img/authors/videh.png differ diff --git a/blog/assets/img/authors/vighnesh.jpg b/blog/assets/img/authors/vighnesh.jpg new file mode 100644 index 0000000..c208fbd Binary files /dev/null and b/blog/assets/img/authors/vighnesh.jpg differ diff --git a/blog/assets/img/authors/vilas.jpg b/blog/assets/img/authors/vilas.jpg new file mode 100644 index 0000000..619af11 Binary files /dev/null and b/blog/assets/img/authors/vilas.jpg differ diff --git a/blog/assets/img/authors/vinayak.jpg b/blog/assets/img/authors/vinayak.jpg new file mode 100644 index 0000000..93a1607 Binary files /dev/null and b/blog/assets/img/authors/vinayak.jpg differ diff --git a/blog/assets/img/autopilot/Figure_1.png b/blog/assets/img/autopilot/Figure_1.png new file mode 100644 index 0000000..2bc205f Binary files /dev/null and b/blog/assets/img/autopilot/Figure_1.png differ diff --git a/blog/assets/img/autopilot/Figure_2.jpg b/blog/assets/img/autopilot/Figure_2.jpg new file mode 100644 index 0000000..434b3e1 Binary files /dev/null and b/blog/assets/img/autopilot/Figure_2.jpg differ diff --git a/blog/assets/img/autopilot/Figure_3.jpg b/blog/assets/img/autopilot/Figure_3.jpg new file mode 100644 index 0000000..50ea290 Binary files /dev/null and b/blog/assets/img/autopilot/Figure_3.jpg differ diff --git a/blog/assets/img/autopilot/Figure_4.jpg b/blog/assets/img/autopilot/Figure_4.jpg new file mode 100644 index 0000000..ebf1737 Binary files /dev/null and b/blog/assets/img/autopilot/Figure_4.jpg differ diff --git a/blog/assets/img/avionics/Accelerometer.jpg b/blog/assets/img/avionics/Accelerometer.jpg new file mode 100644 index 0000000..a304adb Binary files /dev/null and b/blog/assets/img/avionics/Accelerometer.jpg differ diff --git a/blog/assets/img/avionics/AccelerometerIC.jpeg b/blog/assets/img/avionics/AccelerometerIC.jpeg new file mode 100644 index 0000000..afaf2fc Binary files /dev/null and b/blog/assets/img/avionics/AccelerometerIC.jpeg differ diff --git a/blog/assets/img/avionics/DriveArmVibration.gif b/blog/assets/img/avionics/DriveArmVibration.gif new file mode 100644 index 0000000..e3f282d Binary files /dev/null and b/blog/assets/img/avionics/DriveArmVibration.gif differ diff --git a/blog/assets/img/avionics/ElectricalSignal.jpg b/blog/assets/img/avionics/ElectricalSignal.jpg new file mode 100644 index 0000000..28634f5 Binary files /dev/null and b/blog/assets/img/avionics/ElectricalSignal.jpg differ diff --git a/blog/assets/img/avionics/RadioFrequencyTransreciever.jpg b/blog/assets/img/avionics/RadioFrequencyTransreciever.jpg new file mode 100644 index 0000000..f735a60 Binary files /dev/null and b/blog/assets/img/avionics/RadioFrequencyTransreciever.jpg differ diff --git a/blog/assets/img/avionics/SensingMotion.gif b/blog/assets/img/avionics/SensingMotion.gif new file mode 100644 index 0000000..a7d451f Binary files /dev/null and b/blog/assets/img/avionics/SensingMotion.gif differ diff --git a/blog/assets/img/avionics/VerticalVibration.gif b/blog/assets/img/avionics/VerticalVibration.gif new file mode 100644 index 0000000..0b02ec9 Binary files /dev/null and b/blog/assets/img/avionics/VerticalVibration.gif differ diff --git a/blog/assets/img/avionics/WorkingOfServo.png b/blog/assets/img/avionics/WorkingOfServo.png new file mode 100644 index 0000000..975c06d Binary files /dev/null and b/blog/assets/img/avionics/WorkingOfServo.png differ diff --git a/blog/assets/img/avionics/esc.png b/blog/assets/img/avionics/esc.png new file mode 100644 index 0000000..25cd5ab Binary files /dev/null and b/blog/assets/img/avionics/esc.png differ diff --git a/blog/assets/img/avionics/microservo.jpg b/blog/assets/img/avionics/microservo.jpg new file mode 100644 index 0000000..e2aa860 Binary files /dev/null and b/blog/assets/img/avionics/microservo.jpg differ diff --git a/blog/assets/img/avionics/rotation.gif b/blog/assets/img/avionics/rotation.gif new file mode 100644 index 0000000..8b30430 Binary files /dev/null and b/blog/assets/img/avionics/rotation.gif differ diff --git a/blog/assets/img/ballistics/1.jpg b/blog/assets/img/ballistics/1.jpg new file mode 100644 index 0000000..e3839bb Binary files /dev/null and b/blog/assets/img/ballistics/1.jpg differ diff --git a/blog/assets/img/ballistics/2.jpg b/blog/assets/img/ballistics/2.jpg new file mode 100644 index 0000000..3ec3fb2 Binary files /dev/null and b/blog/assets/img/ballistics/2.jpg differ diff --git a/blog/assets/img/ballistics/3.png b/blog/assets/img/ballistics/3.png new file mode 100644 index 0000000..00221d6 Binary files /dev/null and b/blog/assets/img/ballistics/3.png differ diff --git a/blog/assets/img/ballistics/4.JPG b/blog/assets/img/ballistics/4.JPG new file mode 100644 index 0000000..59e8453 Binary files /dev/null and b/blog/assets/img/ballistics/4.JPG differ diff --git a/blog/assets/img/biohacking/1.jpg b/blog/assets/img/biohacking/1.jpg new file mode 100644 index 0000000..f8ad3b9 Binary files /dev/null and b/blog/assets/img/biohacking/1.jpg differ diff --git a/blog/assets/img/biohacking/2.png b/blog/assets/img/biohacking/2.png new file mode 100644 index 0000000..9547ef6 Binary files /dev/null and b/blog/assets/img/biohacking/2.png differ diff --git a/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/bullet_train.jpg b/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/bullet_train.jpg new file mode 100644 index 0000000..06f6f9c Binary files /dev/null and b/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/bullet_train.jpg differ diff --git a/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/eastgate.jpg b/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/eastgate.jpg new file mode 100644 index 0000000..287c45c Binary files /dev/null and b/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/eastgate.jpg differ diff --git a/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/index.jpg b/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/index.jpg new file mode 100644 index 0000000..34259e0 Binary files /dev/null and b/blog/assets/img/biomicry-creating-a-truly-sustainable-environment/index.jpg differ diff --git a/blog/assets/img/bionics-and-biomimetics/Control_System.png b/blog/assets/img/bionics-and-biomimetics/Control_System.png new file mode 100644 index 0000000..bda2d2a Binary files /dev/null and b/blog/assets/img/bionics-and-biomimetics/Control_System.png differ diff --git a/blog/assets/img/bionics-and-biomimetics/Four_Legged_Robot.jpg b/blog/assets/img/bionics-and-biomimetics/Four_Legged_Robot.jpg new file mode 100644 index 0000000..5183b94 Binary files /dev/null and b/blog/assets/img/bionics-and-biomimetics/Four_Legged_Robot.jpg differ diff --git a/blog/assets/img/bionics-and-biomimetics/Rimless_Wheel.png b/blog/assets/img/bionics-and-biomimetics/Rimless_Wheel.png new file mode 100644 index 0000000..7c5556b Binary files /dev/null and b/blog/assets/img/bionics-and-biomimetics/Rimless_Wheel.png differ diff --git a/blog/assets/img/bionics/img1.gif b/blog/assets/img/bionics/img1.gif new file mode 100644 index 0000000..c12f7d1 Binary files /dev/null and b/blog/assets/img/bionics/img1.gif differ diff --git a/blog/assets/img/bionics/img2.jpg b/blog/assets/img/bionics/img2.jpg new file mode 100644 index 0000000..742bf9d Binary files /dev/null and b/blog/assets/img/bionics/img2.jpg differ diff --git a/blog/assets/img/blackjack/GPI.png b/blog/assets/img/blackjack/GPI.png new file mode 100644 index 0000000..f015635 Binary files /dev/null and b/blog/assets/img/blackjack/GPI.png differ diff --git a/blog/assets/img/blackjack/backups.png b/blog/assets/img/blackjack/backups.png new file mode 100644 index 0000000..821a689 Binary files /dev/null and b/blog/assets/img/blackjack/backups.png differ diff --git a/blog/assets/img/blackjack/mc-backup.png b/blog/assets/img/blackjack/mc-backup.png new file mode 100644 index 0000000..89a8861 Binary files /dev/null and b/blog/assets/img/blackjack/mc-backup.png differ diff --git a/blog/assets/img/blackjack/mc-eval.jpg b/blog/assets/img/blackjack/mc-eval.jpg new file mode 100644 index 0000000..5c03eec Binary files /dev/null and b/blog/assets/img/blackjack/mc-eval.jpg differ diff --git a/blog/assets/img/blackjack/mc-pol.JPG b/blog/assets/img/blackjack/mc-pol.JPG new file mode 100644 index 0000000..f3d3903 Binary files /dev/null and b/blog/assets/img/blackjack/mc-pol.JPG differ diff --git a/blog/assets/img/blackjack/pavlov.jpg b/blog/assets/img/blackjack/pavlov.jpg new file mode 100644 index 0000000..d71bc80 Binary files /dev/null and b/blog/assets/img/blackjack/pavlov.jpg differ diff --git a/blog/assets/img/blackjack/pistar.png b/blog/assets/img/blackjack/pistar.png new file mode 100644 index 0000000..17da527 Binary files /dev/null and b/blog/assets/img/blackjack/pistar.png differ diff --git a/blog/assets/img/blackjack/q-backup.png b/blog/assets/img/blackjack/q-backup.png new file mode 100644 index 0000000..229a73a Binary files /dev/null and b/blog/assets/img/blackjack/q-backup.png differ diff --git a/blog/assets/img/blackjack/q-pol.JPG b/blog/assets/img/blackjack/q-pol.JPG new file mode 100644 index 0000000..84a34ca Binary files /dev/null and b/blog/assets/img/blackjack/q-pol.JPG differ diff --git a/blog/assets/img/blackjack/rl.jpg b/blog/assets/img/blackjack/rl.jpg new file mode 100644 index 0000000..72cc317 Binary files /dev/null and b/blog/assets/img/blackjack/rl.jpg differ diff --git a/blog/assets/img/blog-image.png b/blog/assets/img/blog-image.png new file mode 100644 index 0000000..7be7737 Binary files /dev/null and b/blog/assets/img/blog-image.png differ diff --git a/blog/assets/img/brain-computer-interface/img1.jpeg b/blog/assets/img/brain-computer-interface/img1.jpeg new file mode 100644 index 0000000..b62a716 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img1.jpeg differ diff --git a/blog/assets/img/brain-computer-interface/img2.jpeg b/blog/assets/img/brain-computer-interface/img2.jpeg new file mode 100644 index 0000000..1ca461f Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img2.jpeg differ diff --git a/blog/assets/img/brain-computer-interface/img3.jpg b/blog/assets/img/brain-computer-interface/img3.jpg new file mode 100644 index 0000000..74ca27c Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img3.jpg differ diff --git a/blog/assets/img/brain-computer-interface/img4.jpg b/blog/assets/img/brain-computer-interface/img4.jpg new file mode 100644 index 0000000..b87d6a8 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img4.jpg differ diff --git a/blog/assets/img/brain-computer-interface/img4a.jpg b/blog/assets/img/brain-computer-interface/img4a.jpg new file mode 100644 index 0000000..4acd1d7 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img4a.jpg differ diff --git a/blog/assets/img/brain-computer-interface/img5.jpg b/blog/assets/img/brain-computer-interface/img5.jpg new file mode 100644 index 0000000..40c3a28 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img5.jpg differ diff --git a/blog/assets/img/brain-computer-interface/img6.jpg b/blog/assets/img/brain-computer-interface/img6.jpg new file mode 100644 index 0000000..ada89d9 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img6.jpg differ diff --git a/blog/assets/img/brain-computer-interface/img7.png b/blog/assets/img/brain-computer-interface/img7.png new file mode 100644 index 0000000..1962659 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img7.png differ diff --git a/blog/assets/img/brain-computer-interface/img8.jpg b/blog/assets/img/brain-computer-interface/img8.jpg new file mode 100644 index 0000000..fe67322 Binary files /dev/null and b/blog/assets/img/brain-computer-interface/img8.jpg differ diff --git a/blog/assets/img/by_wire/fig1.jpg b/blog/assets/img/by_wire/fig1.jpg new file mode 100644 index 0000000..e147c0e Binary files /dev/null and b/blog/assets/img/by_wire/fig1.jpg differ diff --git a/blog/assets/img/by_wire/fig2a.jpg b/blog/assets/img/by_wire/fig2a.jpg new file mode 100644 index 0000000..0ee9afd Binary files /dev/null and b/blog/assets/img/by_wire/fig2a.jpg differ diff --git a/blog/assets/img/by_wire/fig2b.jpg b/blog/assets/img/by_wire/fig2b.jpg new file mode 100644 index 0000000..0dda1ad Binary files /dev/null and b/blog/assets/img/by_wire/fig2b.jpg differ diff --git a/blog/assets/img/by_wire/fig2c.jpg b/blog/assets/img/by_wire/fig2c.jpg new file mode 100644 index 0000000..060f6c0 Binary files /dev/null and b/blog/assets/img/by_wire/fig2c.jpg differ diff --git a/blog/assets/img/by_wire/fig3.jpg b/blog/assets/img/by_wire/fig3.jpg new file mode 100644 index 0000000..f534dcd Binary files /dev/null and b/blog/assets/img/by_wire/fig3.jpg differ diff --git a/blog/assets/img/can-bus-protocol/img1.jpg b/blog/assets/img/can-bus-protocol/img1.jpg new file mode 100644 index 0000000..61820c9 Binary files /dev/null and b/blog/assets/img/can-bus-protocol/img1.jpg differ diff --git a/blog/assets/img/can-bus-protocol/img2.jpg b/blog/assets/img/can-bus-protocol/img2.jpg new file mode 100644 index 0000000..b035d8e Binary files /dev/null and b/blog/assets/img/can-bus-protocol/img2.jpg differ diff --git a/blog/assets/img/can-bus-protocol/img3.jpg b/blog/assets/img/can-bus-protocol/img3.jpg new file mode 100644 index 0000000..4ef3db8 Binary files /dev/null and b/blog/assets/img/can-bus-protocol/img3.jpg differ diff --git a/blog/assets/img/charge-your-phone/image1.jpeg b/blog/assets/img/charge-your-phone/image1.jpeg new file mode 100644 index 0000000..43b9737 Binary files /dev/null and b/blog/assets/img/charge-your-phone/image1.jpeg differ diff --git a/blog/assets/img/charge-your-phone/image2.jpeg b/blog/assets/img/charge-your-phone/image2.jpeg new file mode 100644 index 0000000..b06a8c4 Binary files /dev/null and b/blog/assets/img/charge-your-phone/image2.jpeg differ diff --git a/blog/assets/img/chatbots/1.png b/blog/assets/img/chatbots/1.png new file mode 100644 index 0000000..94b0961 Binary files /dev/null and b/blog/assets/img/chatbots/1.png differ diff --git a/blog/assets/img/cloud-computing/Cloud_Comp.png b/blog/assets/img/cloud-computing/Cloud_Comp.png new file mode 100644 index 0000000..8479fb8 Binary files /dev/null and b/blog/assets/img/cloud-computing/Cloud_Comp.png differ diff --git a/blog/assets/img/cloud-computing/Cloud_Computing.jpg b/blog/assets/img/cloud-computing/Cloud_Computing.jpg new file mode 100644 index 0000000..eedcc71 Binary files /dev/null and b/blog/assets/img/cloud-computing/Cloud_Computing.jpg differ diff --git a/blog/assets/img/cloud-gaming/g1.png b/blog/assets/img/cloud-gaming/g1.png new file mode 100644 index 0000000..7540d92 Binary files /dev/null and b/blog/assets/img/cloud-gaming/g1.png differ diff --git a/blog/assets/img/cloud-gaming/g2.png b/blog/assets/img/cloud-gaming/g2.png new file mode 100644 index 0000000..5fe7cbd Binary files /dev/null and b/blog/assets/img/cloud-gaming/g2.png differ diff --git a/blog/assets/img/cloud-gaming/g3.png b/blog/assets/img/cloud-gaming/g3.png new file mode 100644 index 0000000..601e9d0 Binary files /dev/null and b/blog/assets/img/cloud-gaming/g3.png differ diff --git a/blog/assets/img/cloud-gaming/n1.png b/blog/assets/img/cloud-gaming/n1.png new file mode 100644 index 0000000..fc86616 Binary files /dev/null and b/blog/assets/img/cloud-gaming/n1.png differ diff --git a/blog/assets/img/cloud-gaming/n2.png b/blog/assets/img/cloud-gaming/n2.png new file mode 100644 index 0000000..984c172 Binary files /dev/null and b/blog/assets/img/cloud-gaming/n2.png differ diff --git a/blog/assets/img/cloud-gaming/n3.png b/blog/assets/img/cloud-gaming/n3.png new file mode 100644 index 0000000..a67ad26 Binary files /dev/null and b/blog/assets/img/cloud-gaming/n3.png differ diff --git a/blog/assets/img/cloud-gaming/n4.png b/blog/assets/img/cloud-gaming/n4.png new file mode 100644 index 0000000..11c6bde Binary files /dev/null and b/blog/assets/img/cloud-gaming/n4.png differ diff --git a/blog/assets/img/cloud-gaming/now.jpg b/blog/assets/img/cloud-gaming/now.jpg new file mode 100644 index 0000000..6267de1 Binary files /dev/null and b/blog/assets/img/cloud-gaming/now.jpg differ diff --git a/blog/assets/img/cloud-gaming/stream.jpg b/blog/assets/img/cloud-gaming/stream.jpg new file mode 100644 index 0000000..8df4144 Binary files /dev/null and b/blog/assets/img/cloud-gaming/stream.jpg differ diff --git a/blog/assets/img/compliantMechanisms/pic 1.png b/blog/assets/img/compliantMechanisms/pic 1.png new file mode 100644 index 0000000..245c6dc Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 1.png differ diff --git a/blog/assets/img/compliantMechanisms/pic 2.png b/blog/assets/img/compliantMechanisms/pic 2.png new file mode 100644 index 0000000..54199ab Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 2.png differ diff --git a/blog/assets/img/compliantMechanisms/pic 3.jpeg b/blog/assets/img/compliantMechanisms/pic 3.jpeg new file mode 100644 index 0000000..eae7d53 Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 3.jpeg differ diff --git a/blog/assets/img/compliantMechanisms/pic 4.gif b/blog/assets/img/compliantMechanisms/pic 4.gif new file mode 100644 index 0000000..8916246 Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 4.gif differ diff --git a/blog/assets/img/compliantMechanisms/pic 5.jpg b/blog/assets/img/compliantMechanisms/pic 5.jpg new file mode 100644 index 0000000..9286ca5 Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 5.jpg differ diff --git a/blog/assets/img/compliantMechanisms/pic 6.png b/blog/assets/img/compliantMechanisms/pic 6.png new file mode 100644 index 0000000..90e9432 Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 6.png differ diff --git a/blog/assets/img/compliantMechanisms/pic 7.png b/blog/assets/img/compliantMechanisms/pic 7.png new file mode 100644 index 0000000..8395769 Binary files /dev/null and b/blog/assets/img/compliantMechanisms/pic 7.png differ diff --git a/blog/assets/img/convnets-what-why-how/img1.jpg b/blog/assets/img/convnets-what-why-how/img1.jpg new file mode 100644 index 0000000..5762be6 Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img1.jpg differ diff --git a/blog/assets/img/convnets-what-why-how/img10.png b/blog/assets/img/convnets-what-why-how/img10.png new file mode 100644 index 0000000..c8f454f Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img10.png differ diff --git a/blog/assets/img/convnets-what-why-how/img11.png b/blog/assets/img/convnets-what-why-how/img11.png new file mode 100644 index 0000000..eadb0b9 Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img11.png differ diff --git a/blog/assets/img/convnets-what-why-how/img2.jpg b/blog/assets/img/convnets-what-why-how/img2.jpg new file mode 100644 index 0000000..bf1f4c5 Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img2.jpg differ diff --git a/blog/assets/img/convnets-what-why-how/img3.png b/blog/assets/img/convnets-what-why-how/img3.png new file mode 100644 index 0000000..30f50a5 Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img3.png differ diff --git a/blog/assets/img/convnets-what-why-how/img4.png b/blog/assets/img/convnets-what-why-how/img4.png new file mode 100644 index 0000000..2eb4b90 Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img4.png differ diff --git a/blog/assets/img/convnets-what-why-how/img5.jpg b/blog/assets/img/convnets-what-why-how/img5.jpg new file mode 100644 index 0000000..d54bd1b Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img5.jpg differ diff --git a/blog/assets/img/convnets-what-why-how/img6.png b/blog/assets/img/convnets-what-why-how/img6.png new file mode 100644 index 0000000..18925fe Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img6.png differ diff --git a/blog/assets/img/convnets-what-why-how/img7.png b/blog/assets/img/convnets-what-why-how/img7.png new file mode 100644 index 0000000..ef592a5 Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img7.png differ diff --git a/blog/assets/img/convnets-what-why-how/img8.png b/blog/assets/img/convnets-what-why-how/img8.png new file mode 100644 index 0000000..09160ff Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img8.png differ diff --git a/blog/assets/img/convnets-what-why-how/img9.png b/blog/assets/img/convnets-what-why-how/img9.png new file mode 100644 index 0000000..39e6fcc Binary files /dev/null and b/blog/assets/img/convnets-what-why-how/img9.png differ diff --git a/blog/assets/img/coronary-stents/Fig1.jpg b/blog/assets/img/coronary-stents/Fig1.jpg new file mode 100644 index 0000000..c8b3891 Binary files /dev/null and b/blog/assets/img/coronary-stents/Fig1.jpg differ diff --git a/blog/assets/img/coronary-stents/Fig2.jpg b/blog/assets/img/coronary-stents/Fig2.jpg new file mode 100644 index 0000000..f085692 Binary files /dev/null and b/blog/assets/img/coronary-stents/Fig2.jpg differ diff --git a/blog/assets/img/coronary-stents/Fig3.jpg b/blog/assets/img/coronary-stents/Fig3.jpg new file mode 100644 index 0000000..669cd54 Binary files /dev/null and b/blog/assets/img/coronary-stents/Fig3.jpg differ diff --git a/blog/assets/img/coronary-stents/Fig4.jpg b/blog/assets/img/coronary-stents/Fig4.jpg new file mode 100644 index 0000000..b74f55b Binary files /dev/null and b/blog/assets/img/coronary-stents/Fig4.jpg differ diff --git a/blog/assets/img/cpu-vs-gpu/table1.png b/blog/assets/img/cpu-vs-gpu/table1.png new file mode 100644 index 0000000..9107d53 Binary files /dev/null and b/blog/assets/img/cpu-vs-gpu/table1.png differ diff --git a/blog/assets/img/cpu-vs-gpu/table2.png b/blog/assets/img/cpu-vs-gpu/table2.png new file mode 100644 index 0000000..a9483fa Binary files /dev/null and b/blog/assets/img/cpu-vs-gpu/table2.png differ diff --git a/blog/assets/img/cuba-and-candela/image001.jpg b/blog/assets/img/cuba-and-candela/image001.jpg new file mode 100644 index 0000000..8ed9bd1 Binary files /dev/null and b/blog/assets/img/cuba-and-candela/image001.jpg differ diff --git a/blog/assets/img/cuba-and-candela/image002.jpg b/blog/assets/img/cuba-and-candela/image002.jpg new file mode 100644 index 0000000..15d1ac8 Binary files /dev/null and b/blog/assets/img/cuba-and-candela/image002.jpg differ diff --git a/blog/assets/img/cuba-and-candela/image003.jpg b/blog/assets/img/cuba-and-candela/image003.jpg new file mode 100644 index 0000000..779532e Binary files /dev/null and b/blog/assets/img/cuba-and-candela/image003.jpg differ diff --git a/blog/assets/img/cuba-and-candela/image004.jpg b/blog/assets/img/cuba-and-candela/image004.jpg new file mode 100644 index 0000000..eda88b6 Binary files /dev/null and b/blog/assets/img/cuba-and-candela/image004.jpg differ diff --git a/blog/assets/img/cuba-and-candela/image005.jpg b/blog/assets/img/cuba-and-candela/image005.jpg new file mode 100644 index 0000000..27afa7b Binary files /dev/null and b/blog/assets/img/cuba-and-candela/image005.jpg differ diff --git a/blog/assets/img/cuba-and-candela/image006.jpg b/blog/assets/img/cuba-and-candela/image006.jpg new file mode 100644 index 0000000..1d945e7 Binary files /dev/null and b/blog/assets/img/cuba-and-candela/image006.jpg differ diff --git a/blog/assets/img/cubesats/image1.jpg b/blog/assets/img/cubesats/image1.jpg new file mode 100644 index 0000000..75ef4e6 Binary files /dev/null and b/blog/assets/img/cubesats/image1.jpg differ diff --git a/blog/assets/img/cubesats/image2.png b/blog/assets/img/cubesats/image2.png new file mode 100644 index 0000000..154a50e Binary files /dev/null and b/blog/assets/img/cubesats/image2.png differ diff --git a/blog/assets/img/cvt/1.jpg b/blog/assets/img/cvt/1.jpg new file mode 100644 index 0000000..4441297 Binary files /dev/null and b/blog/assets/img/cvt/1.jpg differ diff --git a/blog/assets/img/cvt/2.jpg b/blog/assets/img/cvt/2.jpg new file mode 100644 index 0000000..5a0b0e2 Binary files /dev/null and b/blog/assets/img/cvt/2.jpg differ diff --git a/blog/assets/img/cvt/3.jpg b/blog/assets/img/cvt/3.jpg new file mode 100644 index 0000000..f5fe098 Binary files /dev/null and b/blog/assets/img/cvt/3.jpg differ diff --git a/blog/assets/img/cycle/1.jpg b/blog/assets/img/cycle/1.jpg new file mode 100644 index 0000000..f1f3122 Binary files /dev/null and b/blog/assets/img/cycle/1.jpg differ diff --git a/blog/assets/img/cycle/2.jpg b/blog/assets/img/cycle/2.jpg new file mode 100644 index 0000000..9a3e020 Binary files /dev/null and b/blog/assets/img/cycle/2.jpg differ diff --git a/blog/assets/img/cycle/3.jpg b/blog/assets/img/cycle/3.jpg new file mode 100644 index 0000000..cd4dc0e Binary files /dev/null and b/blog/assets/img/cycle/3.jpg differ diff --git a/blog/assets/img/deconv/p1.png b/blog/assets/img/deconv/p1.png new file mode 100644 index 0000000..35debd0 Binary files /dev/null and b/blog/assets/img/deconv/p1.png differ diff --git a/blog/assets/img/deconv/p10.png b/blog/assets/img/deconv/p10.png new file mode 100644 index 0000000..9e5d926 Binary files /dev/null and b/blog/assets/img/deconv/p10.png differ diff --git a/blog/assets/img/deconv/p11.png b/blog/assets/img/deconv/p11.png new file mode 100644 index 0000000..93ccef6 Binary files /dev/null and b/blog/assets/img/deconv/p11.png differ diff --git a/blog/assets/img/deconv/p2.png b/blog/assets/img/deconv/p2.png new file mode 100644 index 0000000..626d041 Binary files /dev/null and b/blog/assets/img/deconv/p2.png differ diff --git a/blog/assets/img/deconv/p3.png b/blog/assets/img/deconv/p3.png new file mode 100644 index 0000000..a2c3c6d Binary files /dev/null and b/blog/assets/img/deconv/p3.png differ diff --git a/blog/assets/img/deconv/p4.png b/blog/assets/img/deconv/p4.png new file mode 100644 index 0000000..6243ab5 Binary files /dev/null and b/blog/assets/img/deconv/p4.png differ diff --git a/blog/assets/img/deconv/p5.png b/blog/assets/img/deconv/p5.png new file mode 100644 index 0000000..2da5dc8 Binary files /dev/null and b/blog/assets/img/deconv/p5.png differ diff --git a/blog/assets/img/deconv/p6.png b/blog/assets/img/deconv/p6.png new file mode 100644 index 0000000..91c9edd Binary files /dev/null and b/blog/assets/img/deconv/p6.png differ diff --git a/blog/assets/img/deconv/p7.png b/blog/assets/img/deconv/p7.png new file mode 100644 index 0000000..836911c Binary files /dev/null and b/blog/assets/img/deconv/p7.png differ diff --git a/blog/assets/img/deconv/p8.png b/blog/assets/img/deconv/p8.png new file mode 100644 index 0000000..f74cbaa Binary files /dev/null and b/blog/assets/img/deconv/p8.png differ diff --git a/blog/assets/img/deconv/p9.png b/blog/assets/img/deconv/p9.png new file mode 100644 index 0000000..557760f Binary files /dev/null and b/blog/assets/img/deconv/p9.png differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/Dsn2.gif b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/Dsn2.gif new file mode 100644 index 0000000..bf4036c Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/Dsn2.gif differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/autonav2.gif b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/autonav2.gif new file mode 100644 index 0000000..7e92f30 Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/autonav2.gif differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/ccd1.gif b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/ccd1.gif new file mode 100644 index 0000000..6defc90 Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/ccd1.gif differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/download.png b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/download.png new file mode 100644 index 0000000..e6762c3 Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/download.png differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/health-signals.gif b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/health-signals.gif new file mode 100644 index 0000000..978479d Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/health-signals.gif differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images.jpg b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images.jpg new file mode 100644 index 0000000..96cde9c Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images.jpg differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images.png b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images.png new file mode 100644 index 0000000..3da0cb0 Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images.png differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images1.jpg b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images1.jpg new file mode 100644 index 0000000..c11f257 Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images1.jpg differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images2.jpg b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images2.jpg new file mode 100644 index 0000000..8af82c5 Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/images2.jpg differ diff --git a/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/micas3s_tn.jpg b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/micas3s_tn.jpg new file mode 100644 index 0000000..9dd3baa Binary files /dev/null and b/blog/assets/img/ds1-a-demonstration-spacecraft-and-its-communication-aspects/micas3s_tn.jpg differ diff --git a/blog/assets/img/earthing-systems/image001.jpg b/blog/assets/img/earthing-systems/image001.jpg new file mode 100644 index 0000000..d2650be Binary files /dev/null and b/blog/assets/img/earthing-systems/image001.jpg differ diff --git a/blog/assets/img/earthing-systems/image002.jpg b/blog/assets/img/earthing-systems/image002.jpg new file mode 100644 index 0000000..6186892 Binary files /dev/null and b/blog/assets/img/earthing-systems/image002.jpg differ diff --git a/blog/assets/img/ecc/PublicPrivateKeyEncryption.png b/blog/assets/img/ecc/PublicPrivateKeyEncryption.png new file mode 100644 index 0000000..11172a4 Binary files /dev/null and b/blog/assets/img/ecc/PublicPrivateKeyEncryption.png differ diff --git a/blog/assets/img/ecc/ec.png b/blog/assets/img/ecc/ec.png new file mode 100644 index 0000000..68ca157 Binary files /dev/null and b/blog/assets/img/ecc/ec.png differ diff --git a/blog/assets/img/ecc/method.gif b/blog/assets/img/ecc/method.gif new file mode 100644 index 0000000..8b121e4 Binary files /dev/null and b/blog/assets/img/ecc/method.gif differ diff --git a/blog/assets/img/electronic-aspirin/image.jpg b/blog/assets/img/electronic-aspirin/image.jpg new file mode 100644 index 0000000..01fd102 Binary files /dev/null and b/blog/assets/img/electronic-aspirin/image.jpg differ diff --git a/blog/assets/img/electronic-skin/pic1.png b/blog/assets/img/electronic-skin/pic1.png new file mode 100644 index 0000000..af9341b Binary files /dev/null and b/blog/assets/img/electronic-skin/pic1.png differ diff --git a/blog/assets/img/electronic-skin/pic2.png b/blog/assets/img/electronic-skin/pic2.png new file mode 100644 index 0000000..27657da Binary files /dev/null and b/blog/assets/img/electronic-skin/pic2.png differ diff --git a/blog/assets/img/electronic-skin/pic3.png b/blog/assets/img/electronic-skin/pic3.png new file mode 100644 index 0000000..a0734e0 Binary files /dev/null and b/blog/assets/img/electronic-skin/pic3.png differ diff --git a/blog/assets/img/electronic-skin/pic4.png b/blog/assets/img/electronic-skin/pic4.png new file mode 100644 index 0000000..69fda0a Binary files /dev/null and b/blog/assets/img/electronic-skin/pic4.png differ diff --git a/blog/assets/img/electronic-skin/pic5.png b/blog/assets/img/electronic-skin/pic5.png new file mode 100644 index 0000000..20219e7 Binary files /dev/null and b/blog/assets/img/electronic-skin/pic5.png differ diff --git a/blog/assets/img/electronic-skin/pic6.png b/blog/assets/img/electronic-skin/pic6.png new file mode 100644 index 0000000..14ec1c8 Binary files /dev/null and b/blog/assets/img/electronic-skin/pic6.png differ diff --git a/blog/assets/img/electronic-skin/pic7.png b/blog/assets/img/electronic-skin/pic7.png new file mode 100644 index 0000000..092cfd3 Binary files /dev/null and b/blog/assets/img/electronic-skin/pic7.png differ diff --git a/blog/assets/img/electronic-skin/pic8.png b/blog/assets/img/electronic-skin/pic8.png new file mode 100644 index 0000000..a8792d6 Binary files /dev/null and b/blog/assets/img/electronic-skin/pic8.png differ diff --git a/blog/assets/img/finger-prints/1.jpg b/blog/assets/img/finger-prints/1.jpg new file mode 100644 index 0000000..78285ef Binary files /dev/null and b/blog/assets/img/finger-prints/1.jpg differ diff --git a/blog/assets/img/finger-prints/2.jpg b/blog/assets/img/finger-prints/2.jpg new file mode 100644 index 0000000..6998d66 Binary files /dev/null and b/blog/assets/img/finger-prints/2.jpg differ diff --git a/blog/assets/img/first-20-hours/image1.jpg b/blog/assets/img/first-20-hours/image1.jpg new file mode 100644 index 0000000..18f5ad2 Binary files /dev/null and b/blog/assets/img/first-20-hours/image1.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/1.jpg b/blog/assets/img/fluid-mech-everyday-life/1.jpg new file mode 100644 index 0000000..e44f59a Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/1.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/2.jpg b/blog/assets/img/fluid-mech-everyday-life/2.jpg new file mode 100644 index 0000000..b0330c4 Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/2.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/3.jpg b/blog/assets/img/fluid-mech-everyday-life/3.jpg new file mode 100644 index 0000000..2b36104 Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/3.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/4.jpg b/blog/assets/img/fluid-mech-everyday-life/4.jpg new file mode 100644 index 0000000..004d528 Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/4.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/5.jpg b/blog/assets/img/fluid-mech-everyday-life/5.jpg new file mode 100644 index 0000000..3e52cbc Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/5.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/6.jpg b/blog/assets/img/fluid-mech-everyday-life/6.jpg new file mode 100644 index 0000000..69456c0 Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/6.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/7.jpg b/blog/assets/img/fluid-mech-everyday-life/7.jpg new file mode 100644 index 0000000..b028035 Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/7.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/8.jpg b/blog/assets/img/fluid-mech-everyday-life/8.jpg new file mode 100644 index 0000000..a999d4f Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/8.jpg differ diff --git a/blog/assets/img/fluid-mech-everyday-life/9.jpg b/blog/assets/img/fluid-mech-everyday-life/9.jpg new file mode 100644 index 0000000..b38e2f9 Binary files /dev/null and b/blog/assets/img/fluid-mech-everyday-life/9.jpg differ diff --git a/blog/assets/img/fluid-mechanics-from-living-to-machines/image1.png b/blog/assets/img/fluid-mechanics-from-living-to-machines/image1.png new file mode 100644 index 0000000..2c6864a Binary files /dev/null and b/blog/assets/img/fluid-mechanics-from-living-to-machines/image1.png differ diff --git a/blog/assets/img/fluid-mechanics-from-living-to-machines/image2.png b/blog/assets/img/fluid-mechanics-from-living-to-machines/image2.png new file mode 100644 index 0000000..c0f6b63 Binary files /dev/null and b/blog/assets/img/fluid-mechanics-from-living-to-machines/image2.png differ diff --git a/blog/assets/img/fluids-and-satellites/1.gif b/blog/assets/img/fluids-and-satellites/1.gif new file mode 100644 index 0000000..9969fc4 Binary files /dev/null and b/blog/assets/img/fluids-and-satellites/1.gif differ diff --git a/blog/assets/img/fluids-and-satellites/2.gif b/blog/assets/img/fluids-and-satellites/2.gif new file mode 100644 index 0000000..bffd122 Binary files /dev/null and b/blog/assets/img/fluids-and-satellites/2.gif differ diff --git a/blog/assets/img/fluids-and-satellites/3.gif b/blog/assets/img/fluids-and-satellites/3.gif new file mode 100644 index 0000000..4aca05e Binary files /dev/null and b/blog/assets/img/fluids-and-satellites/3.gif differ diff --git a/blog/assets/img/forward-swept-wings/AirFlowComparison.jpeg b/blog/assets/img/forward-swept-wings/AirFlowComparison.jpeg new file mode 100644 index 0000000..02ab3aa Binary files /dev/null and b/blog/assets/img/forward-swept-wings/AirFlowComparison.jpeg differ diff --git a/blog/assets/img/forward-swept-wings/PitchingDown.jpeg b/blog/assets/img/forward-swept-wings/PitchingDown.jpeg new file mode 100644 index 0000000..2450842 Binary files /dev/null and b/blog/assets/img/forward-swept-wings/PitchingDown.jpeg differ diff --git a/blog/assets/img/forward-swept-wings/x29.jpeg b/blog/assets/img/forward-swept-wings/x29.jpeg new file mode 100644 index 0000000..73e94fc Binary files /dev/null and b/blog/assets/img/forward-swept-wings/x29.jpeg differ diff --git a/blog/assets/img/from-1g-to-5g/Cells.png b/blog/assets/img/from-1g-to-5g/Cells.png new file mode 100644 index 0000000..b6b58ea Binary files /dev/null and b/blog/assets/img/from-1g-to-5g/Cells.png differ diff --git a/blog/assets/img/from-1g-to-5g/Cellular-Network.jpg b/blog/assets/img/from-1g-to-5g/Cellular-Network.jpg new file mode 100644 index 0000000..83d8575 Binary files /dev/null and b/blog/assets/img/from-1g-to-5g/Cellular-Network.jpg differ diff --git a/blog/assets/img/from-1g-to-5g/Motorola Dyna TAC1-G phone.png b/blog/assets/img/from-1g-to-5g/Motorola Dyna TAC1-G phone.png new file mode 100644 index 0000000..33cb130 Binary files /dev/null and b/blog/assets/img/from-1g-to-5g/Motorola Dyna TAC1-G phone.png differ diff --git a/blog/assets/img/from-1g-to-5g/Nokia3210(2-G phone).png b/blog/assets/img/from-1g-to-5g/Nokia3210(2-G phone).png new file mode 100644 index 0000000..4d08fac Binary files /dev/null and b/blog/assets/img/from-1g-to-5g/Nokia3210(2-G phone).png differ diff --git a/blog/assets/img/from-1g-to-5g/image-1_sized_50.jpg b/blog/assets/img/from-1g-to-5g/image-1_sized_50.jpg new file mode 100644 index 0000000..b3e1f07 Binary files /dev/null and b/blog/assets/img/from-1g-to-5g/image-1_sized_50.jpg differ diff --git a/blog/assets/img/from-1g-to-5g/qc_onq_lowlatency_gif_final.gif b/blog/assets/img/from-1g-to-5g/qc_onq_lowlatency_gif_final.gif new file mode 100644 index 0000000..cf176f0 Binary files /dev/null and b/blog/assets/img/from-1g-to-5g/qc_onq_lowlatency_gif_final.gif differ diff --git a/blog/assets/img/future-of-power-generation/image1.png b/blog/assets/img/future-of-power-generation/image1.png new file mode 100644 index 0000000..211d66a Binary files /dev/null and b/blog/assets/img/future-of-power-generation/image1.png differ diff --git a/blog/assets/img/future-of-power-generation/image2.png b/blog/assets/img/future-of-power-generation/image2.png new file mode 100644 index 0000000..010dd63 Binary files /dev/null and b/blog/assets/img/future-of-power-generation/image2.png differ diff --git a/blog/assets/img/future-of-power-generation/image3.png b/blog/assets/img/future-of-power-generation/image3.png new file mode 100644 index 0000000..8295b5d Binary files /dev/null and b/blog/assets/img/future-of-power-generation/image3.png differ diff --git a/blog/assets/img/future-of-power-generation/image4.png b/blog/assets/img/future-of-power-generation/image4.png new file mode 100644 index 0000000..0cfdc2e Binary files /dev/null and b/blog/assets/img/future-of-power-generation/image4.png differ diff --git a/blog/assets/img/gesture_controlled_robot/1.jpeg b/blog/assets/img/gesture_controlled_robot/1.jpeg new file mode 100644 index 0000000..4652845 Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/1.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/2.jpeg b/blog/assets/img/gesture_controlled_robot/2.jpeg new file mode 100644 index 0000000..8d258e3 Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/2.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/3.jpeg b/blog/assets/img/gesture_controlled_robot/3.jpeg new file mode 100644 index 0000000..1bf1cac Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/3.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/4.jpeg b/blog/assets/img/gesture_controlled_robot/4.jpeg new file mode 100644 index 0000000..a524318 Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/4.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/5.jpeg b/blog/assets/img/gesture_controlled_robot/5.jpeg new file mode 100644 index 0000000..e07271d Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/5.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/6.jpeg b/blog/assets/img/gesture_controlled_robot/6.jpeg new file mode 100644 index 0000000..e4e3b39 Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/6.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/7.jpeg b/blog/assets/img/gesture_controlled_robot/7.jpeg new file mode 100644 index 0000000..f2c1396 Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/7.jpeg differ diff --git a/blog/assets/img/gesture_controlled_robot/8.jpeg b/blog/assets/img/gesture_controlled_robot/8.jpeg new file mode 100644 index 0000000..9282973 Binary files /dev/null and b/blog/assets/img/gesture_controlled_robot/8.jpeg differ diff --git a/blog/assets/img/getting-started-with-gui/gimp.jpg b/blog/assets/img/getting-started-with-gui/gimp.jpg new file mode 100644 index 0000000..7eaaafc Binary files /dev/null and b/blog/assets/img/getting-started-with-gui/gimp.jpg differ diff --git a/blog/assets/img/getting-started-with-gui/guivscli.jpg b/blog/assets/img/getting-started-with-gui/guivscli.jpg new file mode 100644 index 0000000..b4c65c3 Binary files /dev/null and b/blog/assets/img/getting-started-with-gui/guivscli.jpg differ diff --git a/blog/assets/img/google_image_search/google_image_search.png b/blog/assets/img/google_image_search/google_image_search.png new file mode 100644 index 0000000..f4b9c1e Binary files /dev/null and b/blog/assets/img/google_image_search/google_image_search.png differ diff --git a/blog/assets/img/google_image_search/resized_row.jpg b/blog/assets/img/google_image_search/resized_row.jpg new file mode 100644 index 0000000..fbaea26 Binary files /dev/null and b/blog/assets/img/google_image_search/resized_row.jpg differ diff --git a/blog/assets/img/google_image_search/row.jpg b/blog/assets/img/google_image_search/row.jpg new file mode 100644 index 0000000..ad84865 Binary files /dev/null and b/blog/assets/img/google_image_search/row.jpg differ diff --git a/blog/assets/img/gramophone-gaana/1.png b/blog/assets/img/gramophone-gaana/1.png new file mode 100644 index 0000000..c75724f Binary files /dev/null and b/blog/assets/img/gramophone-gaana/1.png differ diff --git a/blog/assets/img/gramophone-gaana/2.png b/blog/assets/img/gramophone-gaana/2.png new file mode 100644 index 0000000..8b84df7 Binary files /dev/null and b/blog/assets/img/gramophone-gaana/2.png differ diff --git a/blog/assets/img/gramophone-gaana/3.png b/blog/assets/img/gramophone-gaana/3.png new file mode 100644 index 0000000..20c1019 Binary files /dev/null and b/blog/assets/img/gramophone-gaana/3.png differ diff --git a/blog/assets/img/graphene/1.jpg b/blog/assets/img/graphene/1.jpg new file mode 100644 index 0000000..8342c74 Binary files /dev/null and b/blog/assets/img/graphene/1.jpg differ diff --git a/blog/assets/img/graphene/2.jpg b/blog/assets/img/graphene/2.jpg new file mode 100644 index 0000000..4e758a6 Binary files /dev/null and b/blog/assets/img/graphene/2.jpg differ diff --git a/blog/assets/img/graphene/3.jpg b/blog/assets/img/graphene/3.jpg new file mode 100644 index 0000000..aa74bc7 Binary files /dev/null and b/blog/assets/img/graphene/3.jpg differ diff --git a/blog/assets/img/graphene/4.jpg b/blog/assets/img/graphene/4.jpg new file mode 100644 index 0000000..0385b88 Binary files /dev/null and b/blog/assets/img/graphene/4.jpg differ diff --git a/blog/assets/img/holographic-memory/image1.png b/blog/assets/img/holographic-memory/image1.png new file mode 100644 index 0000000..aa8d546 Binary files /dev/null and b/blog/assets/img/holographic-memory/image1.png differ diff --git a/blog/assets/img/holographic-memory/image2.png b/blog/assets/img/holographic-memory/image2.png new file mode 100644 index 0000000..8ff7a5b Binary files /dev/null and b/blog/assets/img/holographic-memory/image2.png differ diff --git a/blog/assets/img/holographic-memory/image3.png b/blog/assets/img/holographic-memory/image3.png new file mode 100644 index 0000000..b554656 Binary files /dev/null and b/blog/assets/img/holographic-memory/image3.png differ diff --git a/blog/assets/img/how-to-get-started-with-bots/rpi.jpg b/blog/assets/img/how-to-get-started-with-bots/rpi.jpg new file mode 100644 index 0000000..650e3d3 Binary files /dev/null and b/blog/assets/img/how-to-get-started-with-bots/rpi.jpg differ diff --git a/blog/assets/img/hyperloop/1.jpg b/blog/assets/img/hyperloop/1.jpg new file mode 100644 index 0000000..b1675b9 Binary files /dev/null and b/blog/assets/img/hyperloop/1.jpg differ diff --git a/blog/assets/img/hyperloop/2.jpg b/blog/assets/img/hyperloop/2.jpg new file mode 100644 index 0000000..367fb1e Binary files /dev/null and b/blog/assets/img/hyperloop/2.jpg differ diff --git a/blog/assets/img/hyperloop/3.jpg b/blog/assets/img/hyperloop/3.jpg new file mode 100644 index 0000000..234cfb8 Binary files /dev/null and b/blog/assets/img/hyperloop/3.jpg differ diff --git a/blog/assets/img/hyperloop/4.jpg b/blog/assets/img/hyperloop/4.jpg new file mode 100644 index 0000000..4267dc5 Binary files /dev/null and b/blog/assets/img/hyperloop/4.jpg differ diff --git a/blog/assets/img/hyperloop/5.jpg b/blog/assets/img/hyperloop/5.jpg new file mode 100644 index 0000000..4c3eb33 Binary files /dev/null and b/blog/assets/img/hyperloop/5.jpg differ diff --git a/blog/assets/img/hyperloop/6.jpg b/blog/assets/img/hyperloop/6.jpg new file mode 100644 index 0000000..9203907 Binary files /dev/null and b/blog/assets/img/hyperloop/6.jpg differ diff --git a/blog/assets/img/i2c/I2C1.jpg b/blog/assets/img/i2c/I2C1.jpg new file mode 100644 index 0000000..fbfd68f Binary files /dev/null and b/blog/assets/img/i2c/I2C1.jpg differ diff --git a/blog/assets/img/i2c/I2C2.jpg b/blog/assets/img/i2c/I2C2.jpg new file mode 100644 index 0000000..a99b889 Binary files /dev/null and b/blog/assets/img/i2c/I2C2.jpg differ diff --git a/blog/assets/img/i2c/I2C3.png b/blog/assets/img/i2c/I2C3.png new file mode 100644 index 0000000..7ca2c35 Binary files /dev/null and b/blog/assets/img/i2c/I2C3.png differ diff --git a/blog/assets/img/i2c/me.jpeg b/blog/assets/img/i2c/me.jpeg new file mode 100644 index 0000000..093434c Binary files /dev/null and b/blog/assets/img/i2c/me.jpeg differ diff --git a/blog/assets/img/icons/android-icon-144x144.png b/blog/assets/img/icons/android-icon-144x144.png new file mode 100644 index 0000000..457f115 Binary files /dev/null and b/blog/assets/img/icons/android-icon-144x144.png differ diff --git a/blog/assets/img/icons/android-icon-192x192.png b/blog/assets/img/icons/android-icon-192x192.png new file mode 100644 index 0000000..a4f696b Binary files /dev/null and b/blog/assets/img/icons/android-icon-192x192.png differ diff --git a/blog/assets/img/icons/android-icon-36x36.png b/blog/assets/img/icons/android-icon-36x36.png new file mode 100644 index 0000000..b6e2d5e Binary files /dev/null and b/blog/assets/img/icons/android-icon-36x36.png differ diff --git a/blog/assets/img/icons/android-icon-48x48.png b/blog/assets/img/icons/android-icon-48x48.png new file mode 100644 index 0000000..bb4b9ce Binary files /dev/null and b/blog/assets/img/icons/android-icon-48x48.png differ diff --git a/blog/assets/img/icons/android-icon-72x72.png b/blog/assets/img/icons/android-icon-72x72.png new file mode 100644 index 0000000..c05a4f6 Binary files /dev/null and b/blog/assets/img/icons/android-icon-72x72.png differ diff --git a/blog/assets/img/icons/android-icon-96x96.png b/blog/assets/img/icons/android-icon-96x96.png new file mode 100644 index 0000000..d2ce1ce Binary files /dev/null and b/blog/assets/img/icons/android-icon-96x96.png differ diff --git a/blog/assets/img/icons/apple-icon-114x114.png b/blog/assets/img/icons/apple-icon-114x114.png new file mode 100644 index 0000000..994e2fc Binary files /dev/null and b/blog/assets/img/icons/apple-icon-114x114.png differ diff --git a/blog/assets/img/icons/apple-icon-120x120.png b/blog/assets/img/icons/apple-icon-120x120.png new file mode 100644 index 0000000..11955a2 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-120x120.png differ diff --git a/blog/assets/img/icons/apple-icon-144x144.png b/blog/assets/img/icons/apple-icon-144x144.png new file mode 100644 index 0000000..457f115 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-144x144.png differ diff --git a/blog/assets/img/icons/apple-icon-152x152.png b/blog/assets/img/icons/apple-icon-152x152.png new file mode 100644 index 0000000..e9abf32 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-152x152.png differ diff --git a/blog/assets/img/icons/apple-icon-180x180.png b/blog/assets/img/icons/apple-icon-180x180.png new file mode 100644 index 0000000..c9ff9f2 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-180x180.png differ diff --git a/blog/assets/img/icons/apple-icon-57x57.png b/blog/assets/img/icons/apple-icon-57x57.png new file mode 100644 index 0000000..a086c09 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-57x57.png differ diff --git a/blog/assets/img/icons/apple-icon-60x60.png b/blog/assets/img/icons/apple-icon-60x60.png new file mode 100644 index 0000000..21620fb Binary files /dev/null and b/blog/assets/img/icons/apple-icon-60x60.png differ diff --git a/blog/assets/img/icons/apple-icon-72x72.png b/blog/assets/img/icons/apple-icon-72x72.png new file mode 100644 index 0000000..c05a4f6 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-72x72.png differ diff --git a/blog/assets/img/icons/apple-icon-76x76.png b/blog/assets/img/icons/apple-icon-76x76.png new file mode 100644 index 0000000..d3cd858 Binary files /dev/null and b/blog/assets/img/icons/apple-icon-76x76.png differ diff --git a/blog/assets/img/icons/apple-icon-precomposed.png b/blog/assets/img/icons/apple-icon-precomposed.png new file mode 100644 index 0000000..e060f6f Binary files /dev/null and b/blog/assets/img/icons/apple-icon-precomposed.png differ diff --git a/blog/assets/img/icons/apple-icon.png b/blog/assets/img/icons/apple-icon.png new file mode 100644 index 0000000..e060f6f Binary files /dev/null and b/blog/assets/img/icons/apple-icon.png differ diff --git a/blog/assets/img/icons/browserconfig.xml b/blog/assets/img/icons/browserconfig.xml new file mode 100644 index 0000000..c554148 --- /dev/null +++ b/blog/assets/img/icons/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/blog/assets/img/icons/favicon-16x16.png b/blog/assets/img/icons/favicon-16x16.png new file mode 100644 index 0000000..8f3a7d6 Binary files /dev/null and b/blog/assets/img/icons/favicon-16x16.png differ diff --git a/blog/assets/img/icons/favicon-32x32.png b/blog/assets/img/icons/favicon-32x32.png new file mode 100644 index 0000000..3472f2a Binary files /dev/null and b/blog/assets/img/icons/favicon-32x32.png differ diff --git a/blog/assets/img/icons/favicon-96x96.png b/blog/assets/img/icons/favicon-96x96.png new file mode 100644 index 0000000..d2ce1ce Binary files /dev/null and b/blog/assets/img/icons/favicon-96x96.png differ diff --git a/blog/assets/img/icons/favicon.ico b/blog/assets/img/icons/favicon.ico new file mode 100644 index 0000000..1743a79 Binary files /dev/null and b/blog/assets/img/icons/favicon.ico differ diff --git a/blog/assets/img/icons/ieee_logo.png b/blog/assets/img/icons/ieee_logo.png new file mode 100644 index 0000000..5aa2b80 Binary files /dev/null and b/blog/assets/img/icons/ieee_logo.png differ diff --git a/blog/assets/img/icons/manifest.json b/blog/assets/img/icons/manifest.json new file mode 100644 index 0000000..013d4a6 --- /dev/null +++ b/blog/assets/img/icons/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/blog/assets/img/icons/ms-icon-144x144.png b/blog/assets/img/icons/ms-icon-144x144.png new file mode 100644 index 0000000..457f115 Binary files /dev/null and b/blog/assets/img/icons/ms-icon-144x144.png differ diff --git a/blog/assets/img/icons/ms-icon-150x150.png b/blog/assets/img/icons/ms-icon-150x150.png new file mode 100644 index 0000000..473de98 Binary files /dev/null and b/blog/assets/img/icons/ms-icon-150x150.png differ diff --git a/blog/assets/img/icons/ms-icon-310x310.png b/blog/assets/img/icons/ms-icon-310x310.png new file mode 100644 index 0000000..2f9a09e Binary files /dev/null and b/blog/assets/img/icons/ms-icon-310x310.png differ diff --git a/blog/assets/img/icons/ms-icon-70x70.png b/blog/assets/img/icons/ms-icon-70x70.png new file mode 100644 index 0000000..0999135 Binary files /dev/null and b/blog/assets/img/icons/ms-icon-70x70.png differ diff --git a/blog/assets/img/ieee_nitk.png b/blog/assets/img/ieee_nitk.png new file mode 100644 index 0000000..4705201 Binary files /dev/null and b/blog/assets/img/ieee_nitk.png differ diff --git a/blog/assets/img/ieee_nitk_white.png b/blog/assets/img/ieee_nitk_white.png new file mode 100644 index 0000000..28885e2 Binary files /dev/null and b/blog/assets/img/ieee_nitk_white.png differ diff --git a/blog/assets/img/ieee_white.png b/blog/assets/img/ieee_white.png new file mode 100644 index 0000000..336b0d6 Binary files /dev/null and b/blog/assets/img/ieee_white.png differ diff --git a/blog/assets/img/image-steganography/channel.png b/blog/assets/img/image-steganography/channel.png new file mode 100644 index 0000000..1f89e3b Binary files /dev/null and b/blog/assets/img/image-steganography/channel.png differ diff --git a/blog/assets/img/image-steganography/code1.png b/blog/assets/img/image-steganography/code1.png new file mode 100644 index 0000000..2a458a1 Binary files /dev/null and b/blog/assets/img/image-steganography/code1.png differ diff --git a/blog/assets/img/image-steganography/code2.png b/blog/assets/img/image-steganography/code2.png new file mode 100644 index 0000000..36e6823 Binary files /dev/null and b/blog/assets/img/image-steganography/code2.png differ diff --git a/blog/assets/img/image-steganography/encoded1.jpg b/blog/assets/img/image-steganography/encoded1.jpg new file mode 100644 index 0000000..8e3dfc7 Binary files /dev/null and b/blog/assets/img/image-steganography/encoded1.jpg differ diff --git a/blog/assets/img/image-steganography/encoded2.jpg b/blog/assets/img/image-steganography/encoded2.jpg new file mode 100644 index 0000000..8e3dfc7 Binary files /dev/null and b/blog/assets/img/image-steganography/encoded2.jpg differ diff --git a/blog/assets/img/image-steganography/host1.jpg b/blog/assets/img/image-steganography/host1.jpg new file mode 100644 index 0000000..8e3dfc7 Binary files /dev/null and b/blog/assets/img/image-steganography/host1.jpg differ diff --git a/blog/assets/img/image-steganography/host2.jpg b/blog/assets/img/image-steganography/host2.jpg new file mode 100644 index 0000000..8e3dfc7 Binary files /dev/null and b/blog/assets/img/image-steganography/host2.jpg differ diff --git a/blog/assets/img/image-steganography/lena.jpg b/blog/assets/img/image-steganography/lena.jpg new file mode 100644 index 0000000..87c1e60 Binary files /dev/null and b/blog/assets/img/image-steganography/lena.jpg differ diff --git a/blog/assets/img/image-steganography/lsb2.png b/blog/assets/img/image-steganography/lsb2.png new file mode 100644 index 0000000..969d0e3 Binary files /dev/null and b/blog/assets/img/image-steganography/lsb2.png differ diff --git a/blog/assets/img/impact-of-f1/image1.jpg b/blog/assets/img/impact-of-f1/image1.jpg new file mode 100644 index 0000000..db80953 Binary files /dev/null and b/blog/assets/img/impact-of-f1/image1.jpg differ diff --git a/blog/assets/img/impact-of-f1/image2.jpg b/blog/assets/img/impact-of-f1/image2.jpg new file mode 100644 index 0000000..fe17264 Binary files /dev/null and b/blog/assets/img/impact-of-f1/image2.jpg differ diff --git a/blog/assets/img/impact-of-f1/image3.jpg b/blog/assets/img/impact-of-f1/image3.jpg new file mode 100644 index 0000000..4a8cefd Binary files /dev/null and b/blog/assets/img/impact-of-f1/image3.jpg differ diff --git a/blog/assets/img/impact-of-f1/image4.jpg b/blog/assets/img/impact-of-f1/image4.jpg new file mode 100644 index 0000000..57c2194 Binary files /dev/null and b/blog/assets/img/impact-of-f1/image4.jpg differ diff --git a/blog/assets/img/impact-of-f1/image5.jpg b/blog/assets/img/impact-of-f1/image5.jpg new file mode 100644 index 0000000..0eb294d Binary files /dev/null and b/blog/assets/img/impact-of-f1/image5.jpg differ diff --git a/blog/assets/img/inkd/image1.png b/blog/assets/img/inkd/image1.png new file mode 100644 index 0000000..324afbd Binary files /dev/null and b/blog/assets/img/inkd/image1.png differ diff --git a/blog/assets/img/inkd/image2.png b/blog/assets/img/inkd/image2.png new file mode 100644 index 0000000..360c6c0 Binary files /dev/null and b/blog/assets/img/inkd/image2.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/1.png b/blog/assets/img/innovations-in-drone-industry/1.png new file mode 100644 index 0000000..c5bdff8 Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/1.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/2.png b/blog/assets/img/innovations-in-drone-industry/2.png new file mode 100644 index 0000000..968d43a Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/2.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/3.png b/blog/assets/img/innovations-in-drone-industry/3.png new file mode 100644 index 0000000..d016f32 Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/3.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/4.png b/blog/assets/img/innovations-in-drone-industry/4.png new file mode 100644 index 0000000..015ea82 Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/4.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/5.png b/blog/assets/img/innovations-in-drone-industry/5.png new file mode 100644 index 0000000..2ac29e1 Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/5.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/6.png b/blog/assets/img/innovations-in-drone-industry/6.png new file mode 100644 index 0000000..c4f157b Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/6.png differ diff --git a/blog/assets/img/innovations-in-drone-industry/7.png b/blog/assets/img/innovations-in-drone-industry/7.png new file mode 100644 index 0000000..114c7fe Binary files /dev/null and b/blog/assets/img/innovations-in-drone-industry/7.png differ diff --git a/blog/assets/img/installing_ubuntu/create_home.jpg b/blog/assets/img/installing_ubuntu/create_home.jpg new file mode 100644 index 0000000..e3a9e2d Binary files /dev/null and b/blog/assets/img/installing_ubuntu/create_home.jpg differ diff --git a/blog/assets/img/installing_ubuntu/create_partition.jpg b/blog/assets/img/installing_ubuntu/create_partition.jpg new file mode 100644 index 0000000..ddde82d Binary files /dev/null and b/blog/assets/img/installing_ubuntu/create_partition.jpg differ diff --git a/blog/assets/img/installing_ubuntu/create_root.jpg b/blog/assets/img/installing_ubuntu/create_root.jpg new file mode 100644 index 0000000..b0f167d Binary files /dev/null and b/blog/assets/img/installing_ubuntu/create_root.jpg differ diff --git a/blog/assets/img/installing_ubuntu/create_swap.jpg b/blog/assets/img/installing_ubuntu/create_swap.jpg new file mode 100644 index 0000000..f81ff4c Binary files /dev/null and b/blog/assets/img/installing_ubuntu/create_swap.jpg differ diff --git a/blog/assets/img/installing_ubuntu/delete_partition.jpg b/blog/assets/img/installing_ubuntu/delete_partition.jpg new file mode 100644 index 0000000..b2ba54a Binary files /dev/null and b/blog/assets/img/installing_ubuntu/delete_partition.jpg differ diff --git a/blog/assets/img/installing_ubuntu/first_few.jpg b/blog/assets/img/installing_ubuntu/first_few.jpg new file mode 100644 index 0000000..9bf1ef0 Binary files /dev/null and b/blog/assets/img/installing_ubuntu/first_few.jpg differ diff --git a/blog/assets/img/installing_ubuntu/install_ubuntu.jpg b/blog/assets/img/installing_ubuntu/install_ubuntu.jpg new file mode 100644 index 0000000..f52645e Binary files /dev/null and b/blog/assets/img/installing_ubuntu/install_ubuntu.jpg differ diff --git a/blog/assets/img/installing_ubuntu/installlation_type.jpg b/blog/assets/img/installing_ubuntu/installlation_type.jpg new file mode 100644 index 0000000..7088c14 Binary files /dev/null and b/blog/assets/img/installing_ubuntu/installlation_type.jpg differ diff --git a/blog/assets/img/installing_ubuntu/something_else.jpg b/blog/assets/img/installing_ubuntu/something_else.jpg new file mode 100644 index 0000000..7088c14 Binary files /dev/null and b/blog/assets/img/installing_ubuntu/something_else.jpg differ diff --git a/blog/assets/img/installing_ubuntu/ubuntu.png b/blog/assets/img/installing_ubuntu/ubuntu.png new file mode 100644 index 0000000..6531a1e Binary files /dev/null and b/blog/assets/img/installing_ubuntu/ubuntu.png differ diff --git a/blog/assets/img/intro-to-pytorch/graph.png b/blog/assets/img/intro-to-pytorch/graph.png new file mode 100644 index 0000000..50d1d86 Binary files /dev/null and b/blog/assets/img/intro-to-pytorch/graph.png differ diff --git a/blog/assets/img/intro-to-pytorch/s1.png b/blog/assets/img/intro-to-pytorch/s1.png new file mode 100644 index 0000000..6ac2880 Binary files /dev/null and b/blog/assets/img/intro-to-pytorch/s1.png differ diff --git a/blog/assets/img/intro-to-pytorch/s2.png b/blog/assets/img/intro-to-pytorch/s2.png new file mode 100644 index 0000000..d31e178 Binary files /dev/null and b/blog/assets/img/intro-to-pytorch/s2.png differ diff --git a/blog/assets/img/intro-to-pytorch/s3.png b/blog/assets/img/intro-to-pytorch/s3.png new file mode 100644 index 0000000..d184173 Binary files /dev/null and b/blog/assets/img/intro-to-pytorch/s3.png differ diff --git a/blog/assets/img/introduction-to-ieee/IEEE_2017.JPG b/blog/assets/img/introduction-to-ieee/IEEE_2017.JPG new file mode 100644 index 0000000..d9ab1f4 Binary files /dev/null and b/blog/assets/img/introduction-to-ieee/IEEE_2017.JPG differ diff --git a/blog/assets/img/introduction-to-iot/iot.png b/blog/assets/img/introduction-to-iot/iot.png new file mode 100644 index 0000000..b8e2005 Binary files /dev/null and b/blog/assets/img/introduction-to-iot/iot.png differ diff --git a/blog/assets/img/introduction-to-reverse-engineering/1.png b/blog/assets/img/introduction-to-reverse-engineering/1.png new file mode 100644 index 0000000..2840f77 Binary files /dev/null and b/blog/assets/img/introduction-to-reverse-engineering/1.png differ diff --git a/blog/assets/img/introduction-to-reverse-engineering/3.png b/blog/assets/img/introduction-to-reverse-engineering/3.png new file mode 100644 index 0000000..1d29962 Binary files /dev/null and b/blog/assets/img/introduction-to-reverse-engineering/3.png differ diff --git a/blog/assets/img/introduction-to-reverse-engineering/4.png b/blog/assets/img/introduction-to-reverse-engineering/4.png new file mode 100644 index 0000000..0d09dcd Binary files /dev/null and b/blog/assets/img/introduction-to-reverse-engineering/4.png differ diff --git a/blog/assets/img/introduction-to-reverse-engineering/5.png b/blog/assets/img/introduction-to-reverse-engineering/5.png new file mode 100644 index 0000000..748d91f Binary files /dev/null and b/blog/assets/img/introduction-to-reverse-engineering/5.png differ diff --git a/blog/assets/img/introduction-to-reverse-engineering/6.jpg b/blog/assets/img/introduction-to-reverse-engineering/6.jpg new file mode 100644 index 0000000..937adf0 Binary files /dev/null and b/blog/assets/img/introduction-to-reverse-engineering/6.jpg differ diff --git a/blog/assets/img/introduction_to_gpu_computing/3d_2d.png b/blog/assets/img/introduction_to_gpu_computing/3d_2d.png new file mode 100644 index 0000000..1d227db Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/3d_2d.png differ diff --git a/blog/assets/img/introduction_to_gpu_computing/cpu_vs_gpu.png b/blog/assets/img/introduction_to_gpu_computing/cpu_vs_gpu.png new file mode 100644 index 0000000..4f4461d Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/cpu_vs_gpu.png differ diff --git a/blog/assets/img/introduction_to_gpu_computing/gpu.jpg b/blog/assets/img/introduction_to_gpu_computing/gpu.jpg new file mode 100644 index 0000000..75ba87d Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/gpu.jpg differ diff --git a/blog/assets/img/introduction_to_gpu_computing/gpu_accel.png b/blog/assets/img/introduction_to_gpu_computing/gpu_accel.png new file mode 100644 index 0000000..fe52c40 Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/gpu_accel.png differ diff --git a/blog/assets/img/introduction_to_gpu_computing/intro.png b/blog/assets/img/introduction_to_gpu_computing/intro.png new file mode 100644 index 0000000..a7e182c Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/intro.png differ diff --git a/blog/assets/img/introduction_to_gpu_computing/nfs.jpg b/blog/assets/img/introduction_to_gpu_computing/nfs.jpg new file mode 100644 index 0000000..c1b67c0 Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/nfs.jpg differ diff --git a/blog/assets/img/introduction_to_gpu_computing/rabbit.png b/blog/assets/img/introduction_to_gpu_computing/rabbit.png new file mode 100644 index 0000000..8cf78ea Binary files /dev/null and b/blog/assets/img/introduction_to_gpu_computing/rabbit.png differ diff --git a/blog/assets/img/kmp/p1.png b/blog/assets/img/kmp/p1.png new file mode 100644 index 0000000..81cec25 Binary files /dev/null and b/blog/assets/img/kmp/p1.png differ diff --git a/blog/assets/img/kmp/p2.png b/blog/assets/img/kmp/p2.png new file mode 100644 index 0000000..b8e814c Binary files /dev/null and b/blog/assets/img/kmp/p2.png differ diff --git a/blog/assets/img/kmp/p3.png b/blog/assets/img/kmp/p3.png new file mode 100644 index 0000000..d9b9391 Binary files /dev/null and b/blog/assets/img/kmp/p3.png differ diff --git a/blog/assets/img/light-backscatter-application/1.jpg b/blog/assets/img/light-backscatter-application/1.jpg new file mode 100644 index 0000000..78ec2d8 Binary files /dev/null and b/blog/assets/img/light-backscatter-application/1.jpg differ diff --git a/blog/assets/img/light-backscatter-application/2.jpg b/blog/assets/img/light-backscatter-application/2.jpg new file mode 100644 index 0000000..b13cbc8 Binary files /dev/null and b/blog/assets/img/light-backscatter-application/2.jpg differ diff --git a/blog/assets/img/light-backscatter-application/3.jpg b/blog/assets/img/light-backscatter-application/3.jpg new file mode 100644 index 0000000..9379d6b Binary files /dev/null and b/blog/assets/img/light-backscatter-application/3.jpg differ diff --git a/blog/assets/img/light-backscatter-application/4.jpg b/blog/assets/img/light-backscatter-application/4.jpg new file mode 100644 index 0000000..b12c6f0 Binary files /dev/null and b/blog/assets/img/light-backscatter-application/4.jpg differ diff --git a/blog/assets/img/light-backscatter-application/5.jpg b/blog/assets/img/light-backscatter-application/5.jpg new file mode 100644 index 0000000..e1b41f0 Binary files /dev/null and b/blog/assets/img/light-backscatter-application/5.jpg differ diff --git a/blog/assets/img/light-backscatter-application/6.jpg b/blog/assets/img/light-backscatter-application/6.jpg new file mode 100644 index 0000000..ffc49d0 Binary files /dev/null and b/blog/assets/img/light-backscatter-application/6.jpg differ diff --git a/blog/assets/img/light-backscatter-application/7.jpg b/blog/assets/img/light-backscatter-application/7.jpg new file mode 100644 index 0000000..b22b8be Binary files /dev/null and b/blog/assets/img/light-backscatter-application/7.jpg differ diff --git a/blog/assets/img/lighting-up-your-room/plans.jpeg b/blog/assets/img/lighting-up-your-room/plans.jpeg new file mode 100644 index 0000000..c31a12f Binary files /dev/null and b/blog/assets/img/lighting-up-your-room/plans.jpeg differ diff --git a/blog/assets/img/localization-robotics/feature-map.png b/blog/assets/img/localization-robotics/feature-map.png new file mode 100644 index 0000000..eaefc7a Binary files /dev/null and b/blog/assets/img/localization-robotics/feature-map.png differ diff --git a/blog/assets/img/localization-robotics/grid-map.png b/blog/assets/img/localization-robotics/grid-map.png new file mode 100644 index 0000000..153da85 Binary files /dev/null and b/blog/assets/img/localization-robotics/grid-map.png differ diff --git a/blog/assets/img/logo.png b/blog/assets/img/logo.png new file mode 100644 index 0000000..7415501 Binary files /dev/null and b/blog/assets/img/logo.png differ diff --git a/blog/assets/img/lstm-models/png1.jpg b/blog/assets/img/lstm-models/png1.jpg new file mode 100644 index 0000000..447a8b4 Binary files /dev/null and b/blog/assets/img/lstm-models/png1.jpg differ diff --git a/blog/assets/img/lstm-models/png10.png b/blog/assets/img/lstm-models/png10.png new file mode 100644 index 0000000..e2551b8 Binary files /dev/null and b/blog/assets/img/lstm-models/png10.png differ diff --git a/blog/assets/img/lstm-models/png2.jpg b/blog/assets/img/lstm-models/png2.jpg new file mode 100644 index 0000000..90d48b2 Binary files /dev/null and b/blog/assets/img/lstm-models/png2.jpg differ diff --git a/blog/assets/img/lstm-models/png3.png b/blog/assets/img/lstm-models/png3.png new file mode 100644 index 0000000..bba8641 Binary files /dev/null and b/blog/assets/img/lstm-models/png3.png differ diff --git a/blog/assets/img/lstm-models/png4.png b/blog/assets/img/lstm-models/png4.png new file mode 100644 index 0000000..555700c Binary files /dev/null and b/blog/assets/img/lstm-models/png4.png differ diff --git a/blog/assets/img/lstm-models/png5.png b/blog/assets/img/lstm-models/png5.png new file mode 100644 index 0000000..29fdebc Binary files /dev/null and b/blog/assets/img/lstm-models/png5.png differ diff --git a/blog/assets/img/lstm-models/png6.png b/blog/assets/img/lstm-models/png6.png new file mode 100644 index 0000000..eb85a7f Binary files /dev/null and b/blog/assets/img/lstm-models/png6.png differ diff --git a/blog/assets/img/lstm-models/png7.png b/blog/assets/img/lstm-models/png7.png new file mode 100644 index 0000000..6448fd9 Binary files /dev/null and b/blog/assets/img/lstm-models/png7.png differ diff --git a/blog/assets/img/lstm-models/png8.png b/blog/assets/img/lstm-models/png8.png new file mode 100644 index 0000000..3130f25 Binary files /dev/null and b/blog/assets/img/lstm-models/png8.png differ diff --git a/blog/assets/img/lstm-models/png9.png b/blog/assets/img/lstm-models/png9.png new file mode 100644 index 0000000..3f3ade7 Binary files /dev/null and b/blog/assets/img/lstm-models/png9.png differ diff --git a/blog/assets/img/machine-learning-magic/1.jpeg b/blog/assets/img/machine-learning-magic/1.jpeg new file mode 100644 index 0000000..55dc973 Binary files /dev/null and b/blog/assets/img/machine-learning-magic/1.jpeg differ diff --git a/blog/assets/img/machine-learning-magic/2.png b/blog/assets/img/machine-learning-magic/2.png new file mode 100644 index 0000000..949fc45 Binary files /dev/null and b/blog/assets/img/machine-learning-magic/2.png differ diff --git a/blog/assets/img/machine-learning-magic/3.png b/blog/assets/img/machine-learning-magic/3.png new file mode 100644 index 0000000..89607bd Binary files /dev/null and b/blog/assets/img/machine-learning-magic/3.png differ diff --git a/blog/assets/img/machine-learning-magic/4.png b/blog/assets/img/machine-learning-magic/4.png new file mode 100644 index 0000000..5f9b208 Binary files /dev/null and b/blog/assets/img/machine-learning-magic/4.png differ diff --git a/blog/assets/img/machine-learning-magic/5.jpeg b/blog/assets/img/machine-learning-magic/5.jpeg new file mode 100644 index 0000000..c816184 Binary files /dev/null and b/blog/assets/img/machine-learning-magic/5.jpeg differ diff --git a/blog/assets/img/machine-learning-magic/6.png b/blog/assets/img/machine-learning-magic/6.png new file mode 100644 index 0000000..46d19e2 Binary files /dev/null and b/blog/assets/img/machine-learning-magic/6.png differ diff --git a/blog/assets/img/machine-translation/attn_model.png b/blog/assets/img/machine-translation/attn_model.png new file mode 100644 index 0000000..46ef210 Binary files /dev/null and b/blog/assets/img/machine-translation/attn_model.png differ diff --git a/blog/assets/img/machine-translation/encode-decode.png b/blog/assets/img/machine-translation/encode-decode.png new file mode 100644 index 0000000..878e786 Binary files /dev/null and b/blog/assets/img/machine-translation/encode-decode.png differ diff --git a/blog/assets/img/machine-translation/machine-translation-diagram2.png b/blog/assets/img/machine-translation/machine-translation-diagram2.png new file mode 100644 index 0000000..342f48f Binary files /dev/null and b/blog/assets/img/machine-translation/machine-translation-diagram2.png differ diff --git a/blog/assets/img/magnetically-repelling-ice/Magnetically-Repelling-Ice_01.jpg b/blog/assets/img/magnetically-repelling-ice/Magnetically-Repelling-Ice_01.jpg new file mode 100644 index 0000000..21c3cd1 Binary files /dev/null and b/blog/assets/img/magnetically-repelling-ice/Magnetically-Repelling-Ice_01.jpg differ diff --git a/blog/assets/img/magnetically-repelling-ice/Magnetically-Repelling-Ice_hero.jpg b/blog/assets/img/magnetically-repelling-ice/Magnetically-Repelling-Ice_hero.jpg new file mode 100644 index 0000000..f2030a2 Binary files /dev/null and b/blog/assets/img/magnetically-repelling-ice/Magnetically-Repelling-Ice_hero.jpg differ diff --git a/blog/assets/img/market-basket/conf.png b/blog/assets/img/market-basket/conf.png new file mode 100644 index 0000000..56d9adc Binary files /dev/null and b/blog/assets/img/market-basket/conf.png differ diff --git a/blog/assets/img/market-basket/mba.png b/blog/assets/img/market-basket/mba.png new file mode 100644 index 0000000..e247f11 Binary files /dev/null and b/blog/assets/img/market-basket/mba.png differ diff --git a/blog/assets/img/market-basket/support.png b/blog/assets/img/market-basket/support.png new file mode 100644 index 0000000..0a4b2b5 Binary files /dev/null and b/blog/assets/img/market-basket/support.png differ diff --git a/blog/assets/img/mems/fig1.jpg b/blog/assets/img/mems/fig1.jpg new file mode 100644 index 0000000..0967d14 Binary files /dev/null and b/blog/assets/img/mems/fig1.jpg differ diff --git a/blog/assets/img/mems/fig2.jpg b/blog/assets/img/mems/fig2.jpg new file mode 100644 index 0000000..f47fc2a Binary files /dev/null and b/blog/assets/img/mems/fig2.jpg differ diff --git a/blog/assets/img/mems/fig3.jpg b/blog/assets/img/mems/fig3.jpg new file mode 100644 index 0000000..91066a1 Binary files /dev/null and b/blog/assets/img/mems/fig3.jpg differ diff --git a/blog/assets/img/metamaterials/figure1.jpg b/blog/assets/img/metamaterials/figure1.jpg new file mode 100644 index 0000000..ebf5391 Binary files /dev/null and b/blog/assets/img/metamaterials/figure1.jpg differ diff --git a/blog/assets/img/metamaterials/figure2.jpg b/blog/assets/img/metamaterials/figure2.jpg new file mode 100644 index 0000000..323976d Binary files /dev/null and b/blog/assets/img/metamaterials/figure2.jpg differ diff --git a/blog/assets/img/metamaterials/figure3.jpg b/blog/assets/img/metamaterials/figure3.jpg new file mode 100644 index 0000000..847292b Binary files /dev/null and b/blog/assets/img/metamaterials/figure3.jpg differ diff --git a/blog/assets/img/metamaterials/figure4.jpg b/blog/assets/img/metamaterials/figure4.jpg new file mode 100644 index 0000000..ce73847 Binary files /dev/null and b/blog/assets/img/metamaterials/figure4.jpg differ diff --git a/blog/assets/img/microled/1.jpg b/blog/assets/img/microled/1.jpg new file mode 100644 index 0000000..1edaf0f Binary files /dev/null and b/blog/assets/img/microled/1.jpg differ diff --git a/blog/assets/img/microled/2.jpg b/blog/assets/img/microled/2.jpg new file mode 100644 index 0000000..4c08edc Binary files /dev/null and b/blog/assets/img/microled/2.jpg differ diff --git a/blog/assets/img/microled/3.jpg b/blog/assets/img/microled/3.jpg new file mode 100644 index 0000000..b2ce758 Binary files /dev/null and b/blog/assets/img/microled/3.jpg differ diff --git a/blog/assets/img/microservices/monolith-vs-microservices.png b/blog/assets/img/microservices/monolith-vs-microservices.png new file mode 100644 index 0000000..91aeb26 Binary files /dev/null and b/blog/assets/img/microservices/monolith-vs-microservices.png differ diff --git a/blog/assets/img/multitenancy/approach.png b/blog/assets/img/multitenancy/approach.png new file mode 100644 index 0000000..05c8c94 Binary files /dev/null and b/blog/assets/img/multitenancy/approach.png differ diff --git a/blog/assets/img/multitenancy/db_schema.png b/blog/assets/img/multitenancy/db_schema.png new file mode 100644 index 0000000..b3d8485 Binary files /dev/null and b/blog/assets/img/multitenancy/db_schema.png differ diff --git a/blog/assets/img/multitenancy/difference.png b/blog/assets/img/multitenancy/difference.png new file mode 100644 index 0000000..cf23692 Binary files /dev/null and b/blog/assets/img/multitenancy/difference.png differ diff --git a/blog/assets/img/my-two-snowflakes/image1.png b/blog/assets/img/my-two-snowflakes/image1.png new file mode 100644 index 0000000..a2addb5 Binary files /dev/null and b/blog/assets/img/my-two-snowflakes/image1.png differ diff --git a/blog/assets/img/my-two-snowflakes/image2.png b/blog/assets/img/my-two-snowflakes/image2.png new file mode 100644 index 0000000..fabb057 Binary files /dev/null and b/blog/assets/img/my-two-snowflakes/image2.png differ diff --git a/blog/assets/img/my-two-snowflakes/image3.png b/blog/assets/img/my-two-snowflakes/image3.png new file mode 100644 index 0000000..6f0e497 Binary files /dev/null and b/blog/assets/img/my-two-snowflakes/image3.png differ diff --git a/blog/assets/img/nanomachines/2-nanocars.png b/blog/assets/img/nanomachines/2-nanocars.png new file mode 100644 index 0000000..521ea02 Binary files /dev/null and b/blog/assets/img/nanomachines/2-nanocars.png differ diff --git a/blog/assets/img/nanomachines/3-microbot.png b/blog/assets/img/nanomachines/3-microbot.png new file mode 100644 index 0000000..c0ac1ca Binary files /dev/null and b/blog/assets/img/nanomachines/3-microbot.png differ diff --git a/blog/assets/img/nanomachines/4-microbots-carrying-cells1.png b/blog/assets/img/nanomachines/4-microbots-carrying-cells1.png new file mode 100644 index 0000000..704618e Binary files /dev/null and b/blog/assets/img/nanomachines/4-microbots-carrying-cells1.png differ diff --git a/blog/assets/img/nanomachines/sensors-08-02932f6.png b/blog/assets/img/nanomachines/sensors-08-02932f6.png new file mode 100644 index 0000000..dae2b4c Binary files /dev/null and b/blog/assets/img/nanomachines/sensors-08-02932f6.png differ diff --git a/blog/assets/img/nanosheets-decorated-with-dna/dna.jpg b/blog/assets/img/nanosheets-decorated-with-dna/dna.jpg new file mode 100644 index 0000000..65cbe1d Binary files /dev/null and b/blog/assets/img/nanosheets-decorated-with-dna/dna.jpg differ diff --git a/blog/assets/img/neural-landers/image1.png b/blog/assets/img/neural-landers/image1.png new file mode 100644 index 0000000..4abe04d Binary files /dev/null and b/blog/assets/img/neural-landers/image1.png differ diff --git a/blog/assets/img/neural-landers/image2.png b/blog/assets/img/neural-landers/image2.png new file mode 100644 index 0000000..e899962 Binary files /dev/null and b/blog/assets/img/neural-landers/image2.png differ diff --git a/blog/assets/img/neural-landers/image3.png b/blog/assets/img/neural-landers/image3.png new file mode 100644 index 0000000..1b9f607 Binary files /dev/null and b/blog/assets/img/neural-landers/image3.png differ diff --git a/blog/assets/img/neural-landers/image4.png b/blog/assets/img/neural-landers/image4.png new file mode 100644 index 0000000..b2ef833 Binary files /dev/null and b/blog/assets/img/neural-landers/image4.png differ diff --git a/blog/assets/img/neural-landers/image5.png b/blog/assets/img/neural-landers/image5.png new file mode 100644 index 0000000..42d2683 Binary files /dev/null and b/blog/assets/img/neural-landers/image5.png differ diff --git a/blog/assets/img/neural-landers/image6.png b/blog/assets/img/neural-landers/image6.png new file mode 100644 index 0000000..ecc70b8 Binary files /dev/null and b/blog/assets/img/neural-landers/image6.png differ diff --git a/blog/assets/img/neural-landers/image7.png b/blog/assets/img/neural-landers/image7.png new file mode 100644 index 0000000..d6d653e Binary files /dev/null and b/blog/assets/img/neural-landers/image7.png differ diff --git a/blog/assets/img/neural-landers/image8.png b/blog/assets/img/neural-landers/image8.png new file mode 100644 index 0000000..77b9869 Binary files /dev/null and b/blog/assets/img/neural-landers/image8.png differ diff --git a/blog/assets/img/once-upon-a-time-in-fiction/image1.png b/blog/assets/img/once-upon-a-time-in-fiction/image1.png new file mode 100644 index 0000000..5a30ad9 Binary files /dev/null and b/blog/assets/img/once-upon-a-time-in-fiction/image1.png differ diff --git a/blog/assets/img/once-upon-a-time-in-fiction/image2.png b/blog/assets/img/once-upon-a-time-in-fiction/image2.png new file mode 100644 index 0000000..4b6ce66 Binary files /dev/null and b/blog/assets/img/once-upon-a-time-in-fiction/image2.png differ diff --git a/blog/assets/img/once-upon-a-time-in-fiction/image3.png b/blog/assets/img/once-upon-a-time-in-fiction/image3.png new file mode 100644 index 0000000..65f8bc3 Binary files /dev/null and b/blog/assets/img/once-upon-a-time-in-fiction/image3.png differ diff --git a/blog/assets/img/once-upon-a-time-in-fiction/image4.png b/blog/assets/img/once-upon-a-time-in-fiction/image4.png new file mode 100644 index 0000000..e00349d Binary files /dev/null and b/blog/assets/img/once-upon-a-time-in-fiction/image4.png differ diff --git a/blog/assets/img/once-upon-a-time-in-fiction/image5.png b/blog/assets/img/once-upon-a-time-in-fiction/image5.png new file mode 100644 index 0000000..077a8ca Binary files /dev/null and b/blog/assets/img/once-upon-a-time-in-fiction/image5.png differ diff --git a/blog/assets/img/once-upon-a-time-in-fiction/image6.png b/blog/assets/img/once-upon-a-time-in-fiction/image6.png new file mode 100644 index 0000000..76c98a8 Binary files /dev/null and b/blog/assets/img/once-upon-a-time-in-fiction/image6.png differ diff --git a/blog/assets/img/opencv/OpenCV_Logo.png b/blog/assets/img/opencv/OpenCV_Logo.png new file mode 100644 index 0000000..202ee20 Binary files /dev/null and b/blog/assets/img/opencv/OpenCV_Logo.png differ diff --git a/blog/assets/img/opencv/gray.png b/blog/assets/img/opencv/gray.png new file mode 100644 index 0000000..4ccf9a8 Binary files /dev/null and b/blog/assets/img/opencv/gray.png differ diff --git a/blog/assets/img/opencv/python-logo.jpg b/blog/assets/img/opencv/python-logo.jpg new file mode 100644 index 0000000..c45ea45 Binary files /dev/null and b/blog/assets/img/opencv/python-logo.jpg differ diff --git a/blog/assets/img/opv/1.jpg b/blog/assets/img/opv/1.jpg new file mode 100644 index 0000000..ad9b4ae Binary files /dev/null and b/blog/assets/img/opv/1.jpg differ diff --git a/blog/assets/img/opv/2.jpg b/blog/assets/img/opv/2.jpg new file mode 100644 index 0000000..ad109c6 Binary files /dev/null and b/blog/assets/img/opv/2.jpg differ diff --git a/blog/assets/img/opv/3.jpg b/blog/assets/img/opv/3.jpg new file mode 100644 index 0000000..e7d4e89 Binary files /dev/null and b/blog/assets/img/opv/3.jpg differ diff --git a/blog/assets/img/opv/4.jpg b/blog/assets/img/opv/4.jpg new file mode 100644 index 0000000..18c5af4 Binary files /dev/null and b/blog/assets/img/opv/4.jpg differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/1.png b/blog/assets/img/password-security-techniques-and-challenges/1.png new file mode 100644 index 0000000..321cc59 Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/1.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/10.jpg b/blog/assets/img/password-security-techniques-and-challenges/10.jpg new file mode 100644 index 0000000..d637dba Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/10.jpg differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/11.png b/blog/assets/img/password-security-techniques-and-challenges/11.png new file mode 100644 index 0000000..de8a34d Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/11.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/2.png b/blog/assets/img/password-security-techniques-and-challenges/2.png new file mode 100644 index 0000000..8901d6f Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/2.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/3.png b/blog/assets/img/password-security-techniques-and-challenges/3.png new file mode 100644 index 0000000..8b4a26a Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/3.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/4.png b/blog/assets/img/password-security-techniques-and-challenges/4.png new file mode 100644 index 0000000..a77fd09 Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/4.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/5.png b/blog/assets/img/password-security-techniques-and-challenges/5.png new file mode 100644 index 0000000..847f976 Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/5.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/6.png b/blog/assets/img/password-security-techniques-and-challenges/6.png new file mode 100644 index 0000000..36505d9 Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/6.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/7.jpg b/blog/assets/img/password-security-techniques-and-challenges/7.jpg new file mode 100644 index 0000000..4773334 Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/7.jpg differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/8.png b/blog/assets/img/password-security-techniques-and-challenges/8.png new file mode 100644 index 0000000..feac6fb Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/8.png differ diff --git a/blog/assets/img/password-security-techniques-and-challenges/9.png b/blog/assets/img/password-security-techniques-and-challenges/9.png new file mode 100644 index 0000000..92d72cf Binary files /dev/null and b/blog/assets/img/password-security-techniques-and-challenges/9.png differ diff --git a/blog/assets/img/phase-change-material/pcm.jpg b/blog/assets/img/phase-change-material/pcm.jpg new file mode 100644 index 0000000..2a05dbb Binary files /dev/null and b/blog/assets/img/phase-change-material/pcm.jpg differ diff --git a/blog/assets/img/photocatalytic-decomposition/untitled.jpg b/blog/assets/img/photocatalytic-decomposition/untitled.jpg new file mode 100644 index 0000000..1a27dea Binary files /dev/null and b/blog/assets/img/photocatalytic-decomposition/untitled.jpg differ diff --git a/blog/assets/img/piezoelectricity-and-piezoelectric-sensors/equivalent_circuit.png b/blog/assets/img/piezoelectricity-and-piezoelectric-sensors/equivalent_circuit.png new file mode 100644 index 0000000..80c122e Binary files /dev/null and b/blog/assets/img/piezoelectricity-and-piezoelectric-sensors/equivalent_circuit.png differ diff --git a/blog/assets/img/piezoelectricity-and-piezoelectric-sensors/graph.jpg b/blog/assets/img/piezoelectricity-and-piezoelectric-sensors/graph.jpg new file mode 100644 index 0000000..a2fc80b Binary files /dev/null and b/blog/assets/img/piezoelectricity-and-piezoelectric-sensors/graph.jpg differ diff --git a/blog/assets/img/prof-matching/list-of-students.jpg b/blog/assets/img/prof-matching/list-of-students.jpg new file mode 100644 index 0000000..b27b2a0 Binary files /dev/null and b/blog/assets/img/prof-matching/list-of-students.jpg differ diff --git a/blog/assets/img/prof-matching/login.jpg b/blog/assets/img/prof-matching/login.jpg new file mode 100644 index 0000000..05d52ec Binary files /dev/null and b/blog/assets/img/prof-matching/login.jpg differ diff --git a/blog/assets/img/prof-matching/team.jpg b/blog/assets/img/prof-matching/team.jpg new file mode 100644 index 0000000..2154ff1 Binary files /dev/null and b/blog/assets/img/prof-matching/team.jpg differ diff --git a/blog/assets/img/promises-closures-and-potatoes/image1.png b/blog/assets/img/promises-closures-and-potatoes/image1.png new file mode 100644 index 0000000..5cad781 Binary files /dev/null and b/blog/assets/img/promises-closures-and-potatoes/image1.png differ diff --git a/blog/assets/img/pslv-to-mars/Figure1.jpg b/blog/assets/img/pslv-to-mars/Figure1.jpg new file mode 100644 index 0000000..664c937 Binary files /dev/null and b/blog/assets/img/pslv-to-mars/Figure1.jpg differ diff --git a/blog/assets/img/pslv-to-mars/Figure2.jpg b/blog/assets/img/pslv-to-mars/Figure2.jpg new file mode 100644 index 0000000..b2fc8bf Binary files /dev/null and b/blog/assets/img/pslv-to-mars/Figure2.jpg differ diff --git a/blog/assets/img/qemu-virtualization/kvm_qemu.png b/blog/assets/img/qemu-virtualization/kvm_qemu.png new file mode 100644 index 0000000..7254d7e Binary files /dev/null and b/blog/assets/img/qemu-virtualization/kvm_qemu.png differ diff --git a/blog/assets/img/qrCode/image1.jpeg b/blog/assets/img/qrCode/image1.jpeg new file mode 100644 index 0000000..26bd3e8 Binary files /dev/null and b/blog/assets/img/qrCode/image1.jpeg differ diff --git a/blog/assets/img/qrCode/image2.png b/blog/assets/img/qrCode/image2.png new file mode 100644 index 0000000..60aa73f Binary files /dev/null and b/blog/assets/img/qrCode/image2.png differ diff --git a/blog/assets/img/quantum-computers/1.jpg b/blog/assets/img/quantum-computers/1.jpg new file mode 100644 index 0000000..6bad78f Binary files /dev/null and b/blog/assets/img/quantum-computers/1.jpg differ diff --git a/blog/assets/img/quantum-computers/2.jpg b/blog/assets/img/quantum-computers/2.jpg new file mode 100644 index 0000000..7db6b0d Binary files /dev/null and b/blog/assets/img/quantum-computers/2.jpg differ diff --git a/blog/assets/img/quantum-computers/3.jpg b/blog/assets/img/quantum-computers/3.jpg new file mode 100644 index 0000000..3c7b1eb Binary files /dev/null and b/blog/assets/img/quantum-computers/3.jpg differ diff --git a/blog/assets/img/quantum-computers/4.jpg b/blog/assets/img/quantum-computers/4.jpg new file mode 100644 index 0000000..6e8b9d2 Binary files /dev/null and b/blog/assets/img/quantum-computers/4.jpg differ diff --git a/blog/assets/img/quantum-computers/5.jpg b/blog/assets/img/quantum-computers/5.jpg new file mode 100644 index 0000000..fbc280d Binary files /dev/null and b/blog/assets/img/quantum-computers/5.jpg differ diff --git a/blog/assets/img/quantum-supremacy/bristlecone.png b/blog/assets/img/quantum-supremacy/bristlecone.png new file mode 100644 index 0000000..1e50387 Binary files /dev/null and b/blog/assets/img/quantum-supremacy/bristlecone.png differ diff --git a/blog/assets/img/quantum-supremacy/measurement.png b/blog/assets/img/quantum-supremacy/measurement.png new file mode 100644 index 0000000..4167d24 Binary files /dev/null and b/blog/assets/img/quantum-supremacy/measurement.png differ diff --git a/blog/assets/img/quantum-supremacy/qubit.png b/blog/assets/img/quantum-supremacy/qubit.png new file mode 100644 index 0000000..4a1b97f Binary files /dev/null and b/blog/assets/img/quantum-supremacy/qubit.png differ diff --git a/blog/assets/img/random-number-generator/comic.jpg b/blog/assets/img/random-number-generator/comic.jpg new file mode 100644 index 0000000..8556a39 Binary files /dev/null and b/blog/assets/img/random-number-generator/comic.jpg differ diff --git a/blog/assets/img/random-number-generator/dice.jpg b/blog/assets/img/random-number-generator/dice.jpg new file mode 100644 index 0000000..e6c8858 Binary files /dev/null and b/blog/assets/img/random-number-generator/dice.jpg differ diff --git a/blog/assets/img/random-number-generator/gamble.jpg b/blog/assets/img/random-number-generator/gamble.jpg new file mode 100644 index 0000000..a8fdd9f Binary files /dev/null and b/blog/assets/img/random-number-generator/gamble.jpg differ diff --git a/blog/assets/img/regenerative-braking/pic1.jpeg b/blog/assets/img/regenerative-braking/pic1.jpeg new file mode 100644 index 0000000..553e238 Binary files /dev/null and b/blog/assets/img/regenerative-braking/pic1.jpeg differ diff --git a/blog/assets/img/regenerative-braking/pic2.jpeg b/blog/assets/img/regenerative-braking/pic2.jpeg new file mode 100644 index 0000000..5e40afd Binary files /dev/null and b/blog/assets/img/regenerative-braking/pic2.jpeg differ diff --git a/blog/assets/img/regenerative-braking/pic3.jpeg b/blog/assets/img/regenerative-braking/pic3.jpeg new file mode 100644 index 0000000..7619f3e Binary files /dev/null and b/blog/assets/img/regenerative-braking/pic3.jpeg differ diff --git a/blog/assets/img/regenerative-braking/pic4.jpeg b/blog/assets/img/regenerative-braking/pic4.jpeg new file mode 100644 index 0000000..f24bd72 Binary files /dev/null and b/blog/assets/img/regenerative-braking/pic4.jpeg differ diff --git a/blog/assets/img/regenerative-braking/pic5.jpeg b/blog/assets/img/regenerative-braking/pic5.jpeg new file mode 100644 index 0000000..4a8c2a7 Binary files /dev/null and b/blog/assets/img/regenerative-braking/pic5.jpeg differ diff --git a/blog/assets/img/revolution-called-ddr/Fig-2-Figure-Clocking-1-300x89.jpg b/blog/assets/img/revolution-called-ddr/Fig-2-Figure-Clocking-1-300x89.jpg new file mode 100644 index 0000000..621b54a Binary files /dev/null and b/blog/assets/img/revolution-called-ddr/Fig-2-Figure-Clocking-1-300x89.jpg differ diff --git a/blog/assets/img/revolution-called-ddr/ddr-table.png b/blog/assets/img/revolution-called-ddr/ddr-table.png new file mode 100644 index 0000000..2e348b1 Binary files /dev/null and b/blog/assets/img/revolution-called-ddr/ddr-table.png differ diff --git a/blog/assets/img/revolution-called-ddr/present.jpg b/blog/assets/img/revolution-called-ddr/present.jpg new file mode 100644 index 0000000..8295555 Binary files /dev/null and b/blog/assets/img/revolution-called-ddr/present.jpg differ diff --git a/blog/assets/img/revolution-called-ddr/prev.jpg b/blog/assets/img/revolution-called-ddr/prev.jpg new file mode 100644 index 0000000..cd0ffb8 Binary files /dev/null and b/blog/assets/img/revolution-called-ddr/prev.jpg differ diff --git a/blog/assets/img/rock-paper-scissors/traffic.jpg b/blog/assets/img/rock-paper-scissors/traffic.jpg new file mode 100644 index 0000000..1e226e8 Binary files /dev/null and b/blog/assets/img/rock-paper-scissors/traffic.jpg differ diff --git a/blog/assets/img/rocker-bogie/image1.jpg b/blog/assets/img/rocker-bogie/image1.jpg new file mode 100644 index 0000000..c8a00af Binary files /dev/null and b/blog/assets/img/rocker-bogie/image1.jpg differ diff --git a/blog/assets/img/rocker-bogie/image2.png b/blog/assets/img/rocker-bogie/image2.png new file mode 100644 index 0000000..4f9196e Binary files /dev/null and b/blog/assets/img/rocker-bogie/image2.png differ diff --git a/blog/assets/img/safety-issues-in-ai-systems/panda.png b/blog/assets/img/safety-issues-in-ai-systems/panda.png new file mode 100644 index 0000000..ede20a7 Binary files /dev/null and b/blog/assets/img/safety-issues-in-ai-systems/panda.png differ diff --git a/blog/assets/img/safety-issues-in-ai-systems/washing_machine.png b/blog/assets/img/safety-issues-in-ai-systems/washing_machine.png new file mode 100644 index 0000000..735ff14 Binary files /dev/null and b/blog/assets/img/safety-issues-in-ai-systems/washing_machine.png differ diff --git a/blog/assets/img/segment-tree/construction.png b/blog/assets/img/segment-tree/construction.png new file mode 100644 index 0000000..2bbdb4d Binary files /dev/null and b/blog/assets/img/segment-tree/construction.png differ diff --git a/blog/assets/img/segment-tree/point.png b/blog/assets/img/segment-tree/point.png new file mode 100644 index 0000000..9c07a64 Binary files /dev/null and b/blog/assets/img/segment-tree/point.png differ diff --git a/blog/assets/img/segment-tree/range.png b/blog/assets/img/segment-tree/range.png new file mode 100644 index 0000000..dbbf411 Binary files /dev/null and b/blog/assets/img/segment-tree/range.png differ diff --git a/blog/assets/img/self-healing-materials/fig1.jpg b/blog/assets/img/self-healing-materials/fig1.jpg new file mode 100644 index 0000000..f51220e Binary files /dev/null and b/blog/assets/img/self-healing-materials/fig1.jpg differ diff --git a/blog/assets/img/self-healing-materials/fig2.jpg b/blog/assets/img/self-healing-materials/fig2.jpg new file mode 100644 index 0000000..3793512 Binary files /dev/null and b/blog/assets/img/self-healing-materials/fig2.jpg differ diff --git a/blog/assets/img/self-healing-materials/fig3.jpg b/blog/assets/img/self-healing-materials/fig3.jpg new file mode 100644 index 0000000..1ba47f2 Binary files /dev/null and b/blog/assets/img/self-healing-materials/fig3.jpg differ diff --git a/blog/assets/img/self-healing-materials/fig4.gif b/blog/assets/img/self-healing-materials/fig4.gif new file mode 100644 index 0000000..2b7e791 Binary files /dev/null and b/blog/assets/img/self-healing-materials/fig4.gif differ diff --git a/blog/assets/img/self-healing-materials/fig5.png b/blog/assets/img/self-healing-materials/fig5.png new file mode 100644 index 0000000..8f8bf32 Binary files /dev/null and b/blog/assets/img/self-healing-materials/fig5.png differ diff --git a/blog/assets/img/self-healing-materials/fig6.jpg b/blog/assets/img/self-healing-materials/fig6.jpg new file mode 100644 index 0000000..1bcbda5 Binary files /dev/null and b/blog/assets/img/self-healing-materials/fig6.jpg differ diff --git a/blog/assets/img/smart-contract/smart.jpeg b/blog/assets/img/smart-contract/smart.jpeg new file mode 100644 index 0000000..9224529 Binary files /dev/null and b/blog/assets/img/smart-contract/smart.jpeg differ diff --git a/blog/assets/img/smart-grid/smart-grid.gif b/blog/assets/img/smart-grid/smart-grid.gif new file mode 100644 index 0000000..d11bb59 Binary files /dev/null and b/blog/assets/img/smart-grid/smart-grid.gif differ diff --git a/blog/assets/img/smart-lighting/Basic.jpg b/blog/assets/img/smart-lighting/Basic.jpg new file mode 100644 index 0000000..3faf047 Binary files /dev/null and b/blog/assets/img/smart-lighting/Basic.jpg differ diff --git a/blog/assets/img/smart-lighting/Circuit.jpg b/blog/assets/img/smart-lighting/Circuit.jpg new file mode 100644 index 0000000..1ae91d9 Binary files /dev/null and b/blog/assets/img/smart-lighting/Circuit.jpg differ diff --git a/blog/assets/img/smart-lighting/Team.jpg b/blog/assets/img/smart-lighting/Team.jpg new file mode 100644 index 0000000..ba0ba0e Binary files /dev/null and b/blog/assets/img/smart-lighting/Team.jpg differ diff --git a/blog/assets/img/social-engineering/0.jpg b/blog/assets/img/social-engineering/0.jpg new file mode 100644 index 0000000..3f66768 Binary files /dev/null and b/blog/assets/img/social-engineering/0.jpg differ diff --git a/blog/assets/img/social-engineering/1.jpg b/blog/assets/img/social-engineering/1.jpg new file mode 100644 index 0000000..ec9dea4 Binary files /dev/null and b/blog/assets/img/social-engineering/1.jpg differ diff --git a/blog/assets/img/social-engineering/2.jpg b/blog/assets/img/social-engineering/2.jpg new file mode 100644 index 0000000..e6fd4c9 Binary files /dev/null and b/blog/assets/img/social-engineering/2.jpg differ diff --git a/blog/assets/img/social-engineering/3.jpg b/blog/assets/img/social-engineering/3.jpg new file mode 100644 index 0000000..385f8c6 Binary files /dev/null and b/blog/assets/img/social-engineering/3.jpg differ diff --git a/blog/assets/img/social-engineering/4.jpg b/blog/assets/img/social-engineering/4.jpg new file mode 100644 index 0000000..60015b2 Binary files /dev/null and b/blog/assets/img/social-engineering/4.jpg differ diff --git a/blog/assets/img/social-engineering/5.jpg b/blog/assets/img/social-engineering/5.jpg new file mode 100644 index 0000000..0667019 Binary files /dev/null and b/blog/assets/img/social-engineering/5.jpg differ diff --git a/blog/assets/img/social-engineering/6.png b/blog/assets/img/social-engineering/6.png new file mode 100644 index 0000000..e33a315 Binary files /dev/null and b/blog/assets/img/social-engineering/6.png differ diff --git a/blog/assets/img/social-engineering/7.PNG b/blog/assets/img/social-engineering/7.PNG new file mode 100644 index 0000000..bc0a4f8 Binary files /dev/null and b/blog/assets/img/social-engineering/7.PNG differ diff --git a/blog/assets/img/space-based-solar-power/fifth_im.jpg b/blog/assets/img/space-based-solar-power/fifth_im.jpg new file mode 100644 index 0000000..75b142a Binary files /dev/null and b/blog/assets/img/space-based-solar-power/fifth_im.jpg differ diff --git a/blog/assets/img/space-based-solar-power/first_im.jpg b/blog/assets/img/space-based-solar-power/first_im.jpg new file mode 100644 index 0000000..5ef323a Binary files /dev/null and b/blog/assets/img/space-based-solar-power/first_im.jpg differ diff --git a/blog/assets/img/space-based-solar-power/fourth_im.jpg b/blog/assets/img/space-based-solar-power/fourth_im.jpg new file mode 100644 index 0000000..d80fd79 Binary files /dev/null and b/blog/assets/img/space-based-solar-power/fourth_im.jpg differ diff --git a/blog/assets/img/space-based-solar-power/second_im.jpg b/blog/assets/img/space-based-solar-power/second_im.jpg new file mode 100644 index 0000000..60a9537 Binary files /dev/null and b/blog/assets/img/space-based-solar-power/second_im.jpg differ diff --git a/blog/assets/img/space-based-solar-power/seventh_im.jpg b/blog/assets/img/space-based-solar-power/seventh_im.jpg new file mode 100644 index 0000000..117b8a5 Binary files /dev/null and b/blog/assets/img/space-based-solar-power/seventh_im.jpg differ diff --git a/blog/assets/img/space-based-solar-power/sixth_im.jpg b/blog/assets/img/space-based-solar-power/sixth_im.jpg new file mode 100644 index 0000000..9160e67 Binary files /dev/null and b/blog/assets/img/space-based-solar-power/sixth_im.jpg differ diff --git a/blog/assets/img/space-based-solar-power/third_im.jpg b/blog/assets/img/space-based-solar-power/third_im.jpg new file mode 100644 index 0000000..65741e5 Binary files /dev/null and b/blog/assets/img/space-based-solar-power/third_im.jpg differ diff --git a/blog/assets/img/space-ml/binnedcurve.png b/blog/assets/img/space-ml/binnedcurve.png new file mode 100644 index 0000000..9521e3e Binary files /dev/null and b/blog/assets/img/space-ml/binnedcurve.png differ diff --git a/blog/assets/img/space-ml/binning_example.png b/blog/assets/img/space-ml/binning_example.png new file mode 100644 index 0000000..45ae5c6 Binary files /dev/null and b/blog/assets/img/space-ml/binning_example.png differ diff --git a/blog/assets/img/space-ml/foldedcurve.png b/blog/assets/img/space-ml/foldedcurve.png new file mode 100644 index 0000000..7f50be4 Binary files /dev/null and b/blog/assets/img/space-ml/foldedcurve.png differ diff --git a/blog/assets/img/space-ml/kepler-graph.gif b/blog/assets/img/space-ml/kepler-graph.gif new file mode 100644 index 0000000..35be300 Binary files /dev/null and b/blog/assets/img/space-ml/kepler-graph.gif differ diff --git a/blog/assets/img/space-ml/lightcurve.png b/blog/assets/img/space-ml/lightcurve.png new file mode 100644 index 0000000..71095f0 Binary files /dev/null and b/blog/assets/img/space-ml/lightcurve.png differ diff --git a/blog/assets/img/stem cells/figure 1.png b/blog/assets/img/stem cells/figure 1.png new file mode 100644 index 0000000..031aad8 Binary files /dev/null and b/blog/assets/img/stem cells/figure 1.png differ diff --git a/blog/assets/img/stem cells/figure 2.png b/blog/assets/img/stem cells/figure 2.png new file mode 100644 index 0000000..bdf196c Binary files /dev/null and b/blog/assets/img/stem cells/figure 2.png differ diff --git a/blog/assets/img/stem cells/figure 3.png b/blog/assets/img/stem cells/figure 3.png new file mode 100644 index 0000000..860e8ca Binary files /dev/null and b/blog/assets/img/stem cells/figure 3.png differ diff --git a/blog/assets/img/stem cells/figure 4.png b/blog/assets/img/stem cells/figure 4.png new file mode 100644 index 0000000..8494ae3 Binary files /dev/null and b/blog/assets/img/stem cells/figure 4.png differ diff --git a/blog/assets/img/stem cells/figure 5.png b/blog/assets/img/stem cells/figure 5.png new file mode 100644 index 0000000..aa84c6b Binary files /dev/null and b/blog/assets/img/stem cells/figure 5.png differ diff --git a/blog/assets/img/supercap/img1.jpeg b/blog/assets/img/supercap/img1.jpeg new file mode 100644 index 0000000..64af249 Binary files /dev/null and b/blog/assets/img/supercap/img1.jpeg differ diff --git a/blog/assets/img/supercap/img2.jpeg b/blog/assets/img/supercap/img2.jpeg new file mode 100644 index 0000000..1d84774 Binary files /dev/null and b/blog/assets/img/supercap/img2.jpeg differ diff --git a/blog/assets/img/t-SNE/20.png b/blog/assets/img/t-SNE/20.png new file mode 100644 index 0000000..f5335a5 Binary files /dev/null and b/blog/assets/img/t-SNE/20.png differ diff --git a/blog/assets/img/t-SNE/40.png b/blog/assets/img/t-SNE/40.png new file mode 100644 index 0000000..97a74a5 Binary files /dev/null and b/blog/assets/img/t-SNE/40.png differ diff --git a/blog/assets/img/t-SNE/80.png b/blog/assets/img/t-SNE/80.png new file mode 100644 index 0000000..623dd58 Binary files /dev/null and b/blog/assets/img/t-SNE/80.png differ diff --git a/blog/assets/img/t-SNE/EM.png b/blog/assets/img/t-SNE/EM.png new file mode 100644 index 0000000..09f9bf5 Binary files /dev/null and b/blog/assets/img/t-SNE/EM.png differ diff --git a/blog/assets/img/t-SNE/orig.png b/blog/assets/img/t-SNE/orig.png new file mode 100644 index 0000000..576d226 Binary files /dev/null and b/blog/assets/img/t-SNE/orig.png differ diff --git a/blog/assets/img/t-SNE/pca_mnist.png b/blog/assets/img/t-SNE/pca_mnist.png new file mode 100644 index 0000000..0b8d4ed Binary files /dev/null and b/blog/assets/img/t-SNE/pca_mnist.png differ diff --git a/blog/assets/img/t-SNE/tsne_mnist.jpeg b/blog/assets/img/t-SNE/tsne_mnist.jpeg new file mode 100644 index 0000000..3fd2947 Binary files /dev/null and b/blog/assets/img/t-SNE/tsne_mnist.jpeg differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image1.png b/blog/assets/img/technology-for-differently-abled-people/image1.png new file mode 100644 index 0000000..db6f0d0 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image1.png differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image2.png b/blog/assets/img/technology-for-differently-abled-people/image2.png new file mode 100644 index 0000000..e939875 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image2.png differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image3.png b/blog/assets/img/technology-for-differently-abled-people/image3.png new file mode 100644 index 0000000..8583386 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image3.png differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image4.png b/blog/assets/img/technology-for-differently-abled-people/image4.png new file mode 100644 index 0000000..7079691 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image4.png differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image5.png b/blog/assets/img/technology-for-differently-abled-people/image5.png new file mode 100644 index 0000000..997a347 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image5.png differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image6.png b/blog/assets/img/technology-for-differently-abled-people/image6.png new file mode 100644 index 0000000..eeadc05 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image6.png differ diff --git a/blog/assets/img/technology-for-differently-abled-people/image7.png b/blog/assets/img/technology-for-differently-abled-people/image7.png new file mode 100644 index 0000000..8e3ef19 Binary files /dev/null and b/blog/assets/img/technology-for-differently-abled-people/image7.png differ diff --git a/blog/assets/img/technology-in-sports/w.jpg b/blog/assets/img/technology-in-sports/w.jpg new file mode 100644 index 0000000..01961f6 Binary files /dev/null and b/blog/assets/img/technology-in-sports/w.jpg differ diff --git a/blog/assets/img/the-brain-behind-a-formula-one-car/TAG.jpg b/blog/assets/img/the-brain-behind-a-formula-one-car/TAG.jpg new file mode 100644 index 0000000..4ce4073 Binary files /dev/null and b/blog/assets/img/the-brain-behind-a-formula-one-car/TAG.jpg differ diff --git a/blog/assets/img/the-class-of-np/P_np_np-complete_np-hard.svg.png b/blog/assets/img/the-class-of-np/P_np_np-complete_np-hard.svg.png new file mode 100644 index 0000000..dec72cd Binary files /dev/null and b/blog/assets/img/the-class-of-np/P_np_np-complete_np-hard.svg.png differ diff --git a/blog/assets/img/the-fourth-industrial-revolution/pic1.jpg b/blog/assets/img/the-fourth-industrial-revolution/pic1.jpg new file mode 100644 index 0000000..456607f Binary files /dev/null and b/blog/assets/img/the-fourth-industrial-revolution/pic1.jpg differ diff --git a/blog/assets/img/the-fourth-industrial-revolution/pic2.jpg b/blog/assets/img/the-fourth-industrial-revolution/pic2.jpg new file mode 100644 index 0000000..a87fe83 Binary files /dev/null and b/blog/assets/img/the-fourth-industrial-revolution/pic2.jpg differ diff --git a/blog/assets/img/the-fourth-industrial-revolution/pic3.jpg b/blog/assets/img/the-fourth-industrial-revolution/pic3.jpg new file mode 100644 index 0000000..02a341a Binary files /dev/null and b/blog/assets/img/the-fourth-industrial-revolution/pic3.jpg differ diff --git a/blog/assets/img/the-halting-problem/halting-problem.png b/blog/assets/img/the-halting-problem/halting-problem.png new file mode 100644 index 0000000..5a2e200 Binary files /dev/null and b/blog/assets/img/the-halting-problem/halting-problem.png differ diff --git a/blog/assets/img/the-halting-problem/img1.jpg b/blog/assets/img/the-halting-problem/img1.jpg new file mode 100644 index 0000000..0e50a53 Binary files /dev/null and b/blog/assets/img/the-halting-problem/img1.jpg differ diff --git a/blog/assets/img/the-halting-problem/img2.jpg b/blog/assets/img/the-halting-problem/img2.jpg new file mode 100644 index 0000000..f0d6e30 Binary files /dev/null and b/blog/assets/img/the-halting-problem/img2.jpg differ diff --git a/blog/assets/img/the-halting-problem/turing.png b/blog/assets/img/the-halting-problem/turing.png new file mode 100644 index 0000000..19b98f0 Binary files /dev/null and b/blog/assets/img/the-halting-problem/turing.png differ diff --git a/blog/assets/img/the-honeycomb-conjecture/img1.jpg b/blog/assets/img/the-honeycomb-conjecture/img1.jpg new file mode 100644 index 0000000..894cf99 Binary files /dev/null and b/blog/assets/img/the-honeycomb-conjecture/img1.jpg differ diff --git a/blog/assets/img/the-honeycomb-conjecture/img2.png b/blog/assets/img/the-honeycomb-conjecture/img2.png new file mode 100644 index 0000000..4bf58cd Binary files /dev/null and b/blog/assets/img/the-honeycomb-conjecture/img2.png differ diff --git a/blog/assets/img/the-honeycomb-conjecture/img3.jpg b/blog/assets/img/the-honeycomb-conjecture/img3.jpg new file mode 100644 index 0000000..d8dd392 Binary files /dev/null and b/blog/assets/img/the-honeycomb-conjecture/img3.jpg differ diff --git a/blog/assets/img/the-ligo-experiment/image1.jpeg b/blog/assets/img/the-ligo-experiment/image1.jpeg new file mode 100644 index 0000000..74f8dc9 Binary files /dev/null and b/blog/assets/img/the-ligo-experiment/image1.jpeg differ diff --git a/blog/assets/img/the-ligo-experiment/image2.png b/blog/assets/img/the-ligo-experiment/image2.png new file mode 100644 index 0000000..01d8da9 Binary files /dev/null and b/blog/assets/img/the-ligo-experiment/image2.png differ diff --git a/blog/assets/img/the-ligo-experiment/image3.jpeg b/blog/assets/img/the-ligo-experiment/image3.jpeg new file mode 100644 index 0000000..1eebc79 Binary files /dev/null and b/blog/assets/img/the-ligo-experiment/image3.jpeg differ diff --git a/blog/assets/img/the-ligo-experiment/image4.png b/blog/assets/img/the-ligo-experiment/image4.png new file mode 100644 index 0000000..5532286 Binary files /dev/null and b/blog/assets/img/the-ligo-experiment/image4.png differ diff --git a/blog/assets/img/the-missing-circuit-element/1.jpeg b/blog/assets/img/the-missing-circuit-element/1.jpeg new file mode 100644 index 0000000..90dd7bb Binary files /dev/null and b/blog/assets/img/the-missing-circuit-element/1.jpeg differ diff --git a/blog/assets/img/the-missing-circuit-element/2.1.jpeg b/blog/assets/img/the-missing-circuit-element/2.1.jpeg new file mode 100644 index 0000000..1866b84 Binary files /dev/null and b/blog/assets/img/the-missing-circuit-element/2.1.jpeg differ diff --git a/blog/assets/img/the-missing-circuit-element/2.jpeg b/blog/assets/img/the-missing-circuit-element/2.jpeg new file mode 100644 index 0000000..a37899f Binary files /dev/null and b/blog/assets/img/the-missing-circuit-element/2.jpeg differ diff --git a/blog/assets/img/the-missing-circuit-element/3.jpeg b/blog/assets/img/the-missing-circuit-element/3.jpeg new file mode 100644 index 0000000..05983fe Binary files /dev/null and b/blog/assets/img/the-missing-circuit-element/3.jpeg differ diff --git a/blog/assets/img/the-missing-circuit-element/4.jpeg b/blog/assets/img/the-missing-circuit-element/4.jpeg new file mode 100644 index 0000000..9becde5 Binary files /dev/null and b/blog/assets/img/the-missing-circuit-element/4.jpeg differ diff --git a/blog/assets/img/thermal-imaging/1.jpg b/blog/assets/img/thermal-imaging/1.jpg new file mode 100644 index 0000000..362d0b8 Binary files /dev/null and b/blog/assets/img/thermal-imaging/1.jpg differ diff --git a/blog/assets/img/thermal-imaging/2.jpg b/blog/assets/img/thermal-imaging/2.jpg new file mode 100644 index 0000000..26e6d14 Binary files /dev/null and b/blog/assets/img/thermal-imaging/2.jpg differ diff --git a/blog/assets/img/thermal-imaging/3.jpg b/blog/assets/img/thermal-imaging/3.jpg new file mode 100644 index 0000000..e6030bc Binary files /dev/null and b/blog/assets/img/thermal-imaging/3.jpg differ diff --git a/blog/assets/img/thermal-imaging/4.jpg b/blog/assets/img/thermal-imaging/4.jpg new file mode 100644 index 0000000..b37ea94 Binary files /dev/null and b/blog/assets/img/thermal-imaging/4.jpg differ diff --git a/blog/assets/img/thermal-imaging/5.jpg b/blog/assets/img/thermal-imaging/5.jpg new file mode 100644 index 0000000..ab6a5aa Binary files /dev/null and b/blog/assets/img/thermal-imaging/5.jpg differ diff --git a/blog/assets/img/thermal-imaging/6.jpg b/blog/assets/img/thermal-imaging/6.jpg new file mode 100644 index 0000000..f18e29c Binary files /dev/null and b/blog/assets/img/thermal-imaging/6.jpg differ diff --git a/blog/assets/img/thermal-imaging/7.jpg b/blog/assets/img/thermal-imaging/7.jpg new file mode 100644 index 0000000..19b99e5 Binary files /dev/null and b/blog/assets/img/thermal-imaging/7.jpg differ diff --git a/blog/assets/img/through-the-eyes-of-a-computer/image001.jpg b/blog/assets/img/through-the-eyes-of-a-computer/image001.jpg new file mode 100644 index 0000000..2f5e0ce Binary files /dev/null and b/blog/assets/img/through-the-eyes-of-a-computer/image001.jpg differ diff --git a/blog/assets/img/through-the-eyes-of-a-computer/image002.jpg b/blog/assets/img/through-the-eyes-of-a-computer/image002.jpg new file mode 100644 index 0000000..02f3c1a Binary files /dev/null and b/blog/assets/img/through-the-eyes-of-a-computer/image002.jpg differ diff --git a/blog/assets/img/through-the-eyes-of-a-computer/image003.jpg b/blog/assets/img/through-the-eyes-of-a-computer/image003.jpg new file mode 100644 index 0000000..025fff2 Binary files /dev/null and b/blog/assets/img/through-the-eyes-of-a-computer/image003.jpg differ diff --git a/blog/assets/img/through-the-eyes-of-a-computer/image004.jpg b/blog/assets/img/through-the-eyes-of-a-computer/image004.jpg new file mode 100644 index 0000000..5cff02e Binary files /dev/null and b/blog/assets/img/through-the-eyes-of-a-computer/image004.jpg differ diff --git a/blog/assets/img/vortices/1.jpg b/blog/assets/img/vortices/1.jpg new file mode 100644 index 0000000..ad94675 Binary files /dev/null and b/blog/assets/img/vortices/1.jpg differ diff --git a/blog/assets/img/vortices/2.PNG b/blog/assets/img/vortices/2.PNG new file mode 100644 index 0000000..d4ed0aa Binary files /dev/null and b/blog/assets/img/vortices/2.PNG differ diff --git a/blog/assets/img/vortices/3.PNG b/blog/assets/img/vortices/3.PNG new file mode 100644 index 0000000..4e16cb1 Binary files /dev/null and b/blog/assets/img/vortices/3.PNG differ diff --git a/blog/assets/img/vortices/4.PNG b/blog/assets/img/vortices/4.PNG new file mode 100644 index 0000000..ee341e8 Binary files /dev/null and b/blog/assets/img/vortices/4.PNG differ diff --git a/blog/assets/img/vortices/5.JPG b/blog/assets/img/vortices/5.JPG new file mode 100644 index 0000000..8dff8c8 Binary files /dev/null and b/blog/assets/img/vortices/5.JPG differ diff --git a/blog/assets/img/vortices/6.PNG b/blog/assets/img/vortices/6.PNG new file mode 100644 index 0000000..233f05b Binary files /dev/null and b/blog/assets/img/vortices/6.PNG differ diff --git a/blog/assets/img/vortices/7.PNG b/blog/assets/img/vortices/7.PNG new file mode 100644 index 0000000..14aafa3 Binary files /dev/null and b/blog/assets/img/vortices/7.PNG differ diff --git a/blog/assets/img/vortices/8.jpg b/blog/assets/img/vortices/8.jpg new file mode 100644 index 0000000..eac26b5 Binary files /dev/null and b/blog/assets/img/vortices/8.jpg differ diff --git a/blog/assets/img/washable-electonics/1.jpg b/blog/assets/img/washable-electonics/1.jpg new file mode 100644 index 0000000..1635fae Binary files /dev/null and b/blog/assets/img/washable-electonics/1.jpg differ diff --git a/blog/assets/img/water-jet-guided-laser-cutting/diagram.png b/blog/assets/img/water-jet-guided-laser-cutting/diagram.png new file mode 100644 index 0000000..1ab0c3e Binary files /dev/null and b/blog/assets/img/water-jet-guided-laser-cutting/diagram.png differ diff --git a/blog/assets/img/web-3-0/accountable.png b/blog/assets/img/web-3-0/accountable.png new file mode 100644 index 0000000..f68fd3e Binary files /dev/null and b/blog/assets/img/web-3-0/accountable.png differ diff --git a/blog/assets/img/web-3-0/alt.png b/blog/assets/img/web-3-0/alt.png new file mode 100644 index 0000000..2b98654 Binary files /dev/null and b/blog/assets/img/web-3-0/alt.png differ diff --git a/blog/assets/img/web-3-0/data_breach.png b/blog/assets/img/web-3-0/data_breach.png new file mode 100644 index 0000000..ab1872f Binary files /dev/null and b/blog/assets/img/web-3-0/data_breach.png differ diff --git a/blog/assets/img/web-3-0/data_own.jpg b/blog/assets/img/web-3-0/data_own.jpg new file mode 100644 index 0000000..5d914af Binary files /dev/null and b/blog/assets/img/web-3-0/data_own.jpg differ diff --git a/blog/assets/img/web-3-0/eth_stack.png b/blog/assets/img/web-3-0/eth_stack.png new file mode 100644 index 0000000..90edcb8 Binary files /dev/null and b/blog/assets/img/web-3-0/eth_stack.png differ diff --git a/blog/assets/img/web-3-0/eth_stack2.png b/blog/assets/img/web-3-0/eth_stack2.png new file mode 100644 index 0000000..ea1ba51 Binary files /dev/null and b/blog/assets/img/web-3-0/eth_stack2.png differ diff --git a/blog/assets/img/web-3-0/monoploy.jpg b/blog/assets/img/web-3-0/monoploy.jpg new file mode 100644 index 0000000..628d5fa Binary files /dev/null and b/blog/assets/img/web-3-0/monoploy.jpg differ diff --git a/blog/assets/img/web-3-0/monopoly2.jpg b/blog/assets/img/web-3-0/monopoly2.jpg new file mode 100644 index 0000000..a550b6d Binary files /dev/null and b/blog/assets/img/web-3-0/monopoly2.jpg differ diff --git a/blog/assets/img/websockets/image1.png b/blog/assets/img/websockets/image1.png new file mode 100644 index 0000000..b48410d Binary files /dev/null and b/blog/assets/img/websockets/image1.png differ diff --git a/blog/assets/img/websockets/image2.jpg b/blog/assets/img/websockets/image2.jpg new file mode 100644 index 0000000..7a024b1 Binary files /dev/null and b/blog/assets/img/websockets/image2.jpg differ diff --git a/blog/assets/img/websockets/image3.png b/blog/assets/img/websockets/image3.png new file mode 100644 index 0000000..5233dfe Binary files /dev/null and b/blog/assets/img/websockets/image3.png differ diff --git a/blog/assets/img/websockets/image4.png b/blog/assets/img/websockets/image4.png new file mode 100644 index 0000000..8e0d7e5 Binary files /dev/null and b/blog/assets/img/websockets/image4.png differ diff --git a/blog/assets/img/what-is-rl-capable-of/lee_sedol.jpeg b/blog/assets/img/what-is-rl-capable-of/lee_sedol.jpeg new file mode 100644 index 0000000..b307147 Binary files /dev/null and b/blog/assets/img/what-is-rl-capable-of/lee_sedol.jpeg differ diff --git a/blog/assets/img/what-is-rl-capable-of/marl.png b/blog/assets/img/what-is-rl-capable-of/marl.png new file mode 100644 index 0000000..21177f8 Binary files /dev/null and b/blog/assets/img/what-is-rl-capable-of/marl.png differ diff --git a/blog/assets/img/what-is-rl-capable-of/robot.jpg b/blog/assets/img/what-is-rl-capable-of/robot.jpg new file mode 100644 index 0000000..7ba1705 Binary files /dev/null and b/blog/assets/img/what-is-rl-capable-of/robot.jpg differ diff --git a/blog/assets/img/what-makes-a-smart-home-smart/Control.jpg b/blog/assets/img/what-makes-a-smart-home-smart/Control.jpg new file mode 100644 index 0000000..844c8d3 Binary files /dev/null and b/blog/assets/img/what-makes-a-smart-home-smart/Control.jpg differ diff --git a/blog/assets/img/what-makes-a-smart-home-smart/Smart homes.jpg b/blog/assets/img/what-makes-a-smart-home-smart/Smart homes.jpg new file mode 100644 index 0000000..a7e5240 Binary files /dev/null and b/blog/assets/img/what-makes-a-smart-home-smart/Smart homes.jpg differ diff --git a/blog/assets/img/why-50hz/image001.jpg b/blog/assets/img/why-50hz/image001.jpg new file mode 100644 index 0000000..9da9d6a Binary files /dev/null and b/blog/assets/img/why-50hz/image001.jpg differ diff --git a/blog/assets/img/why-50hz/image003.png b/blog/assets/img/why-50hz/image003.png new file mode 100644 index 0000000..780dced Binary files /dev/null and b/blog/assets/img/why-50hz/image003.png differ diff --git a/blog/assets/img/why-50hz/image005.jpg b/blog/assets/img/why-50hz/image005.jpg new file mode 100644 index 0000000..80c0cf2 Binary files /dev/null and b/blog/assets/img/why-50hz/image005.jpg differ diff --git a/blog/assets/img/why-50hz/image007.jpg b/blog/assets/img/why-50hz/image007.jpg new file mode 100644 index 0000000..49d5b17 Binary files /dev/null and b/blog/assets/img/why-50hz/image007.jpg differ diff --git a/blog/assets/img/why-50hz/image009.jpg b/blog/assets/img/why-50hz/image009.jpg new file mode 100644 index 0000000..b93bda6 Binary files /dev/null and b/blog/assets/img/why-50hz/image009.jpg differ diff --git a/blog/assets/img/why-do-GANs-matter/GAN_structure.png b/blog/assets/img/why-do-GANs-matter/GAN_structure.png new file mode 100644 index 0000000..0537ac0 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/GAN_structure.png differ diff --git a/blog/assets/img/why-do-GANs-matter/face_application.jpg b/blog/assets/img/why-do-GANs-matter/face_application.jpg new file mode 100644 index 0000000..8b170c3 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/face_application.jpg differ diff --git a/blog/assets/img/why-do-GANs-matter/policy_naive.gif b/blog/assets/img/why-do-GANs-matter/policy_naive.gif new file mode 100644 index 0000000..51d7236 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/policy_naive.gif differ diff --git a/blog/assets/img/why-do-GANs-matter/policy_with_VIME.gif b/blog/assets/img/why-do-GANs-matter/policy_with_VIME.gif new file mode 100644 index 0000000..8d003a8 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/policy_with_VIME.gif differ diff --git a/blog/assets/img/why-do-GANs-matter/subtopic1.png b/blog/assets/img/why-do-GANs-matter/subtopic1.png new file mode 100644 index 0000000..aa95a91 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/subtopic1.png differ diff --git a/blog/assets/img/why-do-GANs-matter/subtopic2.1.png b/blog/assets/img/why-do-GANs-matter/subtopic2.1.png new file mode 100644 index 0000000..37abdfa Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/subtopic2.1.png differ diff --git a/blog/assets/img/why-do-GANs-matter/subtopic2.2.png b/blog/assets/img/why-do-GANs-matter/subtopic2.2.png new file mode 100644 index 0000000..9ee3bc7 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/subtopic2.2.png differ diff --git a/blog/assets/img/why-do-GANs-matter/subtopic3.png b/blog/assets/img/why-do-GANs-matter/subtopic3.png new file mode 100644 index 0000000..8f7bbca Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/subtopic3.png differ diff --git a/blog/assets/img/why-do-GANs-matter/subtopic4.1.png b/blog/assets/img/why-do-GANs-matter/subtopic4.1.png new file mode 100644 index 0000000..5ee2778 Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/subtopic4.1.png differ diff --git a/blog/assets/img/why-do-GANs-matter/subtopic4.2.png b/blog/assets/img/why-do-GANs-matter/subtopic4.2.png new file mode 100644 index 0000000..1752bce Binary files /dev/null and b/blog/assets/img/why-do-GANs-matter/subtopic4.2.png differ diff --git a/blog/assets/img/why-not-chemical-engineering/chemical-engineering.jpg b/blog/assets/img/why-not-chemical-engineering/chemical-engineering.jpg new file mode 100644 index 0000000..2b2a4bc Binary files /dev/null and b/blog/assets/img/why-not-chemical-engineering/chemical-engineering.jpg differ diff --git a/blog/assets/img/why-python-shouldnt-be-your-first/python-logo.png b/blog/assets/img/why-python-shouldnt-be-your-first/python-logo.png new file mode 100644 index 0000000..eadb463 Binary files /dev/null and b/blog/assets/img/why-python-shouldnt-be-your-first/python-logo.png differ diff --git a/blog/assets/img/why-you-need-gpu/cpuvsgpu.jpg b/blog/assets/img/why-you-need-gpu/cpuvsgpu.jpg new file mode 100644 index 0000000..1686e92 Binary files /dev/null and b/blog/assets/img/why-you-need-gpu/cpuvsgpu.jpg differ diff --git a/blog/assets/img/why-you-need-gpu/flops.png b/blog/assets/img/why-you-need-gpu/flops.png new file mode 100644 index 0000000..04cdc02 Binary files /dev/null and b/blog/assets/img/why-you-need-gpu/flops.png differ diff --git a/blog/assets/img/why-you-need-gpu/nntrain.jpeg b/blog/assets/img/why-you-need-gpu/nntrain.jpeg new file mode 100644 index 0000000..b6081e1 Binary files /dev/null and b/blog/assets/img/why-you-need-gpu/nntrain.jpeg differ diff --git a/blog/assets/img/why-you-should-learn-flutter/hot_reload.gif b/blog/assets/img/why-you-should-learn-flutter/hot_reload.gif new file mode 100644 index 0000000..8c7c780 Binary files /dev/null and b/blog/assets/img/why-you-should-learn-flutter/hot_reload.gif differ diff --git a/blog/assets/img/why-you-should-learn-flutter/ios_android.png b/blog/assets/img/why-you-should-learn-flutter/ios_android.png new file mode 100644 index 0000000..6673652 Binary files /dev/null and b/blog/assets/img/why-you-should-learn-flutter/ios_android.png differ diff --git a/blog/assets/js/highlight.pack.js b/blog/assets/js/highlight.pack.js new file mode 100644 index 0000000..0f8d450 --- /dev/null +++ b/blog/assets/js/highlight.pack.js @@ -0,0 +1,3 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("django",function(e){var t={b:/\|[A-Za-z]+:?/,k:{name:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone"},c:[e.QSM,e.ASM]};return{aliases:["jinja"],cI:!0,sL:"xml",c:[e.C(/\{%\s*comment\s*%}/,/\{%\s*endcomment\s*%}/),e.C(/\{#/,/#}/),{cN:"template-tag",b:/\{%/,e:/%}/,c:[{cN:"name",b:/\w+/,k:{name:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim"},starts:{eW:!0,k:"in by as",c:[t],r:0}}]},{cN:"template-variable",b:/\{\{/,e:/}}/,c:[t]}]}});hljs.registerLanguage("avrasm",function(r){return{cI:!0,l:"\\.?"+r.IR,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf",meta:".byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list .listmac .macro .nolist .org .set"},c:[r.CBCM,r.C(";","$",{r:0}),r.CNM,r.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},r.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"symbol",b:"^[A-Za-z0-9_.$]+:"},{cN:"meta",b:"#",e:"$"},{cN:"subst",b:"@[0-9]+"}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},_={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:_,l:i,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:i,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[c]},{b:/(fr|rf|f)"/,e:/"/,c:[c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},r={cN:"literal",b:/\$(null|true|false)\b/},n={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},a={cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},i={cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]},s=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[i]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Add-MDTPersistentDrive Disable-MDTMonitorService Enable-MDTMonitorService Get-MDTDeploymentShareStatistics Get-MDTMonitorData Get-MDTOperatingSystemCatalog Get-MDTPersistentDrive Import-MDTApplication Import-MDTDriver Import-MDTOperatingSystem Import-MDTPackage Import-MDTTaskSequence New-MDTDatabase Remove-MDTMonitorData Remove-MDTPersistentDrive Restore-MDTPersistentDrive Set-MDTMonitorData Test-MDTDeploymentShare Test-MDTMonitorData Update-MDTDatabaseSchema Update-MDTDeploymentShare Update-MDTLinkedDS Update-MDTMedia Update-MDTMedia Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,n,a,r,o,s]}});hljs.registerLanguage("dart",function(e){var t={cN:"subst",b:"\\$\\{",e:"}",k:"true false null this is new super"},r={cN:"string",v:[{b:"r'''",e:"'''"},{b:'r"""',e:'"""'},{b:"r'",e:"'",i:"\\n"},{b:'r"',e:'"',i:"\\n"},{b:"'''",e:"'''",c:[e.BE,t]},{b:'"""',e:'"""',c:[e.BE,t]},{b:"'",e:"'",i:"\\n",c:[e.BE,t]},{b:'"',e:'"',i:"\\n",c:[e.BE,t]}]};t.c=[e.CNM,r];var n={keyword:"assert async await break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch sync this throw true try var void while with yield abstract as dynamic export external factory get implements import library operator part set static typedef",built_in:"print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num document window querySelector querySelectorAll Element ElementList"};return{k:n,c:[r,e.C("/\\*\\*","\\*/",{sL:"markdown"}),e.C("///","$",{sL:"markdown"}),e.CLCM,e.CBCM,{cN:"class",bK:"class interface",e:"{",eE:!0,c:[{bK:"extends implements"},e.UTM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"},{b:"=>"}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("verilog",function(e){var n={keyword:"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind bins binsof bit break buf|0 bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin function generate|5 genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import incdir include initial inout input inside instance int integer interconnect interface intersect join join_any join_none large let liblist library local localparam logic longint macromodule matches medium modport module nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 or output package packed parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor",literal:"null",built_in:"$finish $stop $exit $fatal $error $warning $info $realtime $time $printtimescale $bitstoreal $bitstoshortreal $itor $signed $cast $bits $stime $timeformat $realtobits $shortrealtobits $rtoi $unsigned $asserton $assertkill $assertpasson $assertfailon $assertnonvacuouson $assertoff $assertcontrol $assertpassoff $assertfailoff $assertvacuousoff $isunbounded $sampled $fell $changed $past_gclk $fell_gclk $changed_gclk $rising_gclk $steady_gclk $coverage_control $coverage_get $coverage_save $set_coverage_db_name $rose $stable $past $rose_gclk $stable_gclk $future_gclk $falling_gclk $changing_gclk $display $coverage_get_max $coverage_merge $get_coverage $load_coverage_db $typename $unpacked_dimensions $left $low $increment $clog2 $ln $log10 $exp $sqrt $pow $floor $ceil $sin $cos $tan $countbits $onehot $isunknown $fatal $warning $dimensions $right $high $size $asin $acos $atan $atan2 $hypot $sinh $cosh $tanh $asinh $acosh $atanh $countones $onehot0 $error $info $random $dist_chi_square $dist_erlang $dist_exponential $dist_normal $dist_poisson $dist_t $dist_uniform $q_initialize $q_remove $q_exam $async$and$array $async$nand$array $async$or$array $async$nor$array $sync$and$array $sync$nand$array $sync$or$array $sync$nor$array $q_add $q_full $psprintf $async$and$plane $async$nand$plane $async$or$plane $async$nor$plane $sync$and$plane $sync$nand$plane $sync$or$plane $sync$nor$plane $system $display $displayb $displayh $displayo $strobe $strobeb $strobeh $strobeo $write $readmemb $readmemh $writememh $value$plusargs $dumpvars $dumpon $dumplimit $dumpports $dumpportson $dumpportslimit $writeb $writeh $writeo $monitor $monitorb $monitorh $monitoro $writememb $dumpfile $dumpoff $dumpall $dumpflush $dumpportsoff $dumpportsall $dumpportsflush $fclose $fdisplay $fdisplayb $fdisplayh $fdisplayo $fstrobe $fstrobeb $fstrobeh $fstrobeo $swrite $swriteb $swriteh $swriteo $fscanf $fread $fseek $fflush $feof $fopen $fwrite $fwriteb $fwriteh $fwriteo $fmonitor $fmonitorb $fmonitorh $fmonitoro $sformat $sformatf $fgetc $ungetc $fgets $sscanf $rewind $ftell $ferror"};return{aliases:["v","sv","svh"],cI:!1,k:n,l:/[\w\$]+/,c:[e.CBCM,e.CLCM,e.QSM,{cN:"number",c:[e.BE],v:[{b:"\\b((\\d+'(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{b:"\\B(('(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{b:"\\b([0-9_])+",r:0}]},{cN:"variable",v:[{b:"#\\((?!parameter).+\\)"},{b:"\\.\\w+",r:0}]},{cN:"meta",b:"`",e:"$",k:{"meta-keyword":"define __FILE__ __LINE__ begin_keywords celldefine default_nettype define else elsif end_keywords endcelldefine endif ifdef ifndef include line nounconnected_drive pragma resetall timescale unconnected_drive undef undefineall"},r:0}]}});hljs.registerLanguage("mathematica",function(e){return{aliases:["mma"],l:"(\\$|\\b)"+e.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber", +c:[{cN:"comment",b:/\(\*/,e:/\*\)/},e.ASM,e.QSM,e.CNM,{b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U)?L?"',e:'"',i:"\\n",c:[t.BE]},{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("arduino",function(e){var t=e.getLanguage("cpp").exports;return{k:{keyword:"boolean byte word string String array "+t.k.keyword,built_in:"setup loop while catch for if do goto try switch case else default break continue return KeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",literal:"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW"},c:[t.preprocessor,e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("vhdl",function(e){var r="\\d(_|\\d)*",t="[eE][-+]?"+r,n=r+"(\\."+r+")?("+t+")?",o="\\w+",i=r+"#"+o+"(\\."+o+")?#("+t+")?",a="\\b("+i+"|"+n+")";return{cI:!0,k:{keyword:"abs access after alias all and architecture array assert assume assume_guarantee attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",built_in:"boolean bit character integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_logic std_logic_vector unsigned signed boolean_vector integer_vector std_ulogic std_ulogic_vector unresolved_unsigned u_unsigned unresolved_signed u_signedreal_vector time_vector",literal:"false true note warning error failure line text side width"},i:"{",c:[e.CBCM,e.C("--","$"),e.QSM,{cN:"number",b:a,r:0},{cN:"string",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[e.BE]},{cN:"symbol",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[e.BE]}]}});hljs.registerLanguage("scilab",function(e){var s=[e.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[e.BE,{b:"''"}]}];return{aliases:["sci"],l:/%?\w+/,k:{keyword:"abort break case clear catch continue do elseif else endfunction end for function global if pause return resume select try then while",literal:"%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan type typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},{b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{b:"\\[",e:"\\]'*[\\.']*",r:0,c:s},e.C("//","$")].concat(s)}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:o}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:e.IR},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:["self",e.CLCM,e.CBCM]}]}]}],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:r,c:["self",e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/%/,r:0},{bK:"constructor",e:/\{/,eE:!0,c:["self",{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}]},{b:/module\./,k:{built_in:"module"},r:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("armasm",function(s){return{cI:!0,aliases:["arm"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},c:[{cN:"keyword",b:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?",e:"\\s"},s.C("[;@]","$",{r:0}),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"[#$=]?0x[0-9a-f]+"},{b:"[#$=]?0b[01]+"},{b:"[#$=]\\d+"},{b:"\\b\\d+"}],r:0},{cN:"symbol",v:[{b:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"[=#]\\w+"}],r:0}]}});hljs.registerLanguage("java",function(e){var a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",t=a+"(<"+a+"(\\s*,\\s*"+a+")*>)?",r="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("swift",function(e){var i={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},t={cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:i,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:i,c:[o,e.CLCM,n,t,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:i,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:i,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u,l.c[1].c=u;var h={cN:"params",b:"\\(",e:"\\)",c:u};return{aliases:["erl"],k:b,i:"(",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},t={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},r=e.inherit(t,{i:/\n/}),a={cN:"subst",b:"{",e:"}",k:i},c=e.inherit(a,{i:/\n/}),n={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,c]},s={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},a]},o=e.inherit(s,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},c]});a.c=[s,n,t,e.ASM,e.QSM,e.CNM,e.CBCM],c.c=[o,n,r,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[s,n,t,e.ASM,e.QSM]},b=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+b+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}}); \ No newline at end of file diff --git a/blog/assets/js/main-old.js b/blog/assets/js/main-old.js new file mode 100644 index 0000000..bb380d6 --- /dev/null +++ b/blog/assets/js/main-old.js @@ -0,0 +1,1237 @@ +var Zepto = function() { + function t(t) { + return null == t ? String(t) : B[V.call(t)] || "object" + } + + function e(e) { + return "function" == t(e) + } + + function n(t) { + return null != t && t == t.window + } + + function r(t) { + return null != t && t.nodeType == t.DOCUMENT_NODE + } + + function i(e) { + return "object" == t(e) + } + + function o(t) { + return i(t) && !n(t) && Object.getPrototypeOf(t) == Object.prototype + } + + function a(t) { + return "number" == typeof t.length + } + + function s(t) { + return P.call(t, function(t) { + return null != t + }) + } + + function c(t) { + return t.length > 0 ? j.fn.concat.apply([], t) : t + } + + function u(t) { + return t.replace(/::/g, "/").replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2").replace(/([a-z\d])([A-Z])/g, "$1_$2").replace(/_/g, "-").toLowerCase() + } + + function l(t) { + return t in R ? R[t] : R[t] = new RegExp("(^|\\s)" + t + "(\\s|$)") + } + + function f(t, e) { + return "number" != typeof e || k[u(t)] ? e : e + "px" + } + + function h(t) { + var e, n; + return L[t] || (e = A.createElement(t), A.body.appendChild(e), n = getComputedStyle(e, "").getPropertyValue("display"), e.parentNode.removeChild(e), "none" == n && (n = "block"), L[t] = n), L[t] + } + + function p(t) { + return "children" in t ? N.call(t.children) : j.map(t.childNodes, function(t) { + return 1 == t.nodeType ? t : void 0 + }) + } + + function d(t, e, n) { + for (E in e) n && (o(e[E]) || W(e[E])) ? (o(e[E]) && !o(t[E]) && (t[E] = {}), W(e[E]) && !W(t[E]) && (t[E] = []), d(t[E], e[E], n)) : e[E] !== w && (t[E] = e[E]) + } + + function m(t, e) { + return null == e ? j(t) : j(t).filter(e) + } + + function g(t, n, r, i) { + return e(n) ? n.call(t, r, i) : n + } + + function v(t, e, n) { + null == n ? t.removeAttribute(e) : t.setAttribute(e, n) + } + + function y(t, e) { + var n = t.className || "", + r = n && n.baseVal !== w; + return e === w ? r ? n.baseVal : n : void(r ? n.baseVal = e : t.className = e) + } + + function b(t) { + try { + return t ? "true" == t || ("false" == t ? !1 : "null" == t ? null : +t + "" == t ? +t : /^[\[\{]/.test(t) ? j.parseJSON(t) : t) : t + } catch (e) { + return t + } + } + + function x(t, e) { + e(t); + for (var n = 0, r = t.childNodes.length; r > n; n++) x(t.childNodes[n], e) + } + var w, E, j, S, C, O, T = [], + N = T.slice, + P = T.filter, + A = window.document, + L = {}, + R = {}, + k = { + "column-count": 1, + columns: 1, + "font-weight": 1, + "line-height": 1, + opacity: 1, + "z-index": 1, + zoom: 1 + }, + I = /^\s*<(\w+|!)[^>]*>/, + Z = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + H = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + _ = /^(?:body|html)$/i, + D = /([A-Z])/g, + $ = ["val", "css", "html", "text", "data", "width", "height", "offset"], + F = ["after", "prepend", "before", "append"], + M = A.createElement("table"), + q = A.createElement("tr"), + z = { + tr: A.createElement("tbody"), + tbody: M, + thead: M, + tfoot: M, + td: q, + th: q, + "*": A.createElement("div") + }, + J = /complete|loaded|interactive/, + U = /^[\w-]*$/, + B = {}, + V = B.toString, + Q = {}, + X = A.createElement("div"), + Y = { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + W = Array.isArray || function(t) { + return t instanceof Array + }; + return Q.matches = function(t, e) { + if (!e || !t || 1 !== t.nodeType) return !1; + var n = t.webkitMatchesSelector || t.mozMatchesSelector || t.oMatchesSelector || t.matchesSelector; + if (n) return n.call(t, e); + var r, i = t.parentNode, + o = !i; + return o && (i = X).appendChild(t), r = ~Q.qsa(i, e).indexOf(t), o && X.removeChild(t), r + }, C = function(t) { + return t.replace(/-+(.)?/g, function(t, e) { + return e ? e.toUpperCase() : "" + }) + }, O = function(t) { + return P.call(t, function(e, n) { + return t.indexOf(e) == n + }) + }, Q.fragment = function(t, e, n) { + var r, i, a; + return Z.test(t) && (r = j(A.createElement(RegExp.$1))), r || (t.replace && (t = t.replace(H, "<$1>")), e === w && (e = I.test(t) && RegExp.$1), e in z || (e = "*"), a = z[e], a.innerHTML = "" + t, r = j.each(N.call(a.childNodes), function() { + a.removeChild(this) + })), o(n) && (i = j(r), j.each(n, function(t, e) { + $.indexOf(t) > -1 ? i[t](e) : i.attr(t, e) + })), r + }, Q.Z = function(t, e) { + return t = t || [], t.__proto__ = j.fn, t.selector = e || "", t + }, Q.isZ = function(t) { + return t instanceof Q.Z + }, Q.init = function(t, n) { + var r; + if (!t) return Q.Z(); + if ("string" == typeof t) + if (t = t.trim(), "<" == t[0] && I.test(t)) r = Q.fragment(t, RegExp.$1, n), t = null; + else { + if (n !== w) return j(n).find(t); + r = Q.qsa(A, t) + } + else { + if (e(t)) return j(A).ready(t); + if (Q.isZ(t)) return t; + if (W(t)) r = s(t); + else if (i(t)) r = [t], t = null; + else if (I.test(t)) r = Q.fragment(t.trim(), RegExp.$1, n), t = null; + else { + if (n !== w) return j(n).find(t); + r = Q.qsa(A, t) + } + } + return Q.Z(r, t) + }, j = function(t, e) { + return Q.init(t, e) + }, j.extend = function(t) { + var e, n = N.call(arguments, 1); + return "boolean" == typeof t && (e = t, t = n.shift()), n.forEach(function(n) { + d(t, n, e) + }), t + }, Q.qsa = function(t, e) { + var n, i = "#" == e[0], + o = !i && "." == e[0], + a = i || o ? e.slice(1) : e, + s = U.test(a); + return r(t) && s && i ? (n = t.getElementById(a)) ? [n] : [] : 1 !== t.nodeType && 9 !== t.nodeType ? [] : N.call(s && !i ? o ? t.getElementsByClassName(a) : t.getElementsByTagName(e) : t.querySelectorAll(e)) + }, j.contains = A.documentElement.contains ? function(t, e) { + return t !== e && t.contains(e) + } : function(t, e) { + for (; e && (e = e.parentNode);) + if (e === t) return !0; + return !1 + }, j.type = t, j.isFunction = e, j.isWindow = n, j.isArray = W, j.isPlainObject = o, j.isEmptyObject = function(t) { + var e; + for (e in t) return !1; + return !0 + }, j.inArray = function(t, e, n) { + return T.indexOf.call(e, t, n) + }, j.camelCase = C, j.trim = function(t) { + return null == t ? "" : String.prototype.trim.call(t) + }, j.uuid = 0, j.support = {}, j.expr = {}, j.map = function(t, e) { + var n, r, i, o = []; + if (a(t)) + for (r = 0; r < t.length; r++) n = e(t[r], r), null != n && o.push(n); + else + for (i in t) n = e(t[i], i), null != n && o.push(n); + return c(o) + }, j.each = function(t, e) { + var n, r; + if (a(t)) { + for (n = 0; n < t.length; n++) + if (e.call(t[n], n, t[n]) === !1) return t + } else + for (r in t) + if (e.call(t[r], r, t[r]) === !1) return t; + return t + }, j.grep = function(t, e) { + return P.call(t, e) + }, window.JSON && (j.parseJSON = JSON.parse), j.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(t, e) { + B["[object " + e + "]"] = e.toLowerCase() + }), j.fn = { + forEach: T.forEach, + reduce: T.reduce, + push: T.push, + sort: T.sort, + indexOf: T.indexOf, + concat: T.concat, + map: function(t) { + return j(j.map(this, function(e, n) { + return t.call(e, n, e) + })) + }, + slice: function() { + return j(N.apply(this, arguments)) + }, + ready: function(t) { + return J.test(A.readyState) && A.body ? t(j) : A.addEventListener("DOMContentLoaded", function() { + t(j) + }, !1), this + }, + get: function(t) { + return t === w ? N.call(this) : this[t >= 0 ? t : t + this.length] + }, + toArray: function() { + return this.get() + }, + size: function() { + return this.length + }, + remove: function() { + return this.each(function() { + null != this.parentNode && this.parentNode.removeChild(this) + }) + }, + each: function(t) { + return T.every.call(this, function(e, n) { + return t.call(e, n, e) !== !1 + }), this + }, + filter: function(t) { + return e(t) ? this.not(this.not(t)) : j(P.call(this, function(e) { + return Q.matches(e, t) + })) + }, + add: function(t, e) { + return j(O(this.concat(j(t, e)))) + }, + is: function(t) { + return this.length > 0 && Q.matches(this[0], t) + }, + not: function(t) { + var n = []; + if (e(t) && t.call !== w) this.each(function(e) { + t.call(this, e) || n.push(this) + }); + else { + var r = "string" == typeof t ? this.filter(t) : a(t) && e(t.item) ? N.call(t) : j(t); + this.forEach(function(t) { + r.indexOf(t) < 0 && n.push(t) + }) + } + return j(n) + }, + has: function(t) { + return this.filter(function() { + return i(t) ? j.contains(this, t) : j(this).find(t).size() + }) + }, + eq: function(t) { + return -1 === t ? this.slice(t) : this.slice(t, +t + 1) + }, + first: function() { + var t = this[0]; + return t && !i(t) ? t : j(t) + }, + last: function() { + var t = this[this.length - 1]; + return t && !i(t) ? t : j(t) + }, + find: function(t) { + var e, n = this; + return e = t ? "object" == typeof t ? j(t).filter(function() { + var t = this; + return T.some.call(n, function(e) { + return j.contains(e, t) + }) + }) : 1 == this.length ? j(Q.qsa(this[0], t)) : this.map(function() { + return Q.qsa(this, t) + }) : j() + }, + closest: function(t, e) { + var n = this[0], + i = !1; + for ("object" == typeof t && (i = j(t)); n && !(i ? i.indexOf(n) >= 0 : Q.matches(n, t));) n = n !== e && !r(n) && n.parentNode; + return j(n) + }, + parents: function(t) { + for (var e = [], n = this; n.length > 0;) n = j.map(n, function(t) { + return (t = t.parentNode) && !r(t) && e.indexOf(t) < 0 ? (e.push(t), t) : void 0 + }); + return m(e, t) + }, + parent: function(t) { + return m(O(this.pluck("parentNode")), t) + }, + children: function(t) { + return m(this.map(function() { + return p(this) + }), t) + }, + contents: function() { + return this.map(function() { + return N.call(this.childNodes) + }) + }, + siblings: function(t) { + return m(this.map(function(t, e) { + return P.call(p(e.parentNode), function(t) { + return t !== e + }) + }), t) + }, + empty: function() { + return this.each(function() { + this.innerHTML = "" + }) + }, + pluck: function(t) { + return j.map(this, function(e) { + return e[t] + }) + }, + show: function() { + return this.each(function() { + "none" == this.style.display && (this.style.display = ""), "none" == getComputedStyle(this, "").getPropertyValue("display") && (this.style.display = h(this.nodeName)) + }) + }, + replaceWith: function(t) { + return this.before(t).remove() + }, + wrap: function(t) { + var n = e(t); + if (this[0] && !n) var r = j(t).get(0), + i = r.parentNode || this.length > 1; + return this.each(function(e) { + j(this).wrapAll(n ? t.call(this, e) : i ? r.cloneNode(!0) : r) + }) + }, + wrapAll: function(t) { + if (this[0]) { + j(this[0]).before(t = j(t)); + for (var e; + (e = t.children()).length;) t = e.first(); + j(t).append(this) + } + return this + }, + wrapInner: function(t) { + var n = e(t); + return this.each(function(e) { + var r = j(this), + i = r.contents(), + o = n ? t.call(this, e) : t; + i.length ? i.wrapAll(o) : r.append(o) + }) + }, + unwrap: function() { + return this.parent().each(function() { + j(this).replaceWith(j(this).children()) + }), this + }, + clone: function() { + return this.map(function() { + return this.cloneNode(!0) + }) + }, + hide: function() { + return this.css("display", "none") + }, + toggle: function(t) { + return this.each(function() { + var e = j(this); + (t === w ? "none" == e.css("display") : t) ? e.show(): e.hide() + }) + }, + prev: function(t) { + return j(this.pluck("previousElementSibling")).filter(t || "*") + }, + next: function(t) { + return j(this.pluck("nextElementSibling")).filter(t || "*") + }, + html: function(t) { + return 0 in arguments ? this.each(function(e) { + var n = this.innerHTML; + j(this).empty().append(g(this, t, e, n)) + }) : 0 in this ? this[0].innerHTML : null + }, + text: function(t) { + return 0 in arguments ? this.each(function(e) { + var n = g(this, t, e, this.textContent); + this.textContent = null == n ? "" : "" + n + }) : 0 in this ? this[0].textContent : null + }, + attr: function(t, e) { + var n; + return "string" != typeof t || 1 in arguments ? this.each(function(n) { + if (1 === this.nodeType) + if (i(t)) + for (E in t) v(this, E, t[E]); + else v(this, t, g(this, e, n, this.getAttribute(t))) + }) : this.length && 1 === this[0].nodeType ? !(n = this[0].getAttribute(t)) && t in this[0] ? this[0][t] : n : w + }, + removeAttr: function(t) { + return this.each(function() { + 1 === this.nodeType && t.split(" ").forEach(function(t) { + v(this, t) + }, this) + }) + }, + prop: function(t, e) { + return t = Y[t] || t, 1 in arguments ? this.each(function(n) { + this[t] = g(this, e, n, this[t]) + }) : this[0] && this[0][t] + }, + data: function(t, e) { + var n = "data-" + t.replace(D, "-$1").toLowerCase(), + r = 1 in arguments ? this.attr(n, e) : this.attr(n); + return null !== r ? b(r) : w + }, + val: function(t) { + return 0 in arguments ? this.each(function(e) { + this.value = g(this, t, e, this.value) + }) : this[0] && (this[0].multiple ? j(this[0]).find("option").filter(function() { + return this.selected + }).pluck("value") : this[0].value) + }, + offset: function(t) { + if (t) return this.each(function(e) { + var n = j(this), + r = g(this, t, e, n.offset()), + i = n.offsetParent().offset(), + o = { + top: r.top - i.top, + left: r.left - i.left + }; + "static" == n.css("position") && (o.position = "relative"), n.css(o) + }); + if (!this.length) return null; + var e = this[0].getBoundingClientRect(); + return { + left: e.left + window.pageXOffset, + top: e.top + window.pageYOffset, + width: Math.round(e.width), + height: Math.round(e.height) + } + }, + css: function(e, n) { + if (arguments.length < 2) { + var r, i = this[0]; + if (!i) return; + if (r = getComputedStyle(i, ""), "string" == typeof e) return i.style[C(e)] || r.getPropertyValue(e); + if (W(e)) { + var o = {}; + return j.each(e, function(t, e) { + o[e] = i.style[C(e)] || r.getPropertyValue(e) + }), o + } + } + var a = ""; + if ("string" == t(e)) n || 0 === n ? a = u(e) + ":" + f(e, n) : this.each(function() { + this.style.removeProperty(u(e)) + }); + else + for (E in e) e[E] || 0 === e[E] ? a += u(E) + ":" + f(E, e[E]) + ";" : this.each(function() { + this.style.removeProperty(u(E)) + }); + return this.each(function() { + this.style.cssText += ";" + a + }) + }, + index: function(t) { + return t ? this.indexOf(j(t)[0]) : this.parent().children().indexOf(this[0]) + }, + hasClass: function(t) { + return t ? T.some.call(this, function(t) { + return this.test(y(t)) + }, l(t)) : !1 + }, + addClass: function(t) { + return t ? this.each(function(e) { + if ("className" in this) { + S = []; + var n = y(this), + r = g(this, t, e, n); + r.split(/\s+/g).forEach(function(t) { + j(this).hasClass(t) || S.push(t) + }, this), S.length && y(this, n + (n ? " " : "") + S.join(" ")) + } + }) : this + }, + removeClass: function(t) { + return this.each(function(e) { + if ("className" in this) { + if (t === w) return y(this, ""); + S = y(this), g(this, t, e, S).split(/\s+/g).forEach(function(t) { + S = S.replace(l(t), " ") + }), y(this, S.trim()) + } + }) + }, + toggleClass: function(t, e) { + return t ? this.each(function(n) { + var r = j(this), + i = g(this, t, n, y(this)); + i.split(/\s+/g).forEach(function(t) { + (e === w ? !r.hasClass(t) : e) ? r.addClass(t): r.removeClass(t) + }) + }) : this + }, + scrollTop: function(t) { + if (this.length) { + var e = "scrollTop" in this[0]; + return t === w ? e ? this[0].scrollTop : this[0].pageYOffset : this.each(e ? function() { + this.scrollTop = t + } : function() { + this.scrollTo(this.scrollX, t) + }) + } + }, + scrollLeft: function(t) { + if (this.length) { + var e = "scrollLeft" in this[0]; + return t === w ? e ? this[0].scrollLeft : this[0].pageXOffset : this.each(e ? function() { + this.scrollLeft = t + } : function() { + this.scrollTo(t, this.scrollY) + }) + } + }, + position: function() { + if (this.length) { + var t = this[0], + e = this.offsetParent(), + n = this.offset(), + r = _.test(e[0].nodeName) ? { + top: 0, + left: 0 + } : e.offset(); + return n.top -= parseFloat(j(t).css("margin-top")) || 0, n.left -= parseFloat(j(t).css("margin-left")) || 0, r.top += parseFloat(j(e[0]).css("border-top-width")) || 0, r.left += parseFloat(j(e[0]).css("border-left-width")) || 0, { + top: n.top - r.top, + left: n.left - r.left + } + } + }, + offsetParent: function() { + return this.map(function() { + for (var t = this.offsetParent || A.body; t && !_.test(t.nodeName) && "static" == j(t).css("position");) t = t.offsetParent; + return t + }) + } + }, j.fn.detach = j.fn.remove, ["width", "height"].forEach(function(t) { + var e = t.replace(/./, function(t) { + return t[0].toUpperCase() + }); + j.fn[t] = function(i) { + var o, a = this[0]; + return i === w ? n(a) ? a["inner" + e] : r(a) ? a.documentElement["scroll" + e] : (o = this.offset()) && o[t] : this.each(function(e) { + a = j(this), a.css(t, g(this, i, e, a[t]())) + }) + } + }), F.forEach(function(e, n) { + var r = n % 2; + j.fn[e] = function() { + var e, i, o = j.map(arguments, function(n) { + return e = t(n), "object" == e || "array" == e || null == n ? n : Q.fragment(n) + }), + a = this.length > 1; + return o.length < 1 ? this : this.each(function(t, e) { + i = r ? e : e.parentNode, e = 0 == n ? e.nextSibling : 1 == n ? e.firstChild : 2 == n ? e : null; + var s = j.contains(A.documentElement, i); + o.forEach(function(t) { + if (a) t = t.cloneNode(!0); + else if (!i) return j(t).remove(); + i.insertBefore(t, e), s && x(t, function(t) { + null == t.nodeName || "SCRIPT" !== t.nodeName.toUpperCase() || t.type && "text/javascript" !== t.type || t.src || window.eval.call(window, t.innerHTML) + }) + }) + }) + }, j.fn[r ? e + "To" : "insert" + (n ? "Before" : "After")] = function(t) { + return j(t)[e](this), this + } + }), Q.Z.prototype = j.fn, Q.uniq = O, Q.deserializeValue = b, j.zepto = Q, j +}(); +window.Zepto = Zepto, void 0 === window.$ && (window.$ = Zepto), + function(t) { + function e(t) { + return t._zid || (t._zid = h++) + } + + function n(t, n, o, a) { + if (n = r(n), n.ns) var s = i(n.ns); + return (g[e(t)] || []).filter(function(t) { + return !(!t || n.e && t.e != n.e || n.ns && !s.test(t.ns) || o && e(t.fn) !== e(o) || a && t.sel != a) + }) + } + + function r(t) { + var e = ("" + t).split("."); + return { + e: e[0], + ns: e.slice(1).sort().join(" ") + } + } + + function i(t) { + return new RegExp("(?:^| )" + t.replace(" ", " .* ?") + "(?: |$)") + } + + function o(t, e) { + return t.del && !y && t.e in b || !!e + } + + function a(t) { + return x[t] || y && b[t] || t + } + + function s(n, i, s, c, l, h, p) { + var d = e(n), + m = g[d] || (g[d] = []); + i.split(/\s/).forEach(function(e) { + if ("ready" == e) return t(document).ready(s); + var i = r(e); + i.fn = s, i.sel = l, i.e in x && (s = function(e) { + var n = e.relatedTarget; + return !n || n !== this && !t.contains(this, n) ? i.fn.apply(this, arguments) : void 0 + }), i.del = h; + var d = h || s; + i.proxy = function(t) { + if (t = u(t), !t.isImmediatePropagationStopped()) { + t.data = c; + var e = d.apply(n, t._args == f ? [t] : [t].concat(t._args)); + return e === !1 && (t.preventDefault(), t.stopPropagation()), e + } + }, i.i = m.length, m.push(i), "addEventListener" in n && n.addEventListener(a(i.e), i.proxy, o(i, p)) + }) + } + + function c(t, r, i, s, c) { + var u = e(t); + (r || "").split(/\s/).forEach(function(e) { + n(t, e, i, s).forEach(function(e) { + delete g[u][e.i], "removeEventListener" in t && t.removeEventListener(a(e.e), e.proxy, o(e, c)) + }) + }) + } + + function u(e, n) { + return (n || !e.isDefaultPrevented) && (n || (n = e), t.each(S, function(t, r) { + var i = n[t]; + e[t] = function() { + return this[r] = w, i && i.apply(n, arguments) + }, e[r] = E + }), (n.defaultPrevented !== f ? n.defaultPrevented : "returnValue" in n ? n.returnValue === !1 : n.getPreventDefault && n.getPreventDefault()) && (e.isDefaultPrevented = w)), e + } + + function l(t) { + var e, n = { + originalEvent: t + }; + for (e in t) j.test(e) || t[e] === f || (n[e] = t[e]); + return u(n, t) + } + var f, h = 1, + p = Array.prototype.slice, + d = t.isFunction, + m = function(t) { + return "string" == typeof t + }, + g = {}, + v = {}, + y = "onfocusin" in window, + b = { + focus: "focusin", + blur: "focusout" + }, + x = { + mouseenter: "mouseover", + mouseleave: "mouseout" + }; + v.click = v.mousedown = v.mouseup = v.mousemove = "MouseEvents", t.event = { + add: s, + remove: c + }, t.proxy = function(n, r) { + var i = 2 in arguments && p.call(arguments, 2); + if (d(n)) { + var o = function() { + return n.apply(r, i ? i.concat(p.call(arguments)) : arguments) + }; + return o._zid = e(n), o + } + if (m(r)) return i ? (i.unshift(n[r], n), t.proxy.apply(null, i)) : t.proxy(n[r], n); + throw new TypeError("expected function") + }, t.fn.bind = function(t, e, n) { + return this.on(t, e, n) + }, t.fn.unbind = function(t, e) { + return this.off(t, e) + }, t.fn.one = function(t, e, n, r) { + return this.on(t, e, n, r, 1) + }; + var w = function() { + return !0 + }, + E = function() { + return !1 + }, + j = /^([A-Z]|returnValue$|layer[XY]$)/, + S = { + preventDefault: "isDefaultPrevented", + stopImmediatePropagation: "isImmediatePropagationStopped", + stopPropagation: "isPropagationStopped" + }; + t.fn.delegate = function(t, e, n) { + return this.on(e, t, n) + }, t.fn.undelegate = function(t, e, n) { + return this.off(e, t, n) + }, t.fn.live = function(e, n) { + return t(document.body).delegate(this.selector, e, n), this + }, t.fn.die = function(e, n) { + return t(document.body).undelegate(this.selector, e, n), this + }, t.fn.on = function(e, n, r, i, o) { + var a, u, h = this; + return e && !m(e) ? (t.each(e, function(t, e) { + h.on(t, n, r, e, o) + }), h) : (m(n) || d(i) || i === !1 || (i = r, r = n, n = f), (d(r) || r === !1) && (i = r, r = f), i === !1 && (i = E), h.each(function(f, h) { + o && (a = function(t) { + return c(h, t.type, i), i.apply(this, arguments) + }), n && (u = function(e) { + var r, o = t(e.target).closest(n, h).get(0); + return o && o !== h ? (r = t.extend(l(e), { + currentTarget: o, + liveFired: h + }), (a || i).apply(o, [r].concat(p.call(arguments, 1)))) : void 0 + }), s(h, e, i, r, n, u || a) + })) + }, t.fn.off = function(e, n, r) { + var i = this; + return e && !m(e) ? (t.each(e, function(t, e) { + i.off(t, n, e) + }), i) : (m(n) || d(r) || r === !1 || (r = n, n = f), r === !1 && (r = E), i.each(function() { + c(this, e, r, n) + })) + }, t.fn.trigger = function(e, n) { + return e = m(e) || t.isPlainObject(e) ? t.Event(e) : u(e), e._args = n, this.each(function() { + e.type in b && "function" == typeof this[e.type] ? this[e.type]() : "dispatchEvent" in this ? this.dispatchEvent(e) : t(this).triggerHandler(e, n) + }) + }, t.fn.triggerHandler = function(e, r) { + var i, o; + return this.each(function(a, s) { + i = l(m(e) ? t.Event(e) : e), i._args = r, i.target = s, t.each(n(s, e.type || e), function(t, e) { + return o = e.proxy(i), i.isImmediatePropagationStopped() ? !1 : void 0 + }) + }), o + }, "focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e) { + t.fn[e] = function(t) { + return 0 in arguments ? this.bind(e, t) : this.trigger(e) + } + }), t.Event = function(t, e) { + m(t) || (e = t, t = e.type); + var n = document.createEvent(v[t] || "Events"), + r = !0; + if (e) + for (var i in e) "bubbles" == i ? r = !!e[i] : n[i] = e[i]; + return n.initEvent(t, r, !0), u(n) + } + }(Zepto), + function(t) { + function e(e, n, r) { + var i = t.Event(n); + return t(e).trigger(i, r), !i.isDefaultPrevented() + } + + function n(t, n, r, i) { + return t.global ? e(n || y, r, i) : void 0 + } + + function r(e) { + e.global && 0 === t.active++ && n(e, null, "ajaxStart") + } + + function i(e) { + e.global && !--t.active && n(e, null, "ajaxStop") + } + + function o(t, e) { + var r = e.context; + return e.beforeSend.call(r, t, e) === !1 || n(e, r, "ajaxBeforeSend", [t, e]) === !1 ? !1 : void n(e, r, "ajaxSend", [t, e]) + } + + function a(t, e, r, i) { + var o = r.context, + a = "success"; + r.success.call(o, t, a, e), i && i.resolveWith(o, [t, a, e]), n(r, o, "ajaxSuccess", [e, r, t]), c(a, e, r) + } + + function s(t, e, r, i, o) { + var a = i.context; + i.error.call(a, r, e, t), o && o.rejectWith(a, [r, e, t]), n(i, a, "ajaxError", [r, i, t || e]), c(e, r, i) + } + + function c(t, e, r) { + var o = r.context; + r.complete.call(o, e, t), n(r, o, "ajaxComplete", [e, r]), i(r) + } + + function u() {} + + function l(t) { + return t && (t = t.split(";", 2)[0]), t && (t == j ? "html" : t == E ? "json" : x.test(t) ? "script" : w.test(t) && "xml") || "text" + } + + function f(t, e) { + return "" == e ? t : (t + "&" + e).replace(/[&?]{1,2}/, "?") + } + + function h(e) { + e.processData && e.data && "string" != t.type(e.data) && (e.data = t.param(e.data, e.traditional)), !e.data || e.type && "GET" != e.type.toUpperCase() || (e.url = f(e.url, e.data), e.data = void 0) + } + + function p(e, n, r, i) { + return t.isFunction(n) && (i = r, r = n, n = void 0), t.isFunction(r) || (i = r, r = void 0), { + url: e, + data: n, + success: r, + dataType: i + } + } + + function d(e, n, r, i) { + var o, a = t.isArray(n), + s = t.isPlainObject(n); + t.each(n, function(n, c) { + o = t.type(c), i && (n = r ? i : i + "[" + (s || "object" == o || "array" == o ? n : "") + "]"), !i && a ? e.add(c.name, c.value) : "array" == o || !r && "object" == o ? d(e, c, r, n) : e.add(n, c) + }) + } + var m, g, v = 0, + y = window.document, + b = /)<[^<]*)*<\/script>/gi, + x = /^(?:text|application)\/javascript/i, + w = /^(?:text|application)\/xml/i, + E = "application/json", + j = "text/html", + S = /^\s*$/, + C = y.createElement("a"); + C.href = window.location.href, t.active = 0, t.ajaxJSONP = function(e, n) { + if (!("type" in e)) return t.ajax(e); + var r, i, c = e.jsonpCallback, + u = (t.isFunction(c) ? c() : c) || "jsonp" + ++v, + l = y.createElement("script"), + f = window[u], + h = function(e) { + t(l).triggerHandler("error", e || "abort") + }, + p = { + abort: h + }; + return n && n.promise(p), t(l).on("load error", function(o, c) { + clearTimeout(i), t(l).off().remove(), "error" != o.type && r ? a(r[0], p, e, n) : s(null, c || "error", p, e, n), window[u] = f, r && t.isFunction(f) && f(r[0]), f = r = void 0 + }), o(p, e) === !1 ? (h("abort"), p) : (window[u] = function() { + r = arguments + }, l.src = e.url.replace(/\?(.+)=\?/, "?$1=" + u), y.head.appendChild(l), e.timeout > 0 && (i = setTimeout(function() { + h("timeout") + }, e.timeout)), p) + }, t.ajaxSettings = { + type: "GET", + beforeSend: u, + success: u, + error: u, + complete: u, + context: null, + global: !0, + xhr: function() { + return new window.XMLHttpRequest + }, + accepts: { + script: "text/javascript, application/javascript, application/x-javascript", + json: E, + xml: "application/xml, text/xml", + html: j, + text: "text/plain" + }, + crossDomain: !1, + timeout: 0, + processData: !0, + cache: !0 + }, t.ajax = function(e) { + var n, i = t.extend({}, e || {}), + c = t.Deferred && t.Deferred(); + for (m in t.ajaxSettings) void 0 === i[m] && (i[m] = t.ajaxSettings[m]); + r(i), i.crossDomain || (n = y.createElement("a"), n.href = i.url, n.href = n.href, i.crossDomain = C.protocol + "//" + C.host != n.protocol + "//" + n.host), i.url || (i.url = window.location.toString()), h(i); + var p = i.dataType, + d = /\?.+=\?/.test(i.url); + if (d && (p = "jsonp"), i.cache !== !1 && (e && e.cache === !0 || "script" != p && "jsonp" != p) || (i.url = f(i.url, "_=" + Date.now())), "jsonp" == p) return d || (i.url = f(i.url, i.jsonp ? i.jsonp + "=?" : i.jsonp === !1 ? "" : "callback=?")), t.ajaxJSONP(i, c); + var v, b = i.accepts[p], + x = {}, + w = function(t, e) { + x[t.toLowerCase()] = [t, e] + }, + E = /^([\w-]+:)\/\//.test(i.url) ? RegExp.$1 : window.location.protocol, + j = i.xhr(), + O = j.setRequestHeader; + if (c && c.promise(j), i.crossDomain || w("X-Requested-With", "XMLHttpRequest"), w("Accept", b || "*/*"), (b = i.mimeType || b) && (b.indexOf(",") > -1 && (b = b.split(",", 2)[0]), j.overrideMimeType && j.overrideMimeType(b)), (i.contentType || i.contentType !== !1 && i.data && "GET" != i.type.toUpperCase()) && w("Content-Type", i.contentType || "application/x-www-form-urlencoded"), i.headers) + for (g in i.headers) w(g, i.headers[g]); + if (j.setRequestHeader = w, j.onreadystatechange = function() { + if (4 == j.readyState) { + j.onreadystatechange = u, clearTimeout(v); + var e, n = !1; + if (j.status >= 200 && j.status < 300 || 304 == j.status || 0 == j.status && "file:" == E) { + p = p || l(i.mimeType || j.getResponseHeader("content-type")), e = j.responseText; + try { + "script" == p ? (1, eval)(e) : "xml" == p ? e = j.responseXML : "json" == p && (e = S.test(e) ? null : t.parseJSON(e)) + } catch (r) { + n = r + } + n ? s(n, "parsererror", j, i, c) : a(e, j, i, c) + } else s(j.statusText || null, j.status ? "error" : "abort", j, i, c) + } + }, o(j, i) === !1) return j.abort(), s(null, "abort", j, i, c), j; + if (i.xhrFields) + for (g in i.xhrFields) j[g] = i.xhrFields[g]; + var T = "async" in i ? i.async : !0; + j.open(i.type, i.url, T, i.username, i.password); + for (g in x) O.apply(j, x[g]); + return i.timeout > 0 && (v = setTimeout(function() { + j.onreadystatechange = u, j.abort(), s(null, "timeout", j, i, c) + }, i.timeout)), j.send(i.data ? i.data : null), j + }, t.get = function() { + return t.ajax(p.apply(null, arguments)) + }, t.post = function() { + var e = p.apply(null, arguments); + return e.type = "POST", t.ajax(e) + }, t.getJSON = function() { + var e = p.apply(null, arguments); + return e.dataType = "json", t.ajax(e) + }, t.fn.load = function(e, n, r) { + if (!this.length) return this; + var i, o = this, + a = e.split(/\s/), + s = p(e, n, r), + c = s.success; + return a.length > 1 && (s.url = a[0], i = a[1]), s.success = function(e) { + o.html(i ? t("
").html(e.replace(b, "")).find(i) : e), c && c.apply(o, arguments) + }, t.ajax(s), this + }; + var O = encodeURIComponent; + t.param = function(e, n) { + var r = []; + return r.add = function(e, n) { + t.isFunction(n) && (n = n()), null == n && (n = ""), this.push(O(e) + "=" + O(n)) + }, d(r, e, n), r.join("&").replace(/%20/g, "+") + } + }(Zepto), + function(t) { + t.fn.serializeArray = function() { + var e, n, r = [], + i = function(t) { + return t.forEach ? t.forEach(i) : void r.push({ + name: e, + value: t + }) + }; + return this[0] && t.each(this[0].elements, function(r, o) { + n = o.type, e = o.name, e && "fieldset" != o.nodeName.toLowerCase() && !o.disabled && "submit" != n && "reset" != n && "button" != n && "file" != n && ("radio" != n && "checkbox" != n || o.checked) && i(t(o).val()) + }), r + }, t.fn.serialize = function() { + var t = []; + return this.serializeArray().forEach(function(e) { + t.push(encodeURIComponent(e.name) + "=" + encodeURIComponent(e.value)) + }), t.join("&") + }, t.fn.submit = function(e) { + if (0 in arguments) this.bind("submit", e); + else if (this.length) { + var n = t.Event("submit"); + this.eq(0).trigger(n), n.isDefaultPrevented() || this.get(0).submit() + } + return this + } + }(Zepto), + function(t) { + "__proto__" in {} || t.extend(t.zepto, { + Z: function(e, n) { + return e = e || [], t.extend(e, t.fn), e.selector = n || "", e.__Z = !0, e + }, + isZ: function(e) { + return "array" === t.type(e) && "__Z" in e + } + }); + try { + getComputedStyle(void 0) + } catch (e) { + var n = getComputedStyle; + window.getComputedStyle = function(t) { + try { + return n(t) + } catch (e) { + return null + } + } + } + }(Zepto), + function(t, e) { + "function" == typeof define && define.amd ? define("smoothScroll", e(t)) : "object" == typeof exports ? module.exports = e(t) : t.smoothScroll = e(t) + }(window || this, function(t) { + "use strict"; + var e, n, r, i = {}, + o = !!document.querySelector && !!t.addEventListener, + a = { + speed: 500, + easing: "easeInOutCubic", + offset: 0, + updateURL: !0, + callbackBefore: function() {}, + callbackAfter: function() {} + }, + s = function(t, e, n) { + if ("[object Object]" === Object.prototype.toString.call(t)) + for (var r in t) Object.prototype.hasOwnProperty.call(t, r) && e.call(n, t[r], r, t); + else + for (var i = 0, o = t.length; o > i; i++) e.call(n, t[i], i, t) + }, + c = function(t, e) { + var n = {}; + return s(t, function(e, r) { + n[r] = t[r] + }), s(e, function(t, r) { + n[r] = e[r] + }), n + }, + u = function(t, e) { + for (var n = e.charAt(0); t && t !== document; t = t.parentNode) + if ("." === n) { + if (t.classList.contains(e.substr(1))) return t + } else if ("#" === n) { + if (t.id === e.substr(1)) return t + } else if ("[" === n && t.hasAttribute(e.substr(1, e.length - 2))) return t; + return !1 + }, + l = function(t) { + return Math.max(t.scrollHeight, t.offsetHeight, t.clientHeight) + }, + f = function(t) { + for (var e, n = String(t), r = n.length, i = -1, o = "", a = n.charCodeAt(0); ++i < r;) { + if (e = n.charCodeAt(i), 0 === e) throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + o += e >= 1 && 31 >= e || 127 == e || 0 === i && e >= 48 && 57 >= e || 1 === i && e >= 48 && 57 >= e && 45 === a ? "\\" + e.toString(16) + " " : e >= 128 || 45 === e || 95 === e || e >= 48 && 57 >= e || e >= 65 && 90 >= e || e >= 97 && 122 >= e ? n.charAt(i) : "\\" + n.charAt(i) + } + return o + }, + h = function(t, e) { + var n; + return "easeInQuad" === t && (n = e * e), "easeOutQuad" === t && (n = e * (2 - e)), "easeInOutQuad" === t && (n = .5 > e ? 2 * e * e : -1 + (4 - 2 * e) * e), "easeInCubic" === t && (n = e * e * e), "easeOutCubic" === t && (n = --e * e * e + 1), "easeInOutCubic" === t && (n = .5 > e ? 4 * e * e * e : (e - 1) * (2 * e - 2) * (2 * e - 2) + 1), "easeInQuart" === t && (n = e * e * e * e), "easeOutQuart" === t && (n = 1 - --e * e * e * e), "easeInOutQuart" === t && (n = .5 > e ? 8 * e * e * e * e : 1 - 8 * --e * e * e * e), "easeInQuint" === t && (n = e * e * e * e * e), "easeOutQuint" === t && (n = 1 + --e * e * e * e * e), "easeInOutQuint" === t && (n = .5 > e ? 16 * e * e * e * e * e : 1 + 16 * --e * e * e * e * e), n || e + }, + p = function(t, e, n) { + var r = 0; + if (t.offsetParent) + do r += t.offsetTop, t = t.offsetParent; while (t); + return r = r - e - n, r >= 0 ? r : 0 + }, + d = function() { + return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight) + }, + m = function(t) { + return t && "object" == typeof JSON && "function" == typeof JSON.parse ? JSON.parse(t) : {} + }, + g = function(e, n) { + history.pushState && (n || "true" === n) && history.pushState(null, null, [t.location.protocol, "//", t.location.host, t.location.pathname, t.location.search, e].join("")) + }; + i.animateScroll = function(e, n, i) { + var o = c(o || a, i || {}), + s = m(e ? e.getAttribute("data-options") : null); + o = c(o, s), n = "#" + f(n.substr(1)); + var u = "#" === n ? document.documentElement : document.querySelector(n), + v = t.pageYOffset; + r || (r = document.querySelector("[data-scroll-header]")); + var y, b, x, w = null === r ? 0 : l(r) + r.offsetTop, + E = p(u, w, parseInt(o.offset, 10)), + j = E - v, + S = d(), + C = 0; + g(n, o.updateURL); + var O = function(r, i, a) { + var s = t.pageYOffset; + (r == i || s == i || t.innerHeight + s >= S) && (clearInterval(a), u.focus(), o.callbackAfter(e, n)) + }, + T = function() { + C += 16, b = C / parseInt(o.speed, 10), b = b > 1 ? 1 : b, x = v + j * h(o.easing, b), t.scrollTo(0, Math.floor(x)), O(x, E, y) + }, + N = function() { + o.callbackBefore(e, n), y = setInterval(T, 16) + }; + 0 === t.pageYOffset && t.scrollTo(0, 0), N() + }; + var v = function(t) { + var n = u(t.target, "[data-scroll]"); + n && "a" === n.tagName.toLowerCase() && (t.preventDefault(), i.animateScroll(n, n.hash, e)) + }, + y = function(t) { + n || (n = setTimeout(function() { + n = null, headerHeight = null === r ? 0 : l(r) + r.offsetTop + }, 66)) + }; + return i.destroy = function() { + e && (document.removeEventListener("click", v, !1), t.removeEventListener("resize", y, !1), e = null, n = null, r = null) + }, i.init = function(n) { + o && (i.destroy(), e = c(a, n || {}), r = document.querySelector("[data-scroll-header]"), document.addEventListener("click", v, !1), r && t.addEventListener("resize", y, !1)) + }, i + }), + function(t) { + t.fn.simpleJekyllSearch = function(e) { + function n() { + u.keyup(function(e) { + t(this).val().length ? i(r(t(this).val())) : o() + }) + } + + function r(e) { + var n = []; + return t.each(c, function(t, r) { + for (var t = 0; t < s.length; t++) void 0 !== r[s[t]] && -1 !== r[s[t]].toLowerCase().indexOf(e.toLowerCase()) && (n.push(r), t = s.length) + }), n + } + + function i(e) { + o(), l.append(t(a.searchResultsTitle)), e.length ? t.each(e, function(e, n) { + if (e < a.limit) { + for (var r = a.template, e = 0; e < s.length; e++) { + var i = new RegExp("{" + s[e] + "}", "g"); + r = r.replace(i, n[s[e]]) + } + l.append(t(r)) + } + }) : l.append(a.noResults) + } + + function o() { + l.children().remove() + } + var a = t.extend({ + jsonFile: "/blog/search.json", + jsonFormat: "title,category,tags,url,date", + template: '
  • ', + searchResults: ".search-results", + searchResultsTitle: "

    Search Results:

    ", + limit: "5", + noResults: "

    Oh snap!
    Nothing found! :(

    " + }, e), + s = a.jsonFormat.split(","), + c = [], + u = this, + l = t(a.searchResults); + a.jsonFile.length && l.length && t.ajax({ + type: "GET", + url: a.jsonFile, + dataType: "json", + success: function(t, e, r) { + c = t, n() + }, + error: function(t, e, n) { + console.log("***ERROR in simpleJekyllSearch.js***"), console.log(t), console.log(e), console.log(n) + } + }) + } + }(Zepto), + function(t, e, n) { + t("a#slide").click(function() { + t("#sidebar,a#slide,#fade").addClass("slide"), t("#open").hide(), t("#search").hide(), t("#close").show() + }), t("#fade").click(function() { + t("#sidebar,a#slide,#fade").removeClass("slide"), t("#open").show(), t("#search").show(), t("#close").hide() + }); + var r = { + close: t(".icon-remove-sign"), + searchform: t(".search-form"), + canvas: t("body"), + dothis: t(".dosearch") + }; + r.dothis.on("click", function() { + t(".search-wrapper").toggleClass("active"), r.searchform.toggleClass("active"), r.searchform.find("input").focus(), r.canvas.toggleClass("search-overlay"), t(".search-field").simpleJekyllSearch() + }), r.close.on("click", function() { + t(".search-wrapper").toggleClass("active"), r.searchform.toggleClass("active"), r.canvas.removeClass("search-overlay") + }), smoothScroll.init({ + updateURL: !1 + }) + }(Zepto, window); \ No newline at end of file diff --git a/blog/assets/js/main.js b/blog/assets/js/main.js new file mode 100644 index 0000000..2d6a810 --- /dev/null +++ b/blog/assets/js/main.js @@ -0,0 +1,274 @@ +isMobile = false; + +$(document).ready(function ( $ ) { + + 'use strict'; + + isMobile = { + Android: function() { + return navigator.userAgent.match(/Android/i); + }, + BlackBerry: function() { + return navigator.userAgent.match(/BlackBerry/i); + }, + iOS: function() { + return navigator.userAgent.match(/iPhone|iPad|iPod/i); + }, + Opera: function() { + return navigator.userAgent.match(/Opera Mini/i); + }, + Windows: function() { + return navigator.userAgent.match(/IEMobile/i); + }, + any: function() { + return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows()); + } + }; + + var mobileMenuOutsideClick = function() { + + $(document).click(function (e) { + var container = $("#colorlib-offcanvas, .js-colorlib-nav-toggle"); + if (!container.is(e.target) && container.has(e.target).length === 0) { + + if ( $('body').hasClass('offcanvas') ) { + + $('body').removeClass('offcanvas'); + $('.js-colorlib-nav-toggle').removeClass('active'); + + } + + } + }); + + }; + + + var offcanvasMenu = function() { + + $('#page').prepend('
    '); + $('#page').prepend(''); + var clone1 = $('.menu-1 > ul').clone(); + $('#colorlib-offcanvas').append(clone1); + var clone2 = $('.menu-2 > ul').clone(); + $('#colorlib-offcanvas').append(clone2); + + $('#colorlib-offcanvas .has-dropdown').addClass('offcanvas-has-dropdown'); + $('#colorlib-offcanvas') + .find('li') + .removeClass('has-dropdown'); + + // Hover dropdown menu on mobile + $('.offcanvas-has-dropdown').mouseenter(function(){ + var $this = $(this); + + $this + .addClass('active') + .find('ul') + .slideDown(500, 'easeOutExpo'); + }).mouseleave(function(){ + + var $this = $(this); + $this + .removeClass('active') + .find('ul') + .slideUp(500, 'easeOutExpo'); + }); + + + $(window).resize(function(){ + + if ( $('body').hasClass('offcanvas') ) { + + $('body').removeClass('offcanvas'); + $('.js-colorlib-nav-toggle').removeClass('active'); + + } + }); + }; + + var burgerMenu = function() { + + $('body').on('click', '.js-colorlib-nav-toggle', function(event){ + var $this = $(this); + + + if ( $('body').hasClass('overflow offcanvas') ) { + $('body').removeClass('overflow offcanvas'); + } else { + $('body').addClass('overflow offcanvas'); + } + $this.toggleClass('active'); + event.preventDefault(); + + }); + }; + + + var contentWayPoint = function() { + var i = 0; + $('.animate-box').waypoint( function( direction ) { + + if( direction === 'down' && !$(this.element).hasClass('animated-fast') ) { + + i++; + + $(this.element).addClass('item-animate'); + setTimeout(function(){ + + $('body .animate-box.item-animate').each(function(k){ + var el = $(this); + setTimeout( function () { + var effect = el.data('animate-effect'); + if ( effect === 'fadeIn') { + el.addClass('fadeIn animated-fast'); + } else if ( effect === 'fadeInLeft') { + el.addClass('fadeInLeft animated-fast'); + } else if ( effect === 'fadeInRight') { + el.addClass('fadeInRight animated-fast'); + } else { + el.addClass('fadeInUp animated-fast'); + } + + el.removeClass('item-animate'); + }, k * 100, 'easeInOutExpo' ); + }); + + }, 100); + + } + + } , { offset: '85%' } ); + }; + + + var dropdown = function() { + + $('.has-dropdown').mouseenter(function(){ + + var $this = $(this); + $this + .find('.dropdown') + .css('display', 'block') + .addClass('animated-fast fadeInUpMenu'); + + }).mouseleave(function(){ + var $this = $(this); + + $this + .find('.dropdown') + .css('display', 'none') + .removeClass('animated-fast fadeInUpMenu'); + }); + + }; + + + var goToTop = function() { + + $('.js-gotop').on('click', function(event){ + + event.preventDefault(); + + $('html, body').animate({ + scrollTop: $('html').offset().top + }, 500, 'easeInOutExpo'); + + return false; + }); + + $(window).scroll(function(){ + + var $win = $(window); + if ($win.scrollTop() > 200) { + $('.js-top').addClass('active'); + } else { + $('.js-top').removeClass('active'); + } + + }); + + }; + + + // Loading page + var loaderPage = function() { + $(".colorlib-loader").fadeOut("slow"); + }; + + + var parallax = function() { + + if ( !isMobile.any() ) { + $(window).stellar({ + horizontalScrolling: false, + hideDistantElements: false, + responsive: true + + }); + } + }; + + var counter = function() { + $('.js-counter').countTo({ + formatter: function (value, options) { + return value.toFixed(options.decimals); + }, + }); + }; + + + var counterWayPoint = function() { + if ($('.colorlib-counters').length > 0 ) { + $('.colorlib-counters').waypoint( function( direction ) { + + if( direction === 'down' && !$(this.element).hasClass('animated') ) { + setTimeout( counter , 400); + $(this.element).addClass('animated'); + } + } , { offset: '90%' } ); + } + }; + + // Owl Carousel + var owlCrouselFeatureSlide = function() { + var owl = $('.unapp_slider'); + owl.owlCarousel({ + animateOut: 'fadeOut', + animateIn: 'fadeIn', + autoplay: true, + items: 1, + loop: true, + margin: 0, + responsiveClass: true, + nav: false, + dots: true, + autoplayHoverPause: true, + smartSpeed: 500, + navText: [ + "", + "" + ] + }); + + }; + + $(".dropdown-nav").hover( + function(){ $(this).addClass('open') }, + function(){ $(this).removeClass('open') } + ); + + + $(function(){ + offcanvasMenu(); + burgerMenu(); + contentWayPoint(); + //dropdown(); + goToTop(); + loaderPage(); + //parallax(); + counter(); + counterWayPoint(); + //owlCrouselFeatureSlide(); + }); +}); diff --git a/blog/assets/js/particles.js b/blog/assets/js/particles.js new file mode 100644 index 0000000..1ff9cc0 --- /dev/null +++ b/blog/assets/js/particles.js @@ -0,0 +1,1541 @@ +/* ----------------------------------------------- +/* Author : Vincent Garreau - vincentgarreau.com +/* MIT license: http://opensource.org/licenses/MIT +/* Demo / Generator : vincentgarreau.com/particles.js +/* GitHub : github.com/VincentGarreau/particles.js +/* How to use? : Check the GitHub README +/* v2.0.0 +/* ----------------------------------------------- */ + +var pJS = function(tag_id, params){ + + var canvas_el = document.querySelector('#'+tag_id+' > .particles-js-canvas-el'); + + /* particles.js variables with default values */ + this.pJS = { + canvas: { + el: canvas_el, + w: canvas_el.offsetWidth, + h: canvas_el.offsetHeight + }, + particles: { + number: { + value: 400, + density: { + enable: true, + value_area: 800 + } + }, + color: { + value: '#fff' + }, + shape: { + type: 'circle', + stroke: { + width: 0, + color: '#ff0000' + }, + polygon: { + nb_sides: 5 + }, + image: { + src: '', + width: 100, + height: 100 + } + }, + opacity: { + value: 1, + random: false, + anim: { + enable: false, + speed: 2, + opacity_min: 0, + sync: false + } + }, + size: { + value: 20, + random: false, + anim: { + enable: false, + speed: 20, + size_min: 0, + sync: false + } + }, + line_linked: { + enable: true, + distance: 100, + color: '#fff', + opacity: 1, + width: 1 + }, + move: { + enable: true, + speed: 2, + direction: 'none', + random: false, + straight: false, + out_mode: 'out', + bounce: false, + attract: { + enable: false, + rotateX: 3000, + rotateY: 3000 + } + }, + array: [] + }, + interactivity: { + detect_on: 'canvas', + events: { + onhover: { + enable: true, + mode: 'grab' + }, + onclick: { + enable: true, + mode: 'push' + }, + resize: true + }, + modes: { + grab:{ + distance: 100, + line_linked:{ + opacity: 1 + } + }, + bubble:{ + distance: 200, + size: 80, + duration: 0.4 + }, + repulse:{ + distance: 200, + duration: 0.4 + }, + push:{ + particles_nb: 4 + }, + remove:{ + particles_nb: 2 + } + }, + mouse:{} + }, + retina_detect: false, + fn: { + interact: {}, + modes: {}, + vendors:{} + }, + tmp: {} + }; + + var pJS = this.pJS; + + /* params settings */ + if(params){ + Object.deepExtend(pJS, params); + } + + pJS.tmp.obj = { + size_value: pJS.particles.size.value, + size_anim_speed: pJS.particles.size.anim.speed, + move_speed: pJS.particles.move.speed, + line_linked_distance: pJS.particles.line_linked.distance, + line_linked_width: pJS.particles.line_linked.width, + mode_grab_distance: pJS.interactivity.modes.grab.distance, + mode_bubble_distance: pJS.interactivity.modes.bubble.distance, + mode_bubble_size: pJS.interactivity.modes.bubble.size, + mode_repulse_distance: pJS.interactivity.modes.repulse.distance + }; + + + pJS.fn.retinaInit = function(){ + + if(pJS.retina_detect && window.devicePixelRatio > 1){ + pJS.canvas.pxratio = window.devicePixelRatio; + pJS.tmp.retina = true; + } + else{ + pJS.canvas.pxratio = 1; + pJS.tmp.retina = false; + } + + pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio; + pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio; + + pJS.particles.size.value = pJS.tmp.obj.size_value * pJS.canvas.pxratio; + pJS.particles.size.anim.speed = pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio; + pJS.particles.move.speed = pJS.tmp.obj.move_speed * pJS.canvas.pxratio; + pJS.particles.line_linked.distance = pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio; + pJS.interactivity.modes.grab.distance = pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio; + pJS.interactivity.modes.bubble.distance = pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio; + pJS.particles.line_linked.width = pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio; + pJS.interactivity.modes.bubble.size = pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio; + pJS.interactivity.modes.repulse.distance = pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio; + + }; + + + + /* ---------- pJS functions - canvas ------------ */ + + pJS.fn.canvasInit = function(){ + pJS.canvas.ctx = pJS.canvas.el.getContext('2d'); + }; + + pJS.fn.canvasSize = function(){ + + pJS.canvas.el.width = pJS.canvas.w; + pJS.canvas.el.height = pJS.canvas.h; + + if(pJS && pJS.interactivity.events.resize){ + + window.addEventListener('resize', function(){ + + pJS.canvas.w = pJS.canvas.el.offsetWidth; + pJS.canvas.h = pJS.canvas.el.offsetHeight; + + /* resize canvas */ + if(pJS.tmp.retina){ + pJS.canvas.w *= pJS.canvas.pxratio; + pJS.canvas.h *= pJS.canvas.pxratio; + } + + pJS.canvas.el.width = pJS.canvas.w; + pJS.canvas.el.height = pJS.canvas.h; + + /* repaint canvas on anim disabled */ + if(!pJS.particles.move.enable){ + pJS.fn.particlesEmpty(); + pJS.fn.particlesCreate(); + pJS.fn.particlesDraw(); + pJS.fn.vendors.densityAutoParticles(); + } + + /* density particles enabled */ + pJS.fn.vendors.densityAutoParticles(); + + }); + + } + + }; + + + pJS.fn.canvasPaint = function(){ + pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h); + }; + + pJS.fn.canvasClear = function(){ + pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); + }; + + + /* --------- pJS functions - particles ----------- */ + + pJS.fn.particle = function(color, opacity, position){ + + /* size */ + this.radius = (pJS.particles.size.random ? Math.random() : 1) * pJS.particles.size.value; + if(pJS.particles.size.anim.enable){ + this.size_status = false; + this.vs = pJS.particles.size.anim.speed / 100; + if(!pJS.particles.size.anim.sync){ + this.vs = this.vs * Math.random(); + } + } + + /* position */ + this.x = position ? position.x : Math.random() * pJS.canvas.w; + this.y = position ? position.y : Math.random() * pJS.canvas.h; + + /* check position - into the canvas */ + if(this.x > pJS.canvas.w - this.radius*2) this.x = this.x - this.radius; + else if(this.x < this.radius*2) this.x = this.x + this.radius; + if(this.y > pJS.canvas.h - this.radius*2) this.y = this.y - this.radius; + else if(this.y < this.radius*2) this.y = this.y + this.radius; + + /* check position - avoid overlap */ + if(pJS.particles.move.bounce){ + pJS.fn.vendors.checkOverlap(this, position); + } + + /* color */ + this.color = {}; + if(typeof(color.value) == 'object'){ + + if(color.value instanceof Array){ + var color_selected = color.value[Math.floor(Math.random() * pJS.particles.color.value.length)]; + this.color.rgb = hexToRgb(color_selected); + }else{ + if(color.value.r != undefined && color.value.g != undefined && color.value.b != undefined){ + this.color.rgb = { + r: color.value.r, + g: color.value.g, + b: color.value.b + } + } + if(color.value.h != undefined && color.value.s != undefined && color.value.l != undefined){ + this.color.hsl = { + h: color.value.h, + s: color.value.s, + l: color.value.l + } + } + } + + } + else if(color.value == 'random'){ + this.color.rgb = { + r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), + g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), + b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0) + } + } + else if(typeof(color.value) == 'string'){ + this.color = color; + this.color.rgb = hexToRgb(this.color.value); + } + + /* opacity */ + this.opacity = (pJS.particles.opacity.random ? Math.random() : 1) * pJS.particles.opacity.value; + if(pJS.particles.opacity.anim.enable){ + this.opacity_status = false; + this.vo = pJS.particles.opacity.anim.speed / 100; + if(!pJS.particles.opacity.anim.sync){ + this.vo = this.vo * Math.random(); + } + } + + /* animation - velocity for speed */ + var velbase = {} + switch(pJS.particles.move.direction){ + case 'top': + velbase = { x:0, y:-1 }; + break; + case 'top-right': + velbase = { x:0.5, y:-0.5 }; + break; + case 'right': + velbase = { x:1, y:-0 }; + break; + case 'bottom-right': + velbase = { x:0.5, y:0.5 }; + break; + case 'bottom': + velbase = { x:0, y:1 }; + break; + case 'bottom-left': + velbase = { x:-0.5, y:1 }; + break; + case 'left': + velbase = { x:-1, y:0 }; + break; + case 'top-left': + velbase = { x:-0.5, y:-0.5 }; + break; + default: + velbase = { x:0, y:0 }; + break; + } + + if(pJS.particles.move.straight){ + this.vx = velbase.x; + this.vy = velbase.y; + if(pJS.particles.move.random){ + this.vx = this.vx * (Math.random()); + this.vy = this.vy * (Math.random()); + } + }else{ + this.vx = velbase.x + Math.random()-0.5; + this.vy = velbase.y + Math.random()-0.5; + } + + // var theta = 2.0 * Math.PI * Math.random(); + // this.vx = Math.cos(theta); + // this.vy = Math.sin(theta); + + this.vx_i = this.vx; + this.vy_i = this.vy; + + + + /* if shape is image */ + + var shape_type = pJS.particles.shape.type; + if(typeof(shape_type) == 'object'){ + if(shape_type instanceof Array){ + var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)]; + this.shape = shape_selected; + } + }else{ + this.shape = shape_type; + } + + if(this.shape == 'image'){ + var sh = pJS.particles.shape; + this.img = { + src: sh.image.src, + ratio: sh.image.width / sh.image.height + } + if(!this.img.ratio) this.img.ratio = 1; + if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg != undefined){ + pJS.fn.vendors.createSvgImg(this); + if(pJS.tmp.pushing){ + this.img.loaded = false; + } + } + } + + + + }; + + + pJS.fn.particle.prototype.draw = function() { + + var p = this; + + if(p.radius_bubble != undefined){ + var radius = p.radius_bubble; + }else{ + var radius = p.radius; + } + + if(p.opacity_bubble != undefined){ + var opacity = p.opacity_bubble; + }else{ + var opacity = p.opacity; + } + + if(p.color.rgb){ + var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+opacity+')'; + }else{ + var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+opacity+')'; + } + + pJS.canvas.ctx.fillStyle = color_value; + pJS.canvas.ctx.beginPath(); + + switch(p.shape){ + + case 'circle': + pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false); + break; + + case 'edge': + pJS.canvas.ctx.rect(p.x-radius, p.y-radius, radius*2, radius*2); + break; + + case 'triangle': + pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x-radius, p.y+radius / 1.66, radius*2, 3, 2); + break; + + case 'polygon': + pJS.fn.vendors.drawShape( + pJS.canvas.ctx, + p.x - radius / (pJS.particles.shape.polygon.nb_sides/3.5), // startX + p.y - radius / (2.66/3.5), // startY + radius*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength + pJS.particles.shape.polygon.nb_sides, // sideCountNumerator + 1 // sideCountDenominator + ); + break; + + case 'star': + pJS.fn.vendors.drawShape( + pJS.canvas.ctx, + p.x - radius*2 / (pJS.particles.shape.polygon.nb_sides/4), // startX + p.y - radius / (2*2.66/3.5), // startY + radius*2*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength + pJS.particles.shape.polygon.nb_sides, // sideCountNumerator + 2 // sideCountDenominator + ); + break; + + case 'image': + + function draw(){ + pJS.canvas.ctx.drawImage( + img_obj, + p.x-radius, + p.y-radius, + radius*2, + radius*2 / p.img.ratio + ); + } + + if(pJS.tmp.img_type == 'svg'){ + var img_obj = p.img.obj; + }else{ + var img_obj = pJS.tmp.img_obj; + } + + if(img_obj){ + draw(); + } + + break; + + } + + pJS.canvas.ctx.closePath(); + + if(pJS.particles.shape.stroke.width > 0){ + pJS.canvas.ctx.strokeStyle = pJS.particles.shape.stroke.color; + pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width; + pJS.canvas.ctx.stroke(); + } + + pJS.canvas.ctx.fill(); + + }; + + + pJS.fn.particlesCreate = function(){ + for(var i = 0; i < pJS.particles.number.value; i++) { + pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value)); + } + }; + + pJS.fn.particlesUpdate = function(){ + + for(var i = 0; i < pJS.particles.array.length; i++){ + + /* the particle */ + var p = pJS.particles.array[i]; + + // var d = ( dx = pJS.interactivity.mouse.click_pos_x - p.x ) * dx + ( dy = pJS.interactivity.mouse.click_pos_y - p.y ) * dy; + // var f = -BANG_SIZE / d; + // if ( d < BANG_SIZE ) { + // var t = Math.atan2( dy, dx ); + // p.vx = f * Math.cos(t); + // p.vy = f * Math.sin(t); + // } + + /* move the particle */ + if(pJS.particles.move.enable){ + var ms = pJS.particles.move.speed/2; + p.x += p.vx * ms; + p.y += p.vy * ms; + } + + /* change opacity status */ + if(pJS.particles.opacity.anim.enable) { + if(p.opacity_status == true) { + if(p.opacity >= pJS.particles.opacity.value) p.opacity_status = false; + p.opacity += p.vo; + }else { + if(p.opacity <= pJS.particles.opacity.anim.opacity_min) p.opacity_status = true; + p.opacity -= p.vo; + } + if(p.opacity < 0) p.opacity = 0; + } + + /* change size */ + if(pJS.particles.size.anim.enable){ + if(p.size_status == true){ + if(p.radius >= pJS.particles.size.value) p.size_status = false; + p.radius += p.vs; + }else{ + if(p.radius <= pJS.particles.size.anim.size_min) p.size_status = true; + p.radius -= p.vs; + } + if(p.radius < 0) p.radius = 0; + } + + /* change particle position if it is out of canvas */ + if(pJS.particles.move.out_mode == 'bounce'){ + var new_pos = { + x_left: p.radius, + x_right: pJS.canvas.w, + y_top: p.radius, + y_bottom: pJS.canvas.h + } + }else{ + var new_pos = { + x_left: -p.radius, + x_right: pJS.canvas.w + p.radius, + y_top: -p.radius, + y_bottom: pJS.canvas.h + p.radius + } + } + + if(p.x - p.radius > pJS.canvas.w){ + p.x = new_pos.x_left; + p.y = Math.random() * pJS.canvas.h; + } + else if(p.x + p.radius < 0){ + p.x = new_pos.x_right; + p.y = Math.random() * pJS.canvas.h; + } + if(p.y - p.radius > pJS.canvas.h){ + p.y = new_pos.y_top; + p.x = Math.random() * pJS.canvas.w; + } + else if(p.y + p.radius < 0){ + p.y = new_pos.y_bottom; + p.x = Math.random() * pJS.canvas.w; + } + + /* out of canvas modes */ + switch(pJS.particles.move.out_mode){ + case 'bounce': + if (p.x + p.radius > pJS.canvas.w) p.vx = -p.vx; + else if (p.x - p.radius < 0) p.vx = -p.vx; + if (p.y + p.radius > pJS.canvas.h) p.vy = -p.vy; + else if (p.y - p.radius < 0) p.vy = -p.vy; + break; + } + + /* events */ + if(isInArray('grab', pJS.interactivity.events.onhover.mode)){ + pJS.fn.modes.grabParticle(p); + } + + if(isInArray('bubble', pJS.interactivity.events.onhover.mode) || isInArray('bubble', pJS.interactivity.events.onclick.mode)){ + pJS.fn.modes.bubbleParticle(p); + } + + if(isInArray('repulse', pJS.interactivity.events.onhover.mode) || isInArray('repulse', pJS.interactivity.events.onclick.mode)){ + pJS.fn.modes.repulseParticle(p); + } + + /* interaction auto between particles */ + if(pJS.particles.line_linked.enable || pJS.particles.move.attract.enable){ + for(var j = i + 1; j < pJS.particles.array.length; j++){ + var p2 = pJS.particles.array[j]; + + /* link particles */ + if(pJS.particles.line_linked.enable){ + pJS.fn.interact.linkParticles(p,p2); + } + + /* attract particles */ + if(pJS.particles.move.attract.enable){ + pJS.fn.interact.attractParticles(p,p2); + } + + /* bounce particles */ + if(pJS.particles.move.bounce){ + pJS.fn.interact.bounceParticles(p,p2); + } + + } + } + + + } + + }; + + pJS.fn.particlesDraw = function(){ + + /* clear canvas */ + pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); + + /* update each particles param */ + pJS.fn.particlesUpdate(); + + /* draw each particle */ + for(var i = 0; i < pJS.particles.array.length; i++){ + var p = pJS.particles.array[i]; + p.draw(); + } + + }; + + pJS.fn.particlesEmpty = function(){ + pJS.particles.array = []; + }; + + pJS.fn.particlesRefresh = function(){ + + /* init all */ + cancelRequestAnimFrame(pJS.fn.checkAnimFrame); + cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + pJS.tmp.source_svg = undefined; + pJS.tmp.img_obj = undefined; + pJS.tmp.count_svg = 0; + pJS.fn.particlesEmpty(); + pJS.fn.canvasClear(); + + /* restart */ + pJS.fn.vendors.start(); + + }; + + + /* ---------- pJS functions - particles interaction ------------ */ + + pJS.fn.interact.linkParticles = function(p1, p2){ + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + /* draw a line between p1 and p2 if the distance between them is under the config distance */ + if(dist <= pJS.particles.line_linked.distance){ + + var opacity_line = pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance; + + if(opacity_line > 0){ + + /* style */ + var color_line = pJS.particles.line_linked.color_rgb_line; + pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; + pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; + //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ + + /* path */ + pJS.canvas.ctx.beginPath(); + pJS.canvas.ctx.moveTo(p1.x, p1.y); + pJS.canvas.ctx.lineTo(p2.x, p2.y); + pJS.canvas.ctx.stroke(); + pJS.canvas.ctx.closePath(); + + } + + } + + }; + + + pJS.fn.interact.attractParticles = function(p1, p2){ + + /* condensed particles */ + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + if(dist <= pJS.particles.line_linked.distance){ + + var ax = dx/(pJS.particles.move.attract.rotateX*1000), + ay = dy/(pJS.particles.move.attract.rotateY*1000); + + p1.vx -= ax; + p1.vy -= ay; + + p2.vx += ax; + p2.vy += ay; + + } + + + } + + + pJS.fn.interact.bounceParticles = function(p1, p2){ + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy), + dist_p = p1.radius+p2.radius; + + if(dist <= dist_p){ + p1.vx = -p1.vx; + p1.vy = -p1.vy; + + p2.vx = -p2.vx; + p2.vy = -p2.vy; + } + + } + + + /* ---------- pJS functions - modes events ------------ */ + + pJS.fn.modes.pushParticles = function(nb, pos){ + + pJS.tmp.pushing = true; + + for(var i = 0; i < nb; i++){ + pJS.particles.array.push( + new pJS.fn.particle( + pJS.particles.color, + pJS.particles.opacity.value, + { + 'x': pos ? pos.pos_x : Math.random() * pJS.canvas.w, + 'y': pos ? pos.pos_y : Math.random() * pJS.canvas.h + } + ) + ) + if(i == nb-1){ + if(!pJS.particles.move.enable){ + pJS.fn.particlesDraw(); + } + pJS.tmp.pushing = false; + } + } + + }; + + + pJS.fn.modes.removeParticles = function(nb){ + + pJS.particles.array.splice(0, nb); + if(!pJS.particles.move.enable){ + pJS.fn.particlesDraw(); + } + + }; + + + pJS.fn.modes.bubbleParticle = function(p){ + + /* on hover event */ + if(pJS.interactivity.events.onhover.enable && isInArray('bubble', pJS.interactivity.events.onhover.mode)){ + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), + ratio = 1 - dist_mouse / pJS.interactivity.modes.bubble.distance; + + function init(){ + p.opacity_bubble = p.opacity; + p.radius_bubble = p.radius; + } + + /* mousemove - check ratio */ + if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ + + if(ratio >= 0 && pJS.interactivity.status == 'mousemove'){ + + /* size */ + if(pJS.interactivity.modes.bubble.size != pJS.particles.size.value){ + + if(pJS.interactivity.modes.bubble.size > pJS.particles.size.value){ + var size = p.radius + (pJS.interactivity.modes.bubble.size*ratio); + if(size >= 0){ + p.radius_bubble = size; + } + }else{ + var dif = p.radius - pJS.interactivity.modes.bubble.size, + size = p.radius - (dif*ratio); + if(size > 0){ + p.radius_bubble = size; + }else{ + p.radius_bubble = 0; + } + } + + } + + /* opacity */ + if(pJS.interactivity.modes.bubble.opacity != pJS.particles.opacity.value){ + + if(pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value){ + var opacity = pJS.interactivity.modes.bubble.opacity*ratio; + if(opacity > p.opacity && opacity <= pJS.interactivity.modes.bubble.opacity){ + p.opacity_bubble = opacity; + } + }else{ + var opacity = p.opacity - (pJS.particles.opacity.value-pJS.interactivity.modes.bubble.opacity)*ratio; + if(opacity < p.opacity && opacity >= pJS.interactivity.modes.bubble.opacity){ + p.opacity_bubble = opacity; + } + } + + } + + } + + }else{ + init(); + } + + + /* mouseleave */ + if(pJS.interactivity.status == 'mouseleave'){ + init(); + } + + } + + /* on click event */ + else if(pJS.interactivity.events.onclick.enable && isInArray('bubble', pJS.interactivity.events.onclick.mode)){ + + + if(pJS.tmp.bubble_clicking){ + var dx_mouse = p.x - pJS.interactivity.mouse.click_pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.click_pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), + time_spent = (new Date().getTime() - pJS.interactivity.mouse.click_time)/1000; + + if(time_spent > pJS.interactivity.modes.bubble.duration){ + pJS.tmp.bubble_duration_end = true; + } + + if(time_spent > pJS.interactivity.modes.bubble.duration*2){ + pJS.tmp.bubble_clicking = false; + pJS.tmp.bubble_duration_end = false; + } + } + + + function process(bubble_param, particles_param, p_obj_bubble, p_obj, id){ + + if(bubble_param != particles_param){ + + if(!pJS.tmp.bubble_duration_end){ + if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ + if(p_obj_bubble != undefined) var obj = p_obj_bubble; + else var obj = p_obj; + if(obj != bubble_param){ + var value = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration); + if(id == 'size') p.radius_bubble = value; + if(id == 'opacity') p.opacity_bubble = value; + } + }else{ + if(id == 'size') p.radius_bubble = undefined; + if(id == 'opacity') p.opacity_bubble = undefined; + } + }else{ + if(p_obj_bubble != undefined){ + var value_tmp = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration), + dif = bubble_param - value_tmp; + value = bubble_param + dif; + if(id == 'size') p.radius_bubble = value; + if(id == 'opacity') p.opacity_bubble = value; + } + } + + } + + } + + if(pJS.tmp.bubble_clicking){ + /* size */ + process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size'); + /* opacity */ + process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity'); + } + + } + + }; + + + pJS.fn.modes.repulseParticle = function(p){ + + if(pJS.interactivity.events.onhover.enable && isInArray('repulse', pJS.interactivity.events.onhover.mode) && pJS.interactivity.status == 'mousemove') { + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); + + var normVec = {x: dx_mouse/dist_mouse, y: dy_mouse/dist_mouse}, + repulseRadius = pJS.interactivity.modes.repulse.distance, + velocity = 100, + repulseFactor = clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50); + + var pos = { + x: p.x + normVec.x * repulseFactor, + y: p.y + normVec.y * repulseFactor + } + + if(pJS.particles.move.out_mode == 'bounce'){ + if(pos.x - p.radius > 0 && pos.x + p.radius < pJS.canvas.w) p.x = pos.x; + if(pos.y - p.radius > 0 && pos.y + p.radius < pJS.canvas.h) p.y = pos.y; + }else{ + p.x = pos.x; + p.y = pos.y; + } + + } + + + else if(pJS.interactivity.events.onclick.enable && isInArray('repulse', pJS.interactivity.events.onclick.mode)) { + + if(!pJS.tmp.repulse_finish){ + pJS.tmp.repulse_count++; + if(pJS.tmp.repulse_count == pJS.particles.array.length){ + pJS.tmp.repulse_finish = true; + } + } + + if(pJS.tmp.repulse_clicking){ + + var repulseRadius = Math.pow(pJS.interactivity.modes.repulse.distance/6, 3); + + var dx = pJS.interactivity.mouse.click_pos_x - p.x, + dy = pJS.interactivity.mouse.click_pos_y - p.y, + d = dx*dx + dy*dy; + + var force = -repulseRadius / d * 1; + + function process(){ + + var f = Math.atan2(dy,dx); + p.vx = force * Math.cos(f); + p.vy = force * Math.sin(f); + + if(pJS.particles.move.out_mode == 'bounce'){ + var pos = { + x: p.x + p.vx, + y: p.y + p.vy + } + if (pos.x + p.radius > pJS.canvas.w) p.vx = -p.vx; + else if (pos.x - p.radius < 0) p.vx = -p.vx; + if (pos.y + p.radius > pJS.canvas.h) p.vy = -p.vy; + else if (pos.y - p.radius < 0) p.vy = -p.vy; + } + + } + + // default + if(d <= repulseRadius){ + process(); + } + + // bang - slow motion mode + // if(!pJS.tmp.repulse_finish){ + // if(d <= repulseRadius){ + // process(); + // } + // }else{ + // process(); + // } + + + }else{ + + if(pJS.tmp.repulse_clicking == false){ + + p.vx = p.vx_i; + p.vy = p.vy_i; + + } + + } + + } + + } + + + pJS.fn.modes.grabParticle = function(p){ + + if(pJS.interactivity.events.onhover.enable && pJS.interactivity.status == 'mousemove'){ + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); + + /* draw a line between the cursor and the particle if the distance between them is under the config distance */ + if(dist_mouse <= pJS.interactivity.modes.grab.distance){ + + var opacity_line = pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1/pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance; + + if(opacity_line > 0){ + + /* style */ + var color_line = pJS.particles.line_linked.color_rgb_line; + pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; + pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; + //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ + + /* path */ + pJS.canvas.ctx.beginPath(); + pJS.canvas.ctx.moveTo(p.x, p.y); + pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y); + pJS.canvas.ctx.stroke(); + pJS.canvas.ctx.closePath(); + + } + + } + + } + + }; + + + + /* ---------- pJS functions - vendors ------------ */ + + pJS.fn.vendors.eventsListeners = function(){ + + /* events target element */ + if(pJS.interactivity.detect_on == 'window'){ + pJS.interactivity.el = window; + }else{ + pJS.interactivity.el = pJS.canvas.el; + } + + + /* detect mouse pos - on hover / click event */ + if(pJS.interactivity.events.onhover.enable || pJS.interactivity.events.onclick.enable){ + + /* el on mousemove */ + pJS.interactivity.el.addEventListener('mousemove', function(e){ + + if(pJS.interactivity.el == window){ + var pos_x = e.clientX, + pos_y = e.clientY; + } + else{ + var pos_x = e.offsetX || e.clientX, + pos_y = e.offsetY || e.clientY; + } + + pJS.interactivity.mouse.pos_x = pos_x; + pJS.interactivity.mouse.pos_y = pos_y; + + if(pJS.tmp.retina){ + pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio; + pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio; + } + + pJS.interactivity.status = 'mousemove'; + + }); + + /* el on onmouseleave */ + pJS.interactivity.el.addEventListener('mouseleave', function(e){ + + pJS.interactivity.mouse.pos_x = null; + pJS.interactivity.mouse.pos_y = null; + pJS.interactivity.status = 'mouseleave'; + + }); + + } + + /* on click event */ + if(pJS.interactivity.events.onclick.enable){ + + pJS.interactivity.el.addEventListener('click', function(){ + + pJS.interactivity.mouse.click_pos_x = pJS.interactivity.mouse.pos_x; + pJS.interactivity.mouse.click_pos_y = pJS.interactivity.mouse.pos_y; + pJS.interactivity.mouse.click_time = new Date().getTime(); + + if(pJS.interactivity.events.onclick.enable){ + + switch(pJS.interactivity.events.onclick.mode){ + + case 'push': + if(pJS.particles.move.enable){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); + }else{ + if(pJS.interactivity.modes.push.particles_nb == 1){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); + } + else if(pJS.interactivity.modes.push.particles_nb > 1){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb); + } + } + break; + + case 'remove': + pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb); + break; + + case 'bubble': + pJS.tmp.bubble_clicking = true; + break; + + case 'repulse': + pJS.tmp.repulse_clicking = true; + pJS.tmp.repulse_count = 0; + pJS.tmp.repulse_finish = false; + setTimeout(function(){ + pJS.tmp.repulse_clicking = false; + }, pJS.interactivity.modes.repulse.duration*1000) + break; + + } + + } + + }); + + } + + + }; + + pJS.fn.vendors.densityAutoParticles = function(){ + + if(pJS.particles.number.density.enable){ + + /* calc area */ + var area = pJS.canvas.el.width * pJS.canvas.el.height / 1000; + if(pJS.tmp.retina){ + area = area/(pJS.canvas.pxratio*2); + } + + /* calc number of particles based on density area */ + var nb_particles = area * pJS.particles.number.value / pJS.particles.number.density.value_area; + + /* add or remove X particles */ + var missing_particles = pJS.particles.array.length - nb_particles; + if(missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles)); + else pJS.fn.modes.removeParticles(missing_particles); + + } + + }; + + + pJS.fn.vendors.checkOverlap = function(p1, position){ + for(var i = 0; i < pJS.particles.array.length; i++){ + var p2 = pJS.particles.array[i]; + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + if(dist <= p1.radius + p2.radius){ + p1.x = position ? position.x : Math.random() * pJS.canvas.w; + p1.y = position ? position.y : Math.random() * pJS.canvas.h; + pJS.fn.vendors.checkOverlap(p1); + } + } + }; + + + pJS.fn.vendors.createSvgImg = function(p){ + + /* set color to svg element */ + var svgXml = pJS.tmp.source_svg, + rgbHex = /#([0-9A-F]{3,6})/gi, + coloredSvgXml = svgXml.replace(rgbHex, function (m, r, g, b) { + if(p.color.rgb){ + var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+p.opacity+')'; + }else{ + var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+p.opacity+')'; + } + return color_value; + }); + + /* prepare to create img with colored svg */ + var svg = new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}), + DOMURL = window.URL || window.webkitURL || window, + url = DOMURL.createObjectURL(svg); + + /* create particle img obj */ + var img = new Image(); + img.addEventListener('load', function(){ + p.img.obj = img; + p.img.loaded = true; + DOMURL.revokeObjectURL(url); + pJS.tmp.count_svg++; + }); + img.src = url; + + }; + + + pJS.fn.vendors.destroypJS = function(){ + cancelAnimationFrame(pJS.fn.drawAnimFrame); + canvas_el.remove(); + pJSDom = null; + }; + + + pJS.fn.vendors.drawShape = function(c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator){ + + // By Programming Thomas - https://programmingthomas.wordpress.com/2013/04/03/n-sided-shapes/ + var sideCount = sideCountNumerator * sideCountDenominator; + var decimalSides = sideCountNumerator / sideCountDenominator; + var interiorAngleDegrees = (180 * (decimalSides - 2)) / decimalSides; + var interiorAngle = Math.PI - Math.PI * interiorAngleDegrees / 180; // convert to radians + c.save(); + c.beginPath(); + c.translate(startX, startY); + c.moveTo(0,0); + for (var i = 0; i < sideCount; i++) { + c.lineTo(sideLength,0); + c.translate(sideLength,0); + c.rotate(interiorAngle); + } + //c.stroke(); + c.fill(); + c.restore(); + + }; + + pJS.fn.vendors.exportImg = function(){ + window.open(pJS.canvas.el.toDataURL('image/png'), '_blank'); + }; + + + pJS.fn.vendors.loadImg = function(type){ + + pJS.tmp.img_error = undefined; + + if(pJS.particles.shape.image.src != ''){ + + if(type == 'svg'){ + + var xhr = new XMLHttpRequest(); + xhr.open('GET', pJS.particles.shape.image.src); + xhr.onreadystatechange = function (data) { + if(xhr.readyState == 4){ + if(xhr.status == 200){ + pJS.tmp.source_svg = data.currentTarget.response; + pJS.fn.vendors.checkBeforeDraw(); + }else{ + console.log('Error pJS - Image not found'); + pJS.tmp.img_error = true; + } + } + } + xhr.send(); + + }else{ + + var img = new Image(); + img.addEventListener('load', function(){ + pJS.tmp.img_obj = img; + pJS.fn.vendors.checkBeforeDraw(); + }); + img.src = pJS.particles.shape.image.src; + + } + + }else{ + console.log('Error pJS - No image.src'); + pJS.tmp.img_error = true; + } + + }; + + + pJS.fn.vendors.draw = function(){ + + if(pJS.particles.shape.type == 'image'){ + + if(pJS.tmp.img_type == 'svg'){ + + if(pJS.tmp.count_svg >= pJS.particles.number.value){ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + }else{ + //console.log('still loading...'); + if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + }else{ + + if(pJS.tmp.img_obj != undefined){ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + }else{ + if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + } + + }else{ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + }; + + + pJS.fn.vendors.checkBeforeDraw = function(){ + + // if shape is image + if(pJS.particles.shape.type == 'image'){ + + if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg == undefined){ + pJS.tmp.checkAnimFrame = requestAnimFrame(check); + }else{ + //console.log('images loaded! cancel check'); + cancelRequestAnimFrame(pJS.tmp.checkAnimFrame); + if(!pJS.tmp.img_error){ + pJS.fn.vendors.init(); + pJS.fn.vendors.draw(); + } + + } + + }else{ + pJS.fn.vendors.init(); + pJS.fn.vendors.draw(); + } + + }; + + + pJS.fn.vendors.init = function(){ + + /* init canvas + particles */ + pJS.fn.retinaInit(); + pJS.fn.canvasInit(); + pJS.fn.canvasSize(); + pJS.fn.canvasPaint(); + pJS.fn.particlesCreate(); + pJS.fn.vendors.densityAutoParticles(); + + /* particles.line_linked - convert hex colors to rgb */ + pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color); + + }; + + + pJS.fn.vendors.start = function(){ + + if(isInArray('image', pJS.particles.shape.type)){ + pJS.tmp.img_type = pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3); + pJS.fn.vendors.loadImg(pJS.tmp.img_type); + }else{ + pJS.fn.vendors.checkBeforeDraw(); + } + + }; + + + + + /* ---------- pJS - start ------------ */ + + + pJS.fn.vendors.eventsListeners(); + + pJS.fn.vendors.start(); + + + +}; + +/* ---------- global functions - vendors ------------ */ + +Object.deepExtend = function(destination, source) { + for (var property in source) { + if (source[property] && source[property].constructor && + source[property].constructor === Object) { + destination[property] = destination[property] || {}; + arguments.callee(destination[property], source[property]); + } else { + destination[property] = source[property]; + } + } + return destination; +}; + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +window.cancelRequestAnimFrame = ( function() { + return window.cancelAnimationFrame || + window.webkitCancelRequestAnimationFrame || + window.mozCancelRequestAnimationFrame || + window.oCancelRequestAnimationFrame || + window.msCancelRequestAnimationFrame || + clearTimeout +} )(); + +function hexToRgb(hex){ + // By Tim Down - http://stackoverflow.com/a/5624139/3493650 + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +}; + +function clamp(number, min, max) { + return Math.min(Math.max(number, min), max); +}; + +function isInArray(value, array) { + return array.indexOf(value) > -1; +} + + +/* ---------- particles.js functions - start ------------ */ + +window.pJSDom = []; + +window.particlesJS = function(tag_id, params){ + + //console.log(params); + + /* no string id? so it's object params, and set the id with default id */ + if(typeof(tag_id) != 'string'){ + params = tag_id; + tag_id = 'particles-js'; + } + + /* no id? set the id to default id */ + if(!tag_id){ + tag_id = 'particles-js'; + } + + /* pJS elements */ + var pJS_tag = document.getElementById(tag_id), + pJS_canvas_class = 'particles-js-canvas-el', + exist_canvas = pJS_tag.getElementsByClassName(pJS_canvas_class); + + /* remove canvas if exists into the pJS target tag */ + if(exist_canvas.length){ + while(exist_canvas.length > 0){ + pJS_tag.removeChild(exist_canvas[0]); + } + } + + /* create canvas element */ + var canvas_el = document.createElement('canvas'); + canvas_el.className = pJS_canvas_class; + + /* set size canvas */ + canvas_el.style.width = "100%"; + canvas_el.style.height = "100%"; + + /* append canvas */ + var canvas = document.getElementById(tag_id).appendChild(canvas_el); + + /* launch particle.js */ + if(canvas != null){ + pJSDom.push(new pJS(tag_id, params)); + } + +}; + +window.particlesJS.load = function(tag_id, path_config_json, callback){ + + /* load json config */ + var xhr = new XMLHttpRequest(); + xhr.open('GET', path_config_json); + xhr.onreadystatechange = function (data) { + if(xhr.readyState == 4){ + if(xhr.status == 200){ + var params = JSON.parse(data.currentTarget.response); + window.particlesJS(tag_id, params); + if(callback) callback(); + }else{ + console.log('Error pJS - XMLHttpRequest status: '+xhr.status); + console.log('Error pJS - File config not found'); + } + } + }; + xhr.send(); + +}; \ No newline at end of file diff --git a/blog/assets/js/search-script.js b/blog/assets/js/search-script.js new file mode 100644 index 0000000..7d993de --- /dev/null +++ b/blog/assets/js/search-script.js @@ -0,0 +1,6 @@ +/*! + * Simple-Jekyll-Search + * Copyright 2015-2020, Christian Fei + * Licensed under the MIT License. + */ + !function(){"use strict";var f={compile:function(r){return i.template.replace(i.pattern,function(t,e){var n=i.middleware(e,r[e],i.template);return void 0!==n?n:r[e]||t})},setOptions:function(t){i.pattern=t.pattern||i.pattern,i.template=t.template||i.template,"function"==typeof t.middleware&&(i.middleware=t.middleware)}};const i={pattern:/\{(.*?)\}/g,template:"",middleware:function(){}};var n=function(t,e){var n=e.length,r=t.length;if(n{title}',templateMiddleware:Function.prototype,sortMiddleware:function(){return 0},noResultsText:"No results found",limit:10,fuzzy:!1,debounceTime:null,exclude:[]},n;const e=function(t,e){e?(clearTimeout(n),n=setTimeout(t,e)):t.call()};var r=["searchInput","resultsContainer","json"];const o=m({required:r});function u(t){d.put(t),i.searchInput.addEventListener("input",function(t){-1===[13,16,20,37,38,39,40,91].indexOf(t.which)&&(c(),e(function(){l(t.target.value)},i.debounceTime))})}function c(){i.resultsContainer.innerHTML=""}function s(t){i.resultsContainer.innerHTML+=t}function l(t){var e;(e=t)&&0 { + var str = "
    " + article.title + + "

    - " + article.author + "

    "; + artcilesDiv.append($(str)); + }); +} + +function shuffle(array){ + var count = array.length, randomnumber, temp; + while(count) { + randomnumber = Math.random() * count-- | 0; + temp = array[count]; + array[count] = array[randomnumber]; + array[randomnumber] = temp + } +} + +function loadArticles() { + var articles = []; + var category = $("#category").text().toLowerCase(); + if (category === "diode" || category === "cas/sps") { + category = "cas"; + } + $.getJSON("../search.json", function(result) { + shuffle(result); + + // filter the articles by category + result.some(article => { + article.category = article.category.toLowerCase(); + if (article.category === "diode" || article.category === "cas/sps") { + article.category = "cas"; + } + if (article.category === category) { + articles.push(article); + } + if (articles.length >= 7) { + return true; + } + }); + if (articles.length < 7) { + result.some(article => { + if (articles.indexOf(article) == -1) { + articles.push(article); + } + if (articles.length >= 7) { + return true; + } + }); + } + renderArticles(articles); + }) +} diff --git a/blog/augmented-reality/index.html b/blog/augmented-reality/index.html new file mode 100644 index 0000000..426a5eb --- /dev/null +++ b/blog/augmented-reality/index.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Whether you have played “Pokémon Go” or not, you’ve probably at least heard of the game. A special app on your smartphone or tablet makes it look like Pokémon is right there in front of you  while you search for and “capture” the different characters.  This game aquainted the world with this fast growing technology Augmented Reality. This new technology, blurs the line between what’s real and what’s computer-generated by enhancing what we see, hear, feel and smell.

    + +

    How does Augmented Reality work?

    + +

    In most augmented reality applications, a user will see both synthetic and natural light. This is done by overlaying projected images on top of a pair of see-through goggles or glasses, which allow the images and interactive virtual objects to layer on top of the user’s view of the real world. +For augmented reality to work you need camera,accelerometer,rotation sensor and some math skills and GPS. Idea behind all of this is to use data from real word, data gathered by the sensors, and process it in the way computer can use.

    + +

    Augmented1

    + +

    Make your own AR app !

    + +

    Have you ever dreamed of making your own AR app? But you don’t know how to start? So, let’s see how you can !

    + +

    Vuforia

    +

    Vuforia is one of the most popular platforms to help you work with augmented reality development. The software implements the following functionalities: recognition of the different types of visual objects, text and environments recognition, VuMark (a combination of picture and QR-code). All plugins and functionalities of the platform are free to use but include the Vuforia watermarks.

    + +

    EasyAR

    +

    EasyAR is a free and easy to use alternative to Vuforia. It includes 3D Object Recognition ,Environment perception ,Cloud Recognition , +Smart Glass Solution and App Cloud Packaging. The library is completely free. To start your work with EasyAR, you only need to register the account and to generate the plugin’s key of your Bundle ID. EasyAR is quite easy to integrate

    + +

    Real World Examples of Social Media Apps Using Augmented Reality

    + +

    Snapchat

    + +
    +

    The most popular and ephemeral messaging app is the first name in this high-tech world of Augmented Reality. Founders of this globally used social media app, namely Evan Spiegel, Bobby Murphy and Reggie Brown, aimed for more natural flow of interaction.

    +
    + +

    Facebook

    + +
    +

    Facebook believes that consumer-ready Augmented Reality glasses are bit far from everyday use, but instant and ready-to-use AR devices exist right in our pockets.

    +
    + +

    Facebook

    + +

    Future of Augmented Reality

    + +

    AR may completely revamp how we navigate the world, both indoors and outdoors. Imagine seeing directions before you throughout Walmart to find the laundry detergent you were looking for. It can also help eCommerce shoppers try products at home before they purchase.

    + +

    In the future, all stores will feature 3D models that can be seen in your very room with a click of a button. See how the lamp you want to buy would look in your living room through AR, or the queen size bed that you don’t think will fit in your bedroom.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/automate-the-industries/index.html b/blog/automate-the-industries/index.html new file mode 100644 index 0000000..704c9b6 --- /dev/null +++ b/blog/automate-the-industries/index.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Automate The Industries

    + +

    Industrial Automation refers to the use of sensors, robots , actuators in various industrial processes so that we get much better efficiency and the working labour required is low. Although the initial cost of setup of an automated industry is high, but the industrialists will surely be in profit if they apply the automation method as they can produce more no of goods in a limited time and also the quality of their products will increase as the human error in production is minimised.

    + +

    Here are some of the industrial processes in which we can use automation:-

    + +
      +
    1. +

      Welding:- Welding is one of the most important process in every manufacturing industry.Lets take an example of the automobile industry. Chassis - the supporting frame of a car needs a lot of welding to be done. We can’t make the whole chassis of a car by just the casting process as it’s too intricate. What we do is cast the individual parts of the chassis and then weld them together to get final chassis. Similarly there are many other industrial manufacturing activities that requires welding. Hence a lot of industries can use welding Robots instead of humans doing the welding process.This is because if Industries use Welding Robots , then the defects that arise due to welding will decrease and hence the quality of product can be enhanced. +Image1

      +
    2. +
    3. +

      Assembling Robots:- +Assembling is the most important phase of a manufacturing process and it requires skilled labourers as various parts must be assembled as per the design. Robots can simplify this task as the final design can be loaded into robot’s memory and based on the design , the robot can be coded to perform various assembling tasks. +Image2

      +
    4. +
    + +

    The image shows a robot involved in automation of car assembly process

    + +
      +
    1. CNC machines:- CNC machines are the automatic versions of traditional machines on which we perform metal removal operations. The tool motion can be controlled through various G codes and M codes in a CNC machine and we can obtain the desired final workpiece. +Image3
    2. +
    + +

    The image shows robot used in packaging.

    + +

    Image4

    + +

    Robotic Vision being employed for product testing Basically we must adopt Flexible Manufacturing System (FMS)for maximising the output of Industries. By using this method , we can effective maintain the flow of material through FML(Flexible Manufacturing Line)that’s going to undergo a certain process in FMC’s(Flexible Manufacturing Cells).

    + +

    Some more places where the concept of automation can be applied:-

    + +
      +
    1. +

      Effluent Treatment Plants(ETPs):- Every chemical Industry produces a lots of waste material called effluents which must be treated before dumping them into industries. These effluents are treated in effluent treatment plants. Even after treating the effluents through ETPs in first pass, there can still be presence of unwanted materials which can affect the river bodies in which this effluents are dumped. Also the temperature at which these effluents are thrown to the water bodies is a factor because aquatic animals cannot resist temperature difference of water. Water Quality sensors,temperature sensors can be used to check the water quality at the outlet of ETPs and if they don’t meet the required criteria for the disposal, these can be sent back to the ETPs through other pipes automatically by operating valves and servo motors to control it. This can be a small step towards protection of environment.

      +
    2. +
    3. +

      Thermal Power Plants:- In thermal Power plants the majority of accidents are caused because of bursting of boilers mostly because there were some impurities in the water that was poured into it due to which excess temperature was required to heat the water in it and the material that was used to build the boiler was not able to withstand such high temperature. Automation can be used here by making use of temperature sensors ( the one which are able to measure high temperatures).If the temperature measured by this sensors go beyond 0.8 times the max temperature that can be withstanded by the boiler material , the heat supply to the boiler must be automatically cut off. By this we can ensure lesser accidents in Thermal Power Plants.

      +
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/autopilot/index.html b/blog/autopilot/index.html new file mode 100644 index 0000000..7edbf7b --- /dev/null +++ b/blog/autopilot/index.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    AUTOPILOTS

    + +

    An autopilot is a flight control system that allows a pilot to fly an airplane without continuous hands-on control of the airplane. It allows the pilot to focus on higher-order tasks such as navigating, communicating with air traffic control, planning for weather contingencies and rerouting associated with any kind of emergency circumstance.

    + +

    A simple autopilot combined with conventional navigation instruments.

    + +

    FIRST AUTOPILOTS

    + +

    In the early days of aviation, pilots had to control the aircraft all the time to fly safely. As aircraft range increased and the flight durations increased, it became a serious problem for the pilots to continuously control the aircraft.

    + +

    A World War II-era Honeywell C-1 autopilot control panel.

    + +

    Autopilot systems have been around since the early 20th century. According to Wikipedia, the first functional autopilot system developed in 1912 by the electronics company Sperry Corporation had an autopilot system with a gyroscope, altitude, and operated elevators as well as rudders.

    + +

    AUTOPILOTS IN MODERN AIRCRAFTS

    + +

    Autopilots in Modern Aircrafts

    + +

    Autopilot in aircraft with more than twenty seats is generally made compulsory by international aviation rules and regulations. Autopilots in modern aircraft are three-axis and they control the aircraft during climbs, descents, cruise, and approach to landing. Some even integrate an auto-throttle function that automatically controls engine thrust that makes auto landings possible. +For further automatic control, flight management systems have been developed. Through the use of computers, an entire flight profile can be programmed ahead of time allowing the pilot to supervise its execution. An FMS computer coordinates nearly every aspect of a flight, including the autopilot and autothrottle systems, navigation route selection, fuel management schemes, and more.

    + +

    Control Wheel Steering(CWS) is an option midway between fully automated flight and manual flying. Although CWS is less used in modern airliners, it is still a function on many aircraft today. CWS gives stability in pitch and roll. In this system, the limitations of the aircraft can be observed by the flight computer, and the pilot cannot steer the aircraft past these limits.

    + +

    Control wheel steering

    + +

    COMPUTER SYSTEM DETAILS

    + +

    The hardware of an autopilot varies with implementation but is generally designed according to the need and reliability of the aircraft. Software and hardware in an autopilot are put to extensive tests. Some autopilots also use design diversity. In this safety feature, each computer will run software created by different engineering teams(to avoid similar mistakes), often being programmed in different programming languages. +Stability Augmentation System (SAS) is another type of automatic flight control system; in case the aircraft does not possess the stability characteristics as per the requirements of flying and handling qualities then stability augmentation system is used to artificially augment the stability of the aircraft. SAS can automatically stabilize the aircraft in one or more axes.

    + +

    Disadvantages of the Autopilot: +1) Pilots should maintain manual flying skills. The competent pilots should always be prepared to fly manually in case of an autopilot failure. +2) Turbulence. The pilot’s operating handbook (POH) prohibits the use of altitude hold function during moderate or severe turbulence. Some autopilots disengage when certain limits are encountered due to turbulence. +3) Minimum altitude. Autopilots should only be used above specific altitude above the ground level. Pilots should refer to the flight manual such that the aircraft does not operate outside the specified limits. +4) Possible malfunction. Whenever the pilot observes an unusual behavior from the autopilot, he or she should disengage the autopilot immediately.

    + +

    Autopilot has evolved over the years but it cannot replace the pilots. Therefore at least one pilot is required in the cockpit.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/avionics/index.html b/blog/avionics/index.html new file mode 100644 index 0000000..29f41c4 --- /dev/null +++ b/blog/avionics/index.html @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The merging of the words aviation and electronics, Avionics are all of the electronic devices and systems which perform individualized functions, used on any aircraft. Whether it is a military standard drone or a small hobby craft, it contains many electronic components which together achieve controlled flight. In this blog I’m going to talk mainly on the electronics aspect of the equipment used in small scale aircraft and drones.

    + +

    Accelerometer

    + +

    Accelerometer

    + +

    Accelometer IC

    + +

    An accelerometer is a transducer that is used to measure the physical or measurable acceleration that is made by an object. The most commonly used device is the piezoelectric accelerometer. It makes use of a piezoelectric quartz crystal. Due to the special self-generating property, the crystal produces a voltage that is proportional to the accelerative force. The basic arrangement is shown in the figure above. When movement occurs in one direction the amplitude of voltage signal generated gives the amount of acceleration. Coupled with two more setups in two other axes’ give complete 3dimentional acceleration. Well known algorithms exist to calculate the speed increase or displacement based on this data. This type of device is called dynamic accelerometer and the movement of the object can be foreseen using it.

    + +

    Nowadays, a new type of accelerometer called the Micro Electro-Mechanical System (MEMS) Accelerometer is being used as it is simple, reliable and highly cost effective.

    + +

    Gyroscope

    + +

    A gyroscope is a device that is used to measure angular velocity. It is similar to accelerometer in working. More precisely called Vibration gyro sensors sense angular velocity from the Coriolis force applied to a vibrating element. the accuracy with which angular velocity is measured differs significantly depending on element material and structural differences. Here is an example of how gyroscope using Epson ‘s double-T structure crystal element works

    + +
      +
    1. Normally, a drive arm vibrates in a certain direction.
    2. +
    + +

    Drive arm vibration

    + +
      +
    1. Direction of rotation
    2. +
    + +

    rotation

    + +
      +
    1. When the gyro is rotated, the Coriolis force acts on the drive arms, producing vertical vibration
    2. +
    + +

    vertical vibration

    + +
      +
    1. The stationary part bends due to vertical drive arm vibration, producing a sensing motion in the sensing arms.
    2. +
    + +

    sensing motion

    + +
      +
    1. The motion of a pair of sensing arms produces a potential difference from which angular velocity is sensed. The angular velocity is converted to, and output as, an electrical signal.
      +Electrical Signal
    2. +
    + +

    Servo Motor

    + +

    Working of Servo

    + +

    MicroServo

    + +

    Servo motors are specially designed motors to be used in control applications of drones. They are used for precise position and speed control at high torques. It consists of a suitable motor, position sensor and a sophisticated controller. Servomechanism is basically a closed-loop system, consisting of a controlled device, controller, output sensor and feedback system.

    + +

    Mechanical position of the shaft can be sensed by using a potentiometer, which is coupled with the motor shaft through gears. The current position of the shaft is converted into electrical signal by the potentiometer, and the compared with the command input signal. Command input is given according to the required position of the shaft. If the feedback signal differs from the given input, an error signal is generated. This error signal is then amplified and applied as the input to the motor, which causes the motor to rotate. And when the shaft reaches to the required position, error signal becomes zero, and hence the motor stays standstill holding the position.

    + +

    In modern servo motors, electronic encoders (Gray code) or sensors are used to sense the position of the shaft.

    + +

    Electronic Speed Controller

    + +

    ESC

    + +

    ESCs are used to vary the speed of main motor that is used to provide the thrust for the aircraft. They work on the principle of Pulse width modulation. The control of motor speed is obtained by switching the power to the motor on and off in various ratios e.g. maximum throttle is permanently on, half throttle is on half time, off half time etc. This switching on and off is done many times a second. The speed at which the switching takes place has a large effect on overall efficiency.

    + +

    Early speed controls used what is known as “frame rate” switching, which means that they switched approximately 50 times a second, the same rate as frames of information are delivered over the radio. Most modern ESCs switch at a much higher rate which makes them much more efficient i.e. they lose less power as heat in the controller. Switching rates around 3000 Hz (times a second) are about optimum. Anywhere between 1000 Hz and 5000Hz is acceptable.

    + +

    Modern ESCs also contain a BEC inbuilt in them. A battery eliminator circuit (BEC) is an electronic circuit designed to deliver electrical power to other circuitry without the need for multiple batteries. A BEC-equipped ESC meant for airplane use often incorporates a low-voltage-cut off (LVC) circuit which can sense the voltage drop caused when the battery has little charge left in it. It then cuts the power to the ‘drive’ motor in order to provide the ‘steering’ servo(s) with enough power to be able to bring the model safely back to the operator. The power to the propeller would be cut but the operation of the control surfaces would be maintained in order to perform a dead-stick landing. Without this feature, all control would be lost when the battery expired, probably resulting in the destruction of the model. R/C BECs in their simplest form use a linear fixed voltage regulator.

    + +

    Transmitter and Receiver

    + +

    In order to control a drone remotely, you must be able to communicate with it wirelessly. This is when circuits which convert electrical signals into radio signals and vice versa are used in avionics.

    + +

    Radio frequency transreciever

    + +

    They are usually frequency modulated signal generators and demodulators. While controlling your drone it may so happen that another person’s signal may interfere with you. To avoid situations such as your drone being controlled by someone else’s remote control, devices use a unique identification code to identify a transmission on one particular radio frequency as the transmission it wants to receive. To do this, transmitters and receivers are paired using an RFID or a “radio frequency identification.” All information broadcast over RFID is prefixed with an RFID so that the receiver knows that the information it is picking up is for it. Along with this RSSI method is used to detect the distance of drone from controller and if it is going out of range.

    + +

    Apart from this various circuits like power distribution boards and FPVs exists which give additional functionality to the drone. The field has advanced so much that autonomous intercontinental flight also is possible for a small-scale drone.

    + +

    References

    +
      +
    1. +

      http://www.instrumentationtoday.com/accelerometer/2011/08/

      +
    2. +
    3. +

      https://www.quora.com/What-the-function-of-gyroscopes-in-airplane

      +
    4. +
    5. +

      https://www.electricaleasy.com/2015/01/how-does-servo-motor-work.html

      +
    6. +
    7. +

      https://www.dummies.com/consumer-electronics/drones/understanding-how-your-drone-is-controlled/

      +
    8. +
    9. +

      https://uavcoach.com/infographic-drones-work/

      +
    10. +
    11. +

      https://www.dimensionengineering.com/info/bec

      +
    12. +
    13. +

      https://www.quora.com/How-does-ESC-electronic-speed-control-work

      +
    14. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/ballistics/index.html b/blog/ballistics/index.html new file mode 100644 index 0000000..2b02c15 --- /dev/null +++ b/blog/ballistics/index.html @@ -0,0 +1,535 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Ballistics is the science of the propulsion, flight, and impact of projectiles especially bullets, unguided bombs or rockets. It is divided into several disciplines. Internal and external ballistics, respectively, deal with the propulsion and the flight of projectiles. The transition between these two regimes is called intermediate ballistics. Terminal ballistics concerns the impact of projectiles which is a separate category that study the wounding of personnel

    + +

    Internal Ballistics

    + +

    A fire arm cartridge contains four components namely Primer, Case, Propellent and Bullet__. The basic working of a fire arm is that when the trigger is pressed the firing pin of the gun strikes the primer of the cartridge. When the firing pin hit the primer, the primer explodes which will ignite the propellent (In some modern guns electric signals are also used for igniting the powder). The ignition of propellent produce gases which pushes the bullet out of the barrel. In fire arms the internal ballistics deals with the explosion of primer, ignition of the firing till the bullet exits the barrel. +1 +The study of internal ballistics is important in the design of the chamber and barrel of the fire arm. Bullets fired from a rifle will have more energy than similar bullets fired from a handgun. More powder can also be used in rifle cartridges because the bullet chambers can be designed to withstand greater pressures (50,000 to 70,000 for rifles psi vs. 30,000 to 40,000 psi for handgun chamber). Higher pressures require a bigger gun with more recoil that is slower to load and generates more heat that produces more wear on the metal. It is difficult in practice to measure the forces within a gun barrel, but the one easily measured parameter is the velocity with which the bullet exits the barrel (muzzle velocity). The controlled expansion of gases from burning gunpowder generates pressure (force/area). The area here is the base of the bullet (equivalent to diameter of barrel) and is a constant. Therefore, the energy transmitted to the bullet (with a given mass) will depend upon mass times force times the time interval over which the force is applied. The last of these factors is a function of barrel length. Bullet travel through a gun barrel is characterized by increasing acceleration as the expanding gases push on it, but decreasing pressure in the barrel as the gas expands. Up to a point of diminishing pressure, the longer the barrel, the greater the acceleration of the bullet.

    + +

    Rifling of barrel

    + +

    In firearms, rifling is the helical groove pattern that is machined into the internal (bore) surface of a guns barrel, for the purpose of exerting torque and thus imparting a spin to a projectile around its longitudinal axis during shooting. This spin to serves gyroscopically stabilize the projectile by conservation of angular momentum, improving its aerodynamic stability and accuracy over smooth bore designs. +2

    + +

    Transitional ballistics

    + +

    The study of transitional ballistics is used for design of accessories like flash suppressors, sound suppressors and recoil compensators. The study of transitional ballistics is difficult as it involves a number of variables which is not properly defined. When the bullet reaches the muzzle of the barrel, the escaping gases are still, in many cases, at hundreds of atmospheres of pressure. Once the bullet exits the barrel, breaking the seal, the gases are free to move past the bullet and expand in all directions. This expansion is what gives gunfire its explosive sound and is often accompanied by a bright flash as the gases combine with the oxygen in the air and finish combusting.

    + +

    The propellant gases continue to exert force on the bullet and firearm for a short while after the bullet leaves the barrel. One of the essential elements of accurizing a firearm is to make sure that this force does not disrupt the bullet from its path

    + +

    External Ballistics

    + +

    Exterior ballistics deals with that portion of the bullet’s flight from the moment it leaves the muzzle until its impacts. In a handgun, especially a defensive arm, the flight of the bullet is rather short, and the atmosphere and laws of physics have less opportunity to influence things. In a high-powered rifle, these forces have plenty of time to show their effects. To be able to put that bullet precisely on target, you need to fully understand how the bullet will react to your environment at a wide variety of ranges. Entire lifetimes have been spent in pursuit of the accurate prediction of bullet trajectories. While the answers are out there, the science of ballistics is constantly evolving, and our ability to quantify and predict the values associated with the bullet’s path is improving all the time. When in flight, the main forces acting on the projectile are gravity, drag and if present wind. Gravity imparts a downward acceleration on the projectile, causing it to drop from the line of sight. Drag or the air resistance decelerates the projectile with a force proportional to the square of the velocity (or cube, or even higher powers of v, depending on the speed of the projectile). Wind makes the projectile deviate from its trajectory. During flight, gravity, drag and wind have a major impact on the path of the projectile, and must be accounted for when predicting how the projectile will travel. +3

    + +

    The maximum practical range of all small arms and especially high-powered sniper rifles depends mainly on the aerodynamic or ballistic efficiency of the spin stabilized projectiles used. Long-range shooters must also collect relevant information to calculate elevation and windage corrections to be able to achieve first shot strikes. The data to calculate these fire control corrections has a long list of variables including:

    + +
      +
    • Ballistic coefficient of the bullets used
    • +
    • Height of the sighting components above the rifle bore axis
    • +
    • The zero range at which the sighting components and rifle combination were sighted in bullet weight
    • +
    • Actual muzzle velocity (powder temperature affects muzzle velocity, primer ignition is also temperature dependent)
    • +
    • Range to target
    • +
    • Supersonic range of the employed gun, cartridge and bullet combination
    • +
    • Inclination angle in case of uphill/downhill firing
    • +
    • Target speed and direction.
    • +
    • Wind speed and direction (main cause for horizontal projectile deflection and generally the hardest ballistic variable to measure and judge correctly. Wind effects can also cause vertical deflection.)
    • +
    • Air temperature, pressure, altitude and humidity variations (these make up the ambient air density)
    • +
    • earth's gravity (changes slightly with latitude and altitude).
    • +
    • Gyroscopic drift (horizontal and vertical plane gyroscopic effect often know as spin drift - induced by the barrels twist direction and twist rate).
    • +
    • Coriolis effect drift (latitude, direction of fire and hemisphere data dictate this effect).
    • +
    • Lateral throw-off (dispersion that is caused by mass imbalance in the applied projectile).
    • +
    • Aerodynamic jump (dispersion that is caused by lateral (wind) impulses activated during free flight at or very near the muzzle).
    • +
    • The inherent potential accuracy and adjustment range of the sighting components.
    • +
    • The inherent potential accuracy of the rifle.
    • +
    • The inherent potential accuracy of the ammunition.
    • +
    • The inherent potential accuracy of the computer program and other firing control components used to calculate the trajectory.
    • +
    + +

    Terminal ballistics

    + +

    It deals with the effect of the projectiles on target especially the pattern of wound made by the bullet. That’s why it is also called wound ballistics. Bullets produce tissue damage in three ways.

    + +

    Laceration and crushing -

    +

    Tissue damage through laceration and crushing occurs along the path or “track” through the body that a projectile, or its fragments, may produce. The diameter of the crush injury in tissue is the diameter of the bullet or fragment, up to the long axis.

    + +

    Cavitation -

    +

    A “permanent” cavity is caused by the path (track) of the bullet itself with crushing of tissue, whereas a “temporary” cavity is formed by radial stretching around the bullet track from continued acceleration of the medium (air or tissue) in the wake of the bullet, causing the wound cavity to be stretched outward. For projectiles traveling at low velocity the permanent and temporary cavities are nearly the same, but at high velocity and with bullet yaw the temporary cavity becomes larger.

    + +

    Shock waves -

    +

    Shock waves compress the medium and travel ahead of the bullet, as well as to the sides, but these waves last only a few microseconds and do not cause profound destruction at low velocity. At high velocity, generated shock waves can reach up to 200 atmospheres of pressure. However, bone fracture from cavitation is an extremely rare event. The ballistic pressure wave from distant bullet impact can induce a concussive-like effect in humans, causing acute neurological symptoms. +4

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/big-data/index.html b/blog/big-data/index.html new file mode 100644 index 0000000..c080fe9 --- /dev/null +++ b/blog/big-data/index.html @@ -0,0 +1,557 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What is ‘Big data’?

    + +

    In simple terms, Big data is data which can’t comfortably be processed on a single machine. +We live in a world increasingly driven by data. Try googling about big data and you will find some staggering facts like :

    +
      +
    • The amount of data produced by us from the beginning of time till 2003 was 5 billion gigabytes. The same amount was created in every two days in 2011, and in every ten minutes in 2013 !!!
    • +
    • 90% of the world’s data was generated in the last few years.
    • +
    • A report from McKinsey & Co. stated that by 2009, companies with more than 1,000 employees already had more than 200 terabytes of data of their customer’s lives stored.
    • +
    + +

    Big Data is often characterized by 3 Vs (well sometimes even more :P)

    + +
      +
    • Volume refers to the size of data that you’re dealing with.
    • +
    • Variety refers to the fact that the data is often coming from lots of different sources and in many different formats.
    • +
    • Velocity refers to the speed at which the data is being generated, and the speed at which it needs to be made available for processing.
    • +
    + +

    How useful is Big Data ?

    + +

    It is very useful….

    + +

    Think about an e-commerce website. How does Amazon recommend similar products to what you have looked at in the past?

    + +

    Earlier we could only store records of actual purchases. But nowadays,we can store and process all of our Web server log files, along with the purchase data that’s in our traditional data warehouse, with this data we can give the customer a much better shopping experience which should directly translate into bigger profits.

    + +

    Another example is Facebook, every day we feed Facebook’s data beast with mounds of information in the form of likes, messages and picture uploads. With data like this, Facebook knows who our friends are, what we look like, where we are, what we are doing, our likes, our dislikes, and so much more. With this information it is able to suggest us friends, target us with activities and advertisements, use our past activities to get to know our interests and a lot more.

    + +

    In fact, Facebook Inc. analytics chief Ken Rudin says, “Big Data is crucial to the company’s very being”.

    + +

    Challenges with Big Data…

    + +
      +
    • Storing huge amounts of data.
    • +
    • Storing data in varying formats.
    • +
    • Time taken to process the data.
    • +
    + +

    This is where Hadoop comes into the picture.

    + +

    Meet the Elephant - Hadoop !

    +

    Hadoop Logo

    + +

    Hadoop is an open source, Java-based programming framework that supports the processing and storage of extremely large data sets in a distributed computing environment. Hadoop with its distributed processing, handles large volumes of structured and unstructured data more efficiently than the traditional enterprise data warehouse.

    + +

    How does Hadoop help ?

    + +

    The key concept in hadoop is that we split the the data up and store it across a collection of machines, known as a cluster. Then, when we want to process the data, we process it where it’s actually stored. Rather than retrieving the data from a central server, instead it’s already on the cluster, and we can process it in place.

    + +

    History…

    + +

    It all started when Google published a paper about their distributed file system and about their processing framework, MapReduce in 2003. At the same time computer scientists Doug Cutting and Mike Cafarella were working on an Open Source web search engine called Nutch. They needed something scalable because the web was you know, billions of pages - terabytes, petabytes, of data, that needed to be processed. So they decided to reimplement what Google had done in open source. After a couple of years Nutch was up and running on 20 to 40 machines. It wasn’t perfect, it wasn’t totally reliable, but it worked. In January, 2006 Doug went to work for Yahoo and it was there that ‘Hadoop’ came into being. After years of development within the open source community, Hadoop 1.0 became publically available in November 2012 as part of the Apache project sponsored by the Apache Software Foundation.

    + +

    The Hadoop ecosystem

    + +

    The core of Apache Hadoop consists of a storage part, known as Hadoop Distributed File System (HDFS), and a processing part called Hadoop MapReduce. Hadoop Yet Another Resource Negotiator (YARN) is the brain of the Hadoop Ecosystem, which provides resource management and scheduling for user applications.

    + +

    Today, Hadoop is a collection of related subprojects that fall under the umbrella of infrastructure for distributed computing.

    + +

    These include:

    +
      +
    • Flume : A tool used to collect and move huge amounts of streaming data into HDFS.
    • +
    • Hbase : An open source, nonrelational, distributed database.
    • +
    • Hive : A data warehouse that provides data summarization, query and analysis.
    • +
    • Oozie : A server-based workflow scheduling system to manage Hadoop jobs.
    • +
    • Phoenix : An open source, massively parallel processing, relational database engine for Hadoop that is based on Apache Hbase.
    • +
    • Pig : A high-level platform for creating programs that run on Hadoop.
    • +
    • Sqoop : A tool to transfer bulk data between Hadoop and relational databases.
    • +
    • Spark : A fast engine for big data processing capable of streaming and supporting SQL, machine learning and graph processing.
    • +
    • Storm : An open source data processing system.
    • +
    • ZooKeeper : An open source configuration, synchronization and naming registry service for large distributed systems.
    • +
    + +

    Some great resources to get started with Hadoop :

    + + + +

    Happy Hadooping!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/biohacking/index.html b/blog/biohacking/index.html new file mode 100644 index 0000000..aed1e3f --- /dev/null +++ b/blog/biohacking/index.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Ever fantasied becoming the Cyborg from DC comics universe? Well, brace yourself, because that dream is soon to come into reality.

    + +

    Introducing Biohacking, a fairly new practice that could bring major changes in human life as we know it. Biohacking can be defined as a “social movement involving studying basic biology and exploiting it to make electronic implants made using easily available equipment”. In short, you make a cyborg out of yourself. As “punk” as it sounds, this practice caught the attention of media because of the possibilities it opens.

    + +

    RFID chip

    + +

    Ron Shigeta runs Berkeley Biolabs, a biohacking site in Berkeley, California, where dozens of would-be biologists gather frequently to hack around. He says biohacking is “a freedom to explore biology, kind of like you would explore good fiction.” As for the hacking part,

    + +
    +

    “Hacking is kind of like the freedom to sort of dig deep into something, just because you’re interested in it. The whole idea of biohacking is that people feel entitled, they feel the ability to just follow their curiosity — where it should go — and really get to the bottom of something they want to understand.”

    +
    + +

    Amal Graafstra, a leading biohacker, sells a kit so that anyone can be a biohacker.

    + +

    Check his website out!

    + +

    It maybe Bluetooth implants allowing you to control the electrical devices around you, or headbands which allow you to boost your cognitive senses by sending electric impulses directly to your brain. Just imagine the possibilities. People with no vision can experience the beauty of the world, people with no hearing can experience sounds of nature, people with no olfactory senses can smell and taste. All this, in their own garage!

    + +

    MUSE headband

    + +

    Dave Asprey, a nutritionist and the CEO of Bulletproof, tries to incorporate biohacking to improve people’s senses. Check his blog out!

    + +

    Not only can you repair the human body, you can even modify it giving yourself special abilities. This “social movement” is bound to create Iron Mans and Cyborgs in the coming future :D.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/biology-and-electronics/index.html b/blog/biology-and-electronics/index.html new file mode 100644 index 0000000..9b19367 --- /dev/null +++ b/blog/biology-and-electronics/index.html @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The living cell can be considered as an extraordinary piece of engineering, where each of the components of the cell work in precise coordination with utmost efficiency. Each cell generates its own energy which it uses to carry out specific tasks, and in the process, produces waste products which are removed from the cell. We are yet to understand the working of DNA and RNA, which are chains of particular bio molecules arranged in a certain order. This preprogrammed nature of life that allows for replication of molecular strands is what grabs the attention of many scientists today, and its true working is yet to be understood.

    + +

    Cell

    + +

    Over millions of years, human ingenuity and creativity has led to the invention of numerous devices that have changed the way we live today. The evolution of man made technology has reached a parallel to the evolution of cells, and a stage has come where their convergence can mutually benefit each other. This is where bionics comes into play.

    + +

    Bionics is a field of engineering, where mechanical and electronic systems are integrated with biological systems in order to achieve a particular biological advantage. You can think of it as a machine and an organism working together, so that this machine is beneficial to the organism in some way. This field is very rich, and has a lot of scope and application in our world. +One such example, is where it can be used to help mentally and physically challenged people by fixing their biological problems using electronic and mechanical means.

    + +

    Bionic Hand

    + +

    Bionics has reached a pretty impressive stage today, where amputees are fitted with bionic prosthetic limbs, and those with certain brain diseases are fitted with brain implants. These are complex systems that mimic a living organ and appear to be one from the brain’s perspective. They allow for basic limb movements, and newer advances have even given a sensation of touch to it. This will involve mechanical systems such as special joints and structures, motors to mimic muscle actions and electronic systems that are used to establish a communication link between the prosthetic and the brain, and allow it to be controlled and coordinated. The device will receive signals from the brain, which will biologically travel through a network of nerves as electrical impulses, and upon reaching the target site, special decoders are used to decode the information stored in the impules and then carry out the desired task.

    + +

    Brain Implant

    + +

    Developments and study in neuroscience have led to collaborative work between doctors and engineers, wherein problems related to memory loss and organ control have been tackled using special bionic brain implants. A notable example of such an implant is a computer chip that can mimic the working of the hippocampus, which is a part of the brain that deals with short term memory. This is especially useful for people suffering from Alzheimer’s disease where the patient has short term memory loss. +Faulty organs can be rectified using bionics, and one of the best examples of such an invention is the pacemaker. Artificial bionic kidneys and pancreas have been created and are currently under clinical trials.

    + +

    A very important branch of bionics on the nano-scale are nanobots. These are robots whose size ranges between 100nm and 1nm. Nanobots can be considered as machine versions of bacteria and viruses, which help in bringing about changes at the atomic and molecular level and in carrying out breakthroughs in medical science. They are built to work in harsh chemical environments and are usually powered by the chemicals in which they exists or by an on-board battery. +It is said that Nanobots will bring in a new age of medical diagnosis and treatment, allowing doctors to carry out medical procedures on a cellular level which has much better efficiency and effectiveness. They can be used for applications such as closing open wounds, causing blood clots, rebuilding ruptured arteries and veins, and traversing through the body for diagnosis of a particular disease.

    + +

    It must be noted that a cell is an extremely stable unit of life, and any modification of it must be done carefully. Unmonitored use of technology in bionics has the potential of causing more harm than good. However, if allowed to grow on the right path, this field has solutions to majority of the problems that life suffers from today.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/biomicry-creating-a-truly-sustainable-environment/index.html b/blog/biomicry-creating-a-truly-sustainable-environment/index.html new file mode 100644 index 0000000..3cdae6e --- /dev/null +++ b/blog/biomicry-creating-a-truly-sustainable-environment/index.html @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What is something that is common between the bullet train , self cooling houses , super strong adhesives and turbine blades?

    + +

    Well it turns out they are all inspired by nature is profound ways to optimise favourable +characteristics and reduce unfavourable one. Yes! All these products have incorporated within +themselves ideas inspired from nature to solve tricky problems in our world by a process called +as biomimicry . Interested to know more about Biomimicry , stick on.

    + +

    What is biomimicry/biomimetic?

    + +

    Biomimicry is a process in which systems , products , designs are modeled based on the +/adapted from the nature in order to solve problems in real life. Biomimicry can be of two types - form and process.

    + +

    Form biomimicry is the copying of the form/shape of some of the efficient shapes in the nature.

    + +

    For example: the nose shape of the Shinkansen bullet train , the honeycomb structure and so +on. Process biomimicry is copying of the process employed by the nature in making processes best suited for a given problem . for example : the communication technique between ants, the transmigration of birds in nature and so on.

    + +

    A History of Biomimicry

    + +

    One of the early examples of would-be biomimicry was the study of birds to enable human flight. Although never successful in creating a “flying machine”, Leonardo Da Vinci was a keen observer of the anatomy and flight of birds, and made numerous notes and sketches on his observations as well as sketches of “flying machines”. The Wright Brothers, who succeeded in flying the first heavier-than-air aircraft in 1903, allegedly derived inspiration from observations of pigeons in flight.

    + +

    The more recent development in the field of biomimicry has taken place in the mid 20th century with Jack E Steele coining the term bionic in the 1960 and described it as “the science of systems which have some function copied from nature, or which represent characteristics of natural systems or their analogues” .

    + +

    Biomimicry was popularised by scientist and author Janine Benyus in her 1997 book : Biomimicry: Innovation Inspired by Nature .

    + +

    Applications of Biomimicry

    + +

    1.The Shinkansen Bullet train and biomimicry

    + +

    One of the most successful design from biomimicry has been the design of the shinkansen +bullet trains in Japan . Japan is a country which has a very old and developed technical +expwertise in the field of bullet trains. But in 1989 the designers of the Sinkansen bullet train were faced with a major problem . The noise that were produced by these trains tavelling at high speeds was defening and could be heard significantly even at distances upto half a kilometer!.

    + +

    With a high population density in the city areas this became a serious problem for the Shinkansen bullet train authorities. The answer to this problem was finally found out by a designer by the name Eiji Nakatsu who also happened to be a birdwatcher. How did birdwatching help him solve the problem . Well the nose of the engine of the bullet train had to be redesigned in the shape resembling the shape of the beak of a kingfisher bird, which are able to dive into waters to catch their prey without making a splash.

    + +

    Interestingly this design of the engine incresed the eficiency by upto 20 % by reducing the air drag and reduced the noise produces to under 70 DB considered acceptable in residential areas .

    + +

    Bullet Train

    + +

    THE VELCRO

    +

    Swiss electrical engineer George de Mestral invented his first touch fastener when, in 1941, he +went for a walk in the woods and wondered why Burdock seeds clung to his coat and dog. He +discovered it could be turned into something useful. He patented it in 1955 and subsequently +refined and developed its practical manufacture until its commercial introduction in the late +1950s.

    + +

    SELF CLEANING SURFACES

    +

    Self-cleaning surfaces are a class of materials with the inherent ability to remove any debris or bacteria from their surfaces in a variety of ways. The self-cleaning functionality of these surfaces are commonly inspired by natural phenomena observed in lotus leaves , shark skin , gecko feet, and water striders to name a few. All these surfaces have shown exceptional ability to self clean which has inspired many to conduct several researches on it .

    + +

    SELF COOLING BUILDINGS +Global warming is leading to a large scale heat up of our planet , the summers are becoming continuously hotter. People are coming up with better and more efficient cooling technologies.

    + +

    But at the best our cooling technologies require lot of energy which ultimately comes from burning the fossil fuels which contributes to global warming. This is seen as a major problem in the coming times.Is there a solution to this problem ?

    + +

    Well, yes and it already exists in Zimbabwe .In 1996 a Zimbabwean architect Mick Pearce constructed the world’s first ever self cooling building - The Eastgate Centre in Harare. The building is inspired from the cooling mechanism in a termite mound . A series of intricate passages and pores across the building ensure that proper ventilation takes place within the building keeping the temperature inside 2-3 degrees lesser than its surroundings. The surface area of the building exposed to the surrounding is increased increasing the heat transfer to the surroundings and highly thermal absorbent materials are used to absorb maximum heat and keep the inside cool . The energy usage by the building is almost 25% lesser than those of other building around .

    + +

    This is truly an amazing build and a real answer to sustainable architecture all inspired by nature folks!

    + +

    termite mound

    + +

    The Eastgate +eastgate

    + +

    Sources:

    + +
      +
    1. http://www.ktransit.com/mainline/asia/japan/shinkansen/japan_bullet-tokaido.htm
    2. +
    3. https://www.seat61.com/Japan.htm
    4. +
    5. https://en.wikipedia.org/wiki/Shinkansen
    6. +
    7. https://www.youtube.com/watch?v=iMtXqTmfta0
    8. +
    9. https://en.wikipedia.org/wiki/Self-cleaning_surfaces
    10. +
    11. https://en.wikipedia.org/wiki/Eastgate_Centre,_Harare
    12. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/bionics-and-biomimetics/index.html b/blog/bionics-and-biomimetics/index.html new file mode 100644 index 0000000..0412289 --- /dev/null +++ b/blog/bionics-and-biomimetics/index.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Let us get the boring part out of the way and define those three terms in the title. Biomimetics is when we look at how biological systems work and try to replicate the same movements and systems with electromechanical components. Bionics is when we integrate these artificial systems with human bodies. Robotics is when we take mechatronics and try to make it smart. Why do we do that? It could be for a multitude of reasons. To fix disability due to a lost limb is a good example. Or to provide extra strength and support in situations that require heavy work like construction. Or to help patients with paralysis walk and allow them to have a fulfilling life.

    + +

    The first thing to consider is locomotion in robots, which could be on four-legs (like the Boston Dynamics spot robot), on two-legs (Atlas by Boston Dynamics) or maybe just even hopping on a single leg.

    + +

    Quadruped Robot

    + +

    All of these motions are usually simulated by simplified versions, which could be easily analysed called “templates”.

    + +

    Biped walking uses a template called the rimless wheel, and the template for a limb in running motion is a single spring. These templates seem arbitrary but are very useful in analysing the internal dynamics of the systems and approximating them for designing controllers for such systems.

    + +

    Rimless Wheel

    + +

    The genesis of more intelligent and more powerful sensors helps robot-sensing to become more effective. Another factor is more sophisticated machine learning and deep learning algorithms, which help to make the robots smarter and also helps in computer vision which again improves robot sensing and provides it with a sense of “sight”. We can also use computer vision in applications such as mapping and path planning which are very important for robotics because these algorithms are how robots can move around without crashing into objects. Another advancement in bionic technology that is still in its infancy is the neural control of robots.

    + +

    Soft Robotics is a sub-field that focuses on the use of polymeric “muscles” to create systems that more closely resemble biological systems than just electromechanical contraptions. For example, Micro UAVs can be created using this kind of tech, which resemble insects in nature and can manoeuvre increasingly dangerous environments. There is a lot of research scope in these field as such systems are usually under-actuated and require other methods to work than traditional actuators. Another research area in biomimetics is non-linear control engineering since most jointed systems are non-linear for large angles and require more sophisticated control and state estimation techniques.

    + +

    Control System Diagram

    + +

    References

    +
      +
    1. Robotics: Mobility MOOC by UPenn on Coursera
    2. +
    3. J. Oehlke, M. A. Sharbafi, P. Beckerle and A. Seyfarth, “Template-based hopping control of a bio-inspired segmented robotic leg,” 2016 6th IEEE International Conference on Biomedical Robotics and Biomechatronics (BioRob), 2016, pp. 35-40, doi: 10.1109/BIOROB.2016.7523595.
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/bionics/index.html b/blog/bionics/index.html new file mode 100644 index 0000000..8f0fbbc --- /dev/null +++ b/blog/bionics/index.html @@ -0,0 +1,581 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    1.Bionics and its growing relevance +The rise of bionics has prompted some interesting questions- Can we trade +away our biological body for a repairable one , one that won’t age?. +Bionics is defined as the science of connecting biological systems to artificial +systems to develop machines that can imitate our biology. +As bionic systems and transhuman augmentations exceed human capabilities +humanity might soon face an interesting dichotomy - Either remain physically +inferior and embody the cherished values of humanism as we know them or +to become a superior transhuman with a repairable body that can +transcend the decay of aging. If you choose the latter it will involve switching +out almost every part of your body with prosthetics that could do the job equally +as well. +The time to make this decision might be sooner than you think as many of our +natural apparatuses are finally becoming replaceable with bionics such as ur +hearing, our sight and even some simpler parts of our brain.

    + +

    2.The Brain Computer Interface

    + +

    alt text

    + +

    There exists a repetition and rhythm in the neural activity, which is distinguished +by the frequencies of the brain waves that have several classes such as infra +low waves, delta waves , theta waves , alpha waves , beta waves and gamma +waves. +BCIs(Brain Computer Interfaces) provide ease and comfort by controlling +machines through brain signals. They are made by integrating brain signals to +arrange brain potentials in a way so that no muscle arbitration is required. The +intrusive approach of placing electrodes inside the scalp is cumbersome as +compared to the non-invasive approach in which electrodes are placed on the +scalp, which is used in many BCI based applications.

    + +

    In general, BCI systems are divided into four phases

    + +

    ● acquisition of data +● preprocessing the acquired data +● extracting features +● classification.

    + +

    Let’s explore the 4 phases taking the example of a BCI based robotic arm

    + +

    A. EEG Data Acquisition

    + +

    In the first step, data is acquired by an experiment conducted to control the robotic +arm using EEG signals. +During the experiment, a video instructing to perform clench, rest, and attention by +showing mind focusing games are shown to the participants each with a time +difference of 10 seconds. The video is played on an LED screen and based on +the type of video the subjects are instructed to perform the action as shown for +every 10 seconds. A 20-minutes long data recording for EEG signals is +performed for each subject. +The sampling rate of the acquired signals is 256 Hz and the output of the cognitive +software is sent to the ARDUINO UNO board to control the robotic arm.

    + +

    The EEG signals acquired through a Muse Headband are then modified, filtered, +digitized, and processed. +Finally, a driving signal is sent to the set of servo motors within the robotic arm to +perform an action of picking and placing a bottle.

    + +

    B. Pre-Processing

    + +

    The acquired EEG data is stored as floating-point values which are directly +converted from the unsigned 14-bit analog to digital converter output. These +floating-point values cause DC level problem to the signal. +For removal of this DC offset it is required to apply DC offset removal. The +simplest method for the removal of DC offset is to subtract the average value of +the signal from the entire data channel.

    + +

    C. Feature Extraction

    + +

    After preprocessing phase, the next step is to extract features from the acquired +data. There are two common types of features that can be extracted are +Let S(t) represents the acquired signal, then the features can be calculated as +follows, The maximum amplitude Smax of the signal S(t) is calculated as, +Smax=max{|S(t)|} +The minimum amplitude Smin of the signal S (t) is calculated +Smin=min{|S(t)|} +The absolute amplitude (AAMP) is calculated using, +AAMP=|Smax| +We calculate avg ,Energy and Power of the acquired signal. +To reduce the complexity of the system, another feature named Kurtosis is used

    + +

    D. Feature Classification

    + +

    For the classification of data, neural networking algorithms are highly efficient. It is +difficult to formulate a perfect algorithmic solution that closely matches the +human neuronal system Machine learning programs can extract relevant signal +in noise presence with low computational complexity and with higher +classification accuracy.

    + +

    3.The Next Step in Human Evolution

    + +

    alt text

    + +

    The next chapter in Human evolution won’t be biological ,but instead , +technological. +We as a species must strive to transcend disability through technological +innovation +We shouldn’t view disability as being broken- a human being can never be +“broken” +technology is broken/inadequate. +In conclusion , if we want to trade away our biological body for a mechanical +body then bionics would be the key to make this transition possible. We clearly +seem to be having the beginnings of what we could call bionic eyes ,bionic skin +and bionic ears. +It might just be the case that the evolution of technology has come to play a +greater role in guiding our species than our DNA has.If we could harness this +power we could open up a new chapter in the storybook of humanity.2

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/bit-manipulation/index.html b/blog/bit-manipulation/index.html new file mode 100644 index 0000000..108880d --- /dev/null +++ b/blog/bit-manipulation/index.html @@ -0,0 +1,620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    All data in computer programs is internally stored as bits, i.e., as numbers 0 and 1. It turns out that there are many uses for bit manipulation in competitive programming.

    + +

    In programming, an n bit integer is internally stored as a binary number that consists of n bits. For example, the C++ type int is a 32-bit type, which means that every int number consists of 32 bits. For exmaple, the bit representation of the int number 42 is 00000000000000000000000000101010.

    + +

    There are several bit operations supported by a typical ALU, some of them being AND, OR, NOT, XOR, and bit shifts

    + +

    Some basic applications of bit operations

    +
      +
    1. n&1 = 1 implies n is odd, and n&1 = 0 implies n is even. This executes much faster than the typical way to check if a number is odd (ie. n%2 = 1).
    2. +
    3. 1<<k gives 2^k. This makes it easy to check if the kth bit of a number from the right is set or not, ie. n&(1<<k) == 1. This can be used to easily convert a decimal number to binary as follows: +
       for (int i = 31; i >= 0; i--){
      +     if (n&(1<<i)) cout << "1";
      +     else cout << "0";
      + }
      +
      +
    4. +
    5. It is also possible to modify single bits of numbers using similar ideas. For example, the formula x |= (1 << k) sets the k th bit of x to one, the formula x &= ~(1 << k) sets the k th bit of x to zero, and the formula x ^= (1 << k) inverts the k th bit of x.
    6. +
    7. The formula x &= (x − 1) sets the last one bit of x to zero, and the formula x &= − x sets all the one bits to zero, except for the last one bit. The formula x |= (x − 1) inverts all the bits after the last one bit. Also note that a positive number x is a power of two exactly when x & (x − 1) = 0, and x&(-x) gives the highest power of 2 which divides x.
    8. +
    + +

    Additional functions

    +

    The g++ compiler provides the following functions for counting bits:

    +
      +
    1. __builtin_clz(x): the number of zeros at the beginning of the number
    2. +
    3. __builtin_ctz(x): the number of zeros at the end of the number
    4. +
    5. __builtin_popcount(x): the number of ones in the number
    6. +
    7. __builtin_parity(x): the parity (even or odd) of the number of ones
    8. +
    + +

    Bit Optimazations

    +

    Counting subgrids problem

    +

    Consider the following problem: Given an $N * N$ grid whose each square is either black (1) or white (0), calculate the number of subgrids whose all corners are black. For example, the grid

    + +

    Bit Manipulation Grid

    + +

    contains two such subgrids:

    + +

    Bit Manipulation Grid

    + +

    There is an $O(n^3)$ time algorithm for solving the problem: go through all $O(n^2)$ pairs of rows and for each pair $(a, b)$ calculate the number of columns that contain a black square in both rows in $O(n)$ time. The following code assumes that $color[y][x]$ denotes the color in row y and column x :

    +
    int count = 0;
    +for (int i = 0; i < n; i++) {
    +    if (color[a][i] == 1 && color[b][i] == 1) count++;
    +}
    +
    +

    Then, those columns account for count*(count − 1)/2 subgrids with black corners, because we can choose any two of them to form a subgrid. To optimize this algorithm, we divide the grid into blocks of columns such that each block consists of N consecutive columns. Then, each row is stored as a list of N-bit numbers that describe the colors of the squares. Now we can process N columns at the same time using bit operations. In the following code, $color[y][k]$ represents a block of N colors as bits.

    +
    int count = 0;
    +for (int i = 0; i <= n/N; i++) {
    +    count += __builtin_popcount(color[a][i]&color[b][i]);
    +}
    +
    +

    The resulting algorithm works in $O(n^3/N)$ time.

    + +

    A comparison was done for a randomly generated grid of size 2500 × 2500 between the original and bit optimized implementation. While the original code took 29.6 seconds, the bit optimized version only took 3.1 seconds with N = 32 (int numbers) and 1.7 seconds with N = 64 (long long numbers).

    + +

    Dynamic programming and bit masks

    +

    Optimal selection problem

    +

    Consider the following problem: We are given the prices of k products over n days, and we want to buy each product exactly once. However, we are allowed to buy at most one product in a day. What is the minimum total price? For example, consider the following scenario ( k = 3 and n = 8): +Bit Manipulation Optimal

    + +

    In this scenario, the minimum total price is 5: +Bit Manipulation Optimal

    + +

    Let $price[x][d]$ denote the price of product x on day d. For example, in the above scenario $price[2][3]$ = $7$. Then, let total(S, d) denote the minimum total price to buy all products by day d, when a subset S has already been bought. Using this function, the solution to the problem is total({}, n − 1).

    + +

    To represent the subset S, we use bit masks. Consider a 32-bit integer N. If the kth bit (from the right) of N is set, then the kth product is a part of the subset, else not.

    + +

    Therefore on each day, we have a choice to buy one of the products which hasn’t been bought before or buy no product. The base conditions would be:

    +
      +
    • If all products have been bought, then return 0
    • +
    • If we have exceeded the total number of days return INF.
    • +
    + +

    Therefore the C++ code is as follows:

    +
    int total(int mask, int day){
    +    if(mask == ((1<<k) -1)) //All products have been bought.
    +        return 0;
    +    if(day == -1)
    +        return INF;
    +
    +    int ans = INF;
    +    for(int i=0; i<k; i++)
    +        if(mask & (1<<i) == 0) //Product i hasn't been bought yet.
    +            ans = min(ans, total(mask | (1<<i), day-1) + price[i][day]);
    +
    +    //Not buying anything
    +    ans = min(ans, total(mask, day -1));
    +
    +    return ans;
    +}
    +
    +

    Optimizing the above code by memoizing:

    +
    int dp[1<<k][n]; //Initially all values set to -1
    +int total(int mask, int day){
    +    if(mask == ((1<<k) -1))
    +        return 0;
    +    if(day == -1)
    +        return INF;
    +
    +    if(dp[mask][day] != -1)
    +        return dp[mask][day];
    +
    +    int ans = INF;
    +    for(int i=0; i<k; i++)
    +        if(mask & (1<<i) == 0)
    +            ans = min(ans, total(mask | (1<<i), day-1) + price[i][day]);
    +
    +    ans = min(ans, total(mask, day -1));
    +    return dp[mask][day] = ans;
    +}
    +
    +

    The above code runs in $O(nk2^k)$.

    + +

    Some dp+bitmask problems:

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/bit-torrent-explained/index.html b/blog/bit-torrent-explained/index.html new file mode 100644 index 0000000..b949707 --- /dev/null +++ b/blog/bit-torrent-explained/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “Just torrent it!”

    + +

    “You can torrent any type of file, its all there on the internet…”

    +
    + +

    These are just some of the common sentences one hears when it comes to downloading files from the internet. However, many people do not even know what BitTorrent is, much less know how it works.(It includes uploading files as well)

    + +

    A simple introduction

    + +

    BitTorrent Logo

    + +

    BitTorrent is a communication protocol(set of rules) that is used for sharing all types of data and electronic files over the internet. This falls under the category of peer-to-peer file sharing.

    + +

    Now, to implement this protocol, we need:

    + +
      +
    • +

      A device connected to the internet

      +
    • +
    • +

      A program known as a BitTorrent Client(Example- μTorrent,BitComet,etc.)

      +
    • +
    + +

    How it works

    + +

    Operation Explained

    + +

    Using BitTorrent is different from any other common download or upload. Usually, users download from a single host server, but this protocol allows users to become a host , joining several other such user-hosts in the “swarm”, and upload as well as download files all at the same time. Consider the following simple example:

    + +

    Several thousand users wish to download a large video file. The user responsible for uploading this file initially, becomes the seeder. The users who wish to download this file are known as leachers.

    + +

    Now, each of the leachers begin to download segments/pieces of the file from the seeder. As they do so, they simultaneously begin to upload the pieces they receive to other users in need. Each of these pieces are downloaded non-sequentially, and this is where the client comes in. It rearranges the pieces so that they are in order, and determines what pieces are yet to be recieved.

    + +

    Once the file is completely downloaded, the leacher becomes an additional seeder, and the greater the number of such transitions, the better the “health” of the file.

    + +

    Why is this beneficial?

    + +
      +
    • +

      The data pieces are all of the same size. Hence, one can pause their download, and resume at any later point of time. There is no loss in information.

      +
    • +
    • +

      The bandwidth requirement is significantly reduced. This prevents an increase in internet traffic, and all users receive greater speed for data transfer.

      +
    • +
    + +

    Putting it all together

    + +

    It is quite clear how using this protocol to transfer data is different than the orthodox method. The download in this case is in a random order, whereas it is sequential otherwise. There are security concerns that have been raised about the misuse of the technology, as it is harder to track down several different hosts rather than a single host.

    + +

    For further reference, you can read up on Wikipedia or watch this video on YouTube

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/bot/index.html b/blog/bot/index.html new file mode 100644 index 0000000..4755502 --- /dev/null +++ b/blog/bot/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Botnet of things

    + +

    The Internet of Things aka IoT is one of the hot trending topics in the tech world right now. The IoT is basically a network of devices connected to the internet, each having a unique IP address. Today, the Internet of Things plays with the idea of connecting nearly every manufactured object to the Internet. It is being incorporated into smart homes, watches, cars, fitness trackers, power grids, thermostats, contact lenses, pacemakers and what not.

    + +

    While the Internet of Things brings a new horizon of opportunities, there are several barriers in respect to making IoT implementations successful. These include grave security and privacy concerns. Recent distributed denial of service (DDoS) attacks are forcing a shift in how we think about the Internet of Things (IoT). The debate on the security risks posed by widespread use of IoT devices has intensified after the cyber-attack on DNS provider Dyn in October 2016, which affected many high-profile online service providers like Twitter, Netflix, GitHub and Quora. This was carried out using a malware named ‘Mirai’, which used a “botnet of things”.

    + +

    What is a botnet?

    + +

    A botnet is a collection of internet-connected devices, which may include PCs, servers, mobile devices and internet of things devices that are infected and controlled by a common type of malware. The hacker instructs these botnets to certain things like overloading a website with a huge number of requests to effectively shut it down, to send spam, to make money out of clickbaits, and to further spread the malware itself. These botnets are pretty hard to track and bring down.

    + +

    Image1

    + +

    Botnet of things

    + +

    Until fairly recently, devices used as components of botnets were usually Windows PCs. The problem, for hackers, with PCs is that their defence is being strengthened every day. Antimalware tools are pretty good at detecting problems and evicting botnets. Hence, in recent times, “Thingbots”, i.e. compromising IoT devices for this purpose is a growing trend. IoT devices currently are not really sophisticated in terms of security. The meteoric rise of the IoT industry has forced manufacturers to prioritise impressive features and cot efficiency, leaving security as an afterthought. Most of the cheaper IoT devices on the market are not designed with security in mind, and their hardware isn’t capable of supporting advanced encryption techniques. One of the biggest contributors to the risk of future attack is the fact that many IoT devices have long-standing, widely known software vulnerabilities that make them vulnerable to exploit and control by remote attackers. Many of these devices still have their default passwords. These are very easy targets for hackers, and are being used in botnets. The device will still work normally, with a lesser bandwidth and might be a bit sluggish.

    + +

    Although the Dyn incident caused large-scale disruption, it is noteworthy that the attack involved only a few hundred thousand endpoints and a traffic rate of about 1.2 terabits per second. IT firm Gartner has predicted that there will be more than 20 billion devices connected to IoT by 2020. If the IoT remains vulnerable to attacks of this nature, the risk of similar attacks, on a much larger scale is imminent.

    + +

    Some experts are not alarmed by this, as the Dyn attack required 100,000 infected devices and taking control of so many devices on a regular basis is borderline impossible. However, devices that have been part of the Mirai botnet will always be infected. If another attack was to take place, these devices could be called upon as part of the botnet army. Once a device has been infected, it is very difficult to get rid of the virus, making discarding the device the only viable solution. 

    + +

    How to mitigate this problem?

    + +

    IoT botnets will continue to rise. Right now they are an easy resource to harvest. IoT device manufacturers must act now to build in better security capabilities and controls. Security standards must be set by the government for all IoT devices. Until manufacturers step up their game and create better security practices, it’s up to cyber security firms and the public to be more informed in their daily interactions with smart objects. Default passwords should be changed and the devices should be secured. As IoT botnets becoming a clear-and-present danger, it is only the combined efforts of everyone involved — including consumers, manufacturers and IT pros — that can stop the threat.

    + +

    Resources

    + +

    Botnet of things
    +The Weaponisation of IoT: Rise of the Thingbots
    +Role of IoT in the Dyn Attack

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/brain-machine-interfaces/index.html b/blog/brain-machine-interfaces/index.html new file mode 100644 index 0000000..e73ad33 --- /dev/null +++ b/blog/brain-machine-interfaces/index.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Brain-Machine Interfaces

    + +

    With Artificial Intelligence and assisted technologies improving as rapidly as they are, many scientists and tech pioneers feel that AI might become ‘better’ than humans sooner than we think (some even say that they can take over the world!). But would that be the case if our minds could directly connect with AI, robots and other minds? Maybe we need to become cyborgs to stay relevant in an AI ruled age and this is exactly what Brain-Machine Interfaces hope to bring to the table.

    + +

    As the name suggests, Brain-Machine Interfaces (also called Brain-Computer Interfaces) are devices that enable users to interact with computers by means of brain activity (in layman terms, you can do stuff just by thinking about it). BCIs are capable of a lot of things that would otherwise seem impossible to say a common man of the 20th century. For instance, they can replace lost functions (speaking, moving), they can restore functionality in organs by stimulating certain nerves and they can also enhance and improve general human physical capabilities (better reflexes and awareness). +So when did this, seemingly revolutionary technology come to the fore? +Research and innovations in this field date back as far as 1924 when Hans Berger discovered electrical signals being emitted from the brain and the subsequent development of the EEG as a result. Berger analyzed the interrelation of his EEG wave diagrams with some brain disorders and found that EEG opened up completely new possibilities for research on human brain activity. Not only were opportunities opened up in the field of research but also early diagnosis of various disorders and diseases which were earlier thought to be ‘untreatable and incomprehensible’ was possible now.

    + +

    Now, let us try to define a proper, rigid classification basis for BCIs to better understand the content that follows, +Mainly, BCIs have a broad classification into 3 categories, namely,

    +

    a) Invasive BCI

    +

    This kind of BCI require surgery to implant various electrodes and sensors in the brain (yes, way inside the skull). This provides great accuracy in readings however the disadvantages are obviously the side-effects of such surgerical procedures. In some cases, scar tissues can form as well, which defeats the whole purpose of invasive BCI by weakening the signals.

    +

    b) Partially Invasive BCI

    +

    These BCIs also require surgery and implants inside the skull but these reside outside the grey matter in the brain. Risk of scar tissue formation is lesser but this is at the cost of reduced accuracy but is still better than non-invasive BCI where the bone tissue interferes greatly with the brain signals.

    +

    c) Non-invasive BCI

    +

    This is the safest type of BCI with no scary implants in the brain but of course, accuracy is greatly reduced. Most research and publications are based on these BCI. They have relatively poor spatial resolution and cannot effectively use higher-frequency signals because the skull dampens signals, dispersing and blurring the electromagnetic waves created by the neurons. The best BCI for a particular user depends on various parameters.

    + +

    There are many kinds of BCIs out there but most of them grapple with both or either of these 2 questions namely: How do I recieve relevant information from the brain? and How do I send relevant information to the brain? Now, this is basically what neurons do and the BCI industry wants to somehow replicate this artificially, which is far easier said than done. There are roughly 100 billion neurons in the brain and 50 times more glial cells (they hold the nerves together and aid neurotransmission and maintain the chemical stability of the brain) and all these neurons are connected to many other neurons so it is safe to say that ‘complicated’ doesn’t even begin to describe it. +img

    + +

    So how do BCIs tackle (or hope to tackle) all of this? Well, they do the best that can be done with the tools available today. Firstly, let us look at some of the tools BCIs use and their basic features.

    +

    1) fMRIs

    +

    Functional MRIs are devices which use magnetic fields to generate images concerning blood flow. Blood flow indicates which parts of the brain is recieving blood and some superficial analyses can be done on the brain and its activities. +img +However, the resolution of fMRIs is pretty low (we can’t know where exactly as fMRIs are taken of the entire brain). Nevertheless, since fMRIs have good scale and have been instrumental in understanding which parts of the brain influence what kind of functions.

    +

    2) EEGs

    +

    EEG (electroencaphalography) basically puts electrodes to your head (specifically, on the scalp) and records the electrical activity in various regions of the brain and is very useful in determining how the brain uses electrical signals to transmit data. +img +Though this has better resolution than fMRIs, it is still very low. Considering the complexity of the brain, it barely scratches the surface in terms of resolution but it does help us understand the electrical patterns of the brain for carrying out certain tasks like, +img

    +

    3) ECoG

    +

    In ECoG (electrocorticography), electrodes are inserted under the scalp and similar circuits as EEG are used for the detection of electrical activity in the brain. This has much better resolution but it is kind of invasive to the user (it might seem very invasive but this is just an incision on the scalp, the following ones are much worse). +img

    +

    4) Low Field Potential

    +

    In LFPs, thin needle-like electrodes (made of silicon wafers or other materials from the integrated circuits industry) are stuck 1 or 2 mm in the cortex (cortex makes up for 80% of the brain, it is the whole jelly-like squiggly mass which makes up most of your brain).Though this has incredibly high resolution, it is horrible when it comes to scale and invasiveness. There have been further innovations in this fields, for example, Multielectrode arrays which use the same idea as LFPs but 100 electrodes are situated next to one another so this improves the scale of the device. These electrodes are of course, very thin and sharp as they are of the size and scale of cells. +img

    +

    5) Single-Unit Recording

    +

    Single-Unit Recording also uses thin electrodes but their tips are ultra thin and the resistance values are made to be super high. Thus it will only achieve connection when it gets really close to a neuron and other noise won’t be heard due to the high resistance wall. This gives the best resolution possible however it is very invasive and scale is practically null. Some new designs of the SUR take it to the next level using a technique called Patch Clamp where it clamps on to a membrane patch of the neuron using a glass tip which is located at the tip of the needle instead of an electrode (this also takes advantage of the high resistance value of the patch clamp tip). +img

    + +

    This can give us much better readings and values. Also, since it physically touches the neuron, this can be improvised to stimulate the neuron. +There are also other designs like Sharp Electrode Recording which pierces the neuron and the tip is so sharp that, a membrane forms around this tip and this allows us to effectively read the voltage values on the neuron and also stimulate it as and when required.

    + +

    That was about it on the tools used in BCIs, there are various BCIs out there today, so let’s check out some of them,

    + +

    BCI with LOCOMOTORY OUTPUTS

    +

    One of the most exciting application of these tools is to implement a BCI device would be those which can be controlled by the user’s thoughts. Firstly, let’s look at those controlled by the Motor Cortex which has huge implications especially for disabled people. Now, bringing about movement in people who can’t move is a very challenging task. First, the brain signal of such a person will have to be interpreted and then carried out physically. For this, the user will have to be trained to visualize moving their appendages as vividly as possible and later our device needs to incorporate Machine Learning algorithms to successfully learn to relate these brain signals to that of arm or leg movement. This algorithm can then be integrated with a software and connected to a robotic arm which can carry out these functions for the user. Similar concepts can be used to enable disabled people to type, use computers, write, etc.. (provided such an algorithm can be developed successfully) +Check out this video where a quadriplegic woman uses BCIs to carry out locomotory tasks:

    + + + +

    BCI with SENSORY INPUTS

    +

    These can really be a revolutionary innovation for people whose senses have been impaired. One of the most basic and primitive forms of these BCIs are Cochlear Implants. Cochlea is an essential part of the hearing system in mammals. Now, for an average person, sound waves enter the ear and pass through the eardrums and several other pathways (Cochlea being one of them) and then pass on to the Auditory Nerves which recieve an electrical input of these sound waves. In some cases, these hearing pathways might be damaged whereas the Auditory nerve might still be intact, in such a scenario, the Cochlear implants can do the ‘hearing’ for the subject and output electrical signals into the auditory nerves, enabling the subject to hear again to some extent. Similar processes can be carried out to create artificial eyes but it is far more challenging since the visual system is much more sophisticated but it is definitely possible to do so by using 2 camera-like devices as eyes in theory.

    + +

    A more detailed flowchart for carrying out these algorithms can be seen below, +img

    + +

    As you can see, AI/ML and Signal Processing plays a huge role in this and can be used to solve many problems in this domain but the problems are very, well, problematic. For instance, there will be loads of noise (unless you are okay with patch-clamping) for proper signal processing and creating ML models to understand brain waves amidst all of the noise (remember, our brain does a whole lot of things simultaneously which also becomes part of the noise) is a challenge of its own.

    + +

    Convolutional Neural Networks and BCIs

    +

    CNN is a type of AI neural network based on the visual cortex of the mammalian brain. It has the capacity to learn the appropriate features from the input data automatically by optimizing the weight parameters of each filter through the forward and backward propagation steps in order to minimize the classification error. Using such Deep learning frameworks for BCI applications is advantageous in many ways, it requires minimal pre-processing as optimal settings are learned automatically, feature extraction and classification are integrated into a single structure and optimized automatically. Moreover, Convolutions are integrated in a slide-show manner which can retain temporal information while extracting features from the CNN. However, it is still very difficult to find reliable patterns in brain wave functions due to reasons mentioned before (the brain is the biggest baddest multitasker out there making pattern recognition hugely complicated). +img

    + +

    Thus, it is safe to conclude that BCIs have a long way to go but decent inroads have been made in recent times which can surely be built upon in the near future (well, they are already being worked on..eg. Neuralink.. to know more, click here).

    + +

    References:

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/by-wire/index.html b/blog/by-wire/index.html new file mode 100644 index 0000000..02a5e0a --- /dev/null +++ b/blog/by-wire/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Drive-by-wire

    +

    Drive by wire is a catch all term that can refer to a number of electronic systems that take either augment or completely replace traditional mechanical controls.Instead of using cables, hydraulic pressure and other ways of providing a driver with direct, physical control over the speed or direction of a vehicle, drive-by-wire technology uses electronic controls to activate the brakes, controls the steering, and operate other systems.Although it’s well-established in the airline industry, drive-by-wire has been slow in its introduction to the car. +fig1

    +

    Throttle by wire

    +

    A typical Electronic Throttle Control(ETC) system consists of three major components: +(i) an accelerator pedal module (ideally with two or more independent sensors), +(ii) a throttle valve that can be opened and closed by an electric motor and +(iii) a powertrain or engine control module (PCM or ECM) +The ECM is a type of electronic control unit (ECU), which is an embedded system that employs software to determine the required throttle position by calculations from data measured by other sensors, including the accelerator pedal position sensors, engine speed sensor, vehicle speed sensor, and cruise control switches. The electric motor is then used to open the throttle valve to the desired angle via a closed-loop control algorithm within the ECM

    + +

    Brake by wire

    +

    Once the driver inputs a brake command to the system via a human-machine interface - HMI (e.g. the brake pedal), four independent brake commands are generated by the ECU based on high level brake functions such as anti-lock braking system (ABS) or vehicle stability control(VSC). These command signals are sent to the four electric calipers (e-calipers) via a communication network. This technology is widely used on all hybrid and battery electric vehicles.

    + +

    Shift by wire

    +

    Shift by wire is the system by which the transmission modes are engaged/changed in an automobile through electronic controls without any mechanical linkage between the gear shifting lever and the transmission. This eliminates routing space required for housing the mechanical linkages between the shifter and the transmission and provides effortless shifting through the press of a button or through knobs. Companies like BMW, Audi, Mercedes, Jaguar, Volvo have adopted this type of transmission system. +fig2a +fig2b +fig2c

    +

    Steer by wire

    +

    The first production vehicle to implement this was the Infiniti Q50. When the driver turns the steering wheel, sensors relay the input to control units. The control units then assess this input, along with other key information such as vehicle speed and yaw rate, before delivering suitable control signals to the system that physically actuates the steering rack. +While all of this is being carried out, the electronics filter out unwanted feedback from the front wheels and deliver relevant signals to a force generator at the steering wheel. This provides the driver with the appropriate resistance and feedback. +In most cases, the steer-by-wire rack is driven by an electric motor - although some set-ups may use multiple motors, affording an extra degree of redundancy. +The cycle of monitoring inputs and commanding a response is extremely quick; in the case of Infiniti’s system, it is claimed to be capable of making up to 1,000 adjustments per second. +fig3

    +

    Advantages

    +
      +
    • Drive-by-wire is a key enabling technology for autonomous vehicle development.
    • +
    • Eliminating mechanical linkages can provide savings in weight.
    • +
    • Reduces fuel consumption.
    • +
    • Stretches out the time between service visits for things like mechanical maintenance and other adjustments
    • +
    + +

    Considering all the advantages and the current situation, Market researchers have predicted that the global drive-by-wire market will likely become worth US$59.5 billion revenue by 2025 from US$18.22 billion in 2016 by clocking a robust 15.0% Compound Annual Growth Rate(CAGR) during the period between 2017 and 2025.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/can-bus-protocol/index.html b/blog/can-bus-protocol/index.html new file mode 100644 index 0000000..8a890b0 --- /dev/null +++ b/blog/can-bus-protocol/index.html @@ -0,0 +1,576 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The CAN Bus protocol stands for Controller Area Network Protocol, which is a two wired, bidirectional serial bus communication method. It was designed to perform in harsh environments such as in the automotive industry, but now it has emerged as a go-to network technology in industrial automation as well as in other applications. CAN define the data link and physical layer of the Open Systems Interconnections (OSI) model, thus providing a low-level networking solution for high-speed in-vehicle communication. CAN Bus is primarily used in embedded systems and provides fast communication among microcontrollers up to real-time requirements, thus eliminating the need for the much more expensive and complex technologies.

    + +

    History

    + +

    The controller Area Network (CAN) was originally developed by Bosch in 1986 for in-vehicle networks. Before that, automotive manufactures connected electronic devices in a vehicle using point-to-point wiring systems. Point-to-point wiring systems were those in which all the electronic components had their data line wired individually. As manufacturers began using more and more electronics in vehicles the wiring harnesses became more heavy and expensive. So they replaced the primitive point-to-point wiring system with in-vehicle networks.

    + +

    As the CAN communication protocol had high immunity to electrical interference and the ability to self - diagnose and repair data errors, the automotive industry readily adopted the CAN Bus Protocol, and later in the year 1993 it became the international standard known as ISO 11898. Since 1995 many Higher Layer Protocols (HLPs) were developed for and standardized on CAN.

    + +

    Today, CAN is found in almost every market while developments are continuing in the area of HLPs to support the needs of existing and new developers.

    + +

    What makes CAN Bus special?

    + +
      +
    • +

      Simple Design - CAN provide a cost effective robust communication network. Due to the simple design, the ECU has only a single CAN interface rather than analog and digital inputs to every device in the system thus it reduces error, cost, and weight of the wiring.

      +
    • +
    • +

      Broadcast Communication - The CAN protocol uses a peer-to-peer network which means that every electronic module or ECU connected to the Bus can receive and transmit data to all other modules or ECUs and sees all the transmitted messages, thus the message can take multiple routes to get to the destination. This feature adds to the robustness of the CAN protocol as even if one module on the CAN bus fails, it does not necessarily cause the failure of other modules.

      +
    • +
    • +

      Priority Id System- Every message transmitted through the CAN Bus has a priority Id, So in case if two or more nodes in the Bus tries to transmit messages at the same time the message with higher priority is considered first and the other message is processed after this.

      +
    • +
    • +

      Cyclic Redundancy Check- The CAN Bus protocol uses a cyclic redundancy code(CRC) in each of its message frames. Thus this helps in identifying the errors in the transmitted frame’s content and after error identification that particular message frame is disregarded by all nodes.

      +
    • +
    • +

      Fully Centralized- The CAN Bus provides a single point of communication with all the ECUs enabling central diagnostics, data logging, and configuration.

      + +

      img-1

      +
    • +
    + +

    Structure of CAN Frames

    + +

    Communication over the CAN Bus is done via CAN frames. The original ISO laid out what is called a Standard CAN. Standard CAN uses an 11-bits identifier for different messages, later CAN was modified and the identifier was extended to 29-bits which is known as Extended CAN.

    + +

    Standard CAN

    + +

    img-2

    + +

    The meaning of the bit fields of the above figure is -

    + +
      +
    • SOF - The single Start of Frame(SOF) bit marks the start of the message and is used to synchronize the node on a bus after being idle.
    • +
    • Identifier - The 11- bit Identifier establishes the priority of the message, the lower the binary value, the higher is its priority.
    • +
    • RTR - The single remote transmission request (RTR) bit is dominant when the information is required by another node. All the nodes present on the CAN Bus receive this request but the identifier determines the specific node. The responding data is also received by all the nodes and can be used by any node interested.
    • +
    • IDE - A dominant single Identifier extension(IDE) bit means that a standard CAN identifier with no extension is being transmitted.
    • +
    • r0 - Reserved bit
    • +
    • DLC - the 4-bit data length code(DLC) contains the number of bytes of data being transmitted.
    • +
    • Data - Up to 8 bytes of application data can be transmitted.
    • +
    • CRC - The 16-bit cyclic redundancy check (CRC) contains the checksum (number of bits transmitted) of the preceding application data for error detection.
    • +
    • ACK - After every node receives an accurate message it overwrites this recessive bit by a dominant bit indicating an error-free message has been sent. ACK is 2 bits long one bit is the acknowledge bit and one is a delimiter.
    • +
    • EOF - This end-of-frame (EOF), 7-bit field marks the end of a CAN frame and disables bit-stuffing, indicating a stuffing error when dominant. When 5 bits of the same logic level occur in succession during normal operation, a bit of the opposite logic level is stuffed into the data.
    • +
    • IFS - This 7-bit interframe space (IFS) contains the time required by the controller to move a correctly received frame to its correct position.
    • +
    + +

    Extended CAN

    + +

    img-3

    + +

    As shown above, the Extended CAN is the same as Standard CAN with the addition of -

    + +
      +
    • SRR - The substitute remote request (SRR) bit replaces the RTR bit in the standard message location.
    • +
    • IDE - A recessive bit in the identifier extension (IDE) indicates that more identifier bits follow. The 18-bit extension follows IDE.
    • +
    • r1 - Following the RTR and r0 bits an additional reserve bit has been included ahead of the Data Length Code bit.
    • +
    + +

    How CAN Communication Works

    + +

    CAN data transmission uses a lossless bitwise arbitration(the process in which two or more CAN controllers agree on who is to use the bus) method of contention resolution. This arbitration method requires all nodes on the CAN network to be synchronized to sample every bit on the CAN network at the same time. The CAN Bus consists of two wires CANH and CANL, when the controller sends a stream of bits, these are complemented and placed on the CANH line. The CANL line is always the complement of CANH.

    + +

    The CAN specifications use the terms “dominant” bits and “recessive” bits, where dominant is a logical 0 and recessive is a logical 1. The idle state is represented in the CAN Bus is by the recessive level. If one node transmits a dominant bit and another node transmits a recessive bit then there happens a collision and the dominant bit wins. This means there is no delay to the higher-priority message, and the node transmitting the lower priority message automatically attempts to re-transmit six-bit clocks after the end of the dominant message. This makes CAN very suitable as a real-time communications system.

    + +

    The exact voltages for a logical 0 or 1 depend on the physical layer used, but the basic principle of CAN requires that each node listens to the data on the CAN network including the transmitting node itself. If a logical 1 is transmitted by all transmitting nodes at the same time, then a logical 1 is seen by all of the nodes, including both the transmitting node and receiving node. If a logical 0 is transmitted by all transmitting nodes at the same time, then a logical 0 is seen by all nodes. If a logical 0 is being transmitted by one or more nodes, and a logical 1 is being transmitted by one or more nodes, then a logical 0 is seen by all nodes including the node transmitting the logical 1. When a node transmits a logical 1 but sees a logical 0, it realizes that there is a collision and a high priority is being sent thus it quits transmitting. By using this process, any node that transmits a logical 1 when another node transmits a logical 0 re-transmits the message six-bit clocks after all the high priority message ends and the CAN frame bit-stream continues without error until only one node is left transmitting. Since the 11 (or 29 ) bit identifier is transmitted by all nodes at the start of the CAN frame, the node with the lowest identifier transmits more zeros at the start of the frame, and that is the node that wins the arbitration or has the highest priority.

    + +

    CAN Message Types

    + +

    Four different types of frames can be transmitted through a CAN Bus -

    + +
      +
    • The Data Frame- The data frame comprises the Arbitration Field, the Data Field, the CRC Field, and the Acknowledgment Field. The Arbitration Field contains an 11-bit identifier and the RTR bit, which is dominant for data frames. Next is the Data Field which contains zero to eight bytes of data, and the CRC field which contains the 16-bit checksum used for error detection. Last is the Acknowledgment Field.
    • +
    • The Remote Frame- The intended purpose of the remote frame is to help in the transmission of data from another node. The remote frame is similar to the data frame, with two important differences. First, this type of message is specifically marked as a remote frame, and secondly, there is no data.
    • +
    • The Error Frame- The error frame is a special message that violates the formatting rules of a CAN message. It is transmitted when a node detects an error in a message and causes all other nodes in the network to send an error frame as well. The original transmitter then automatically retransmits the message.
    • +
    • The Overload Frame- The overload frame is similar to the error frame in terms of the format, and it is transmitted by a node that becomes too busy. It is primarily used to provide for an extra delay between messages.
    • +
    + +

    Conclusion

    + +

    This blog introduced CAN Bus Protocol. To summarize CAN Bus is a robust serial communication network protocol that is suitable to work in harsh working environments. CAN uses a differential signal, which makes it more resistant to noise, along with a priority arbitration scheme for non-destructive message transmission.

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/chain-of-things/index.html b/blog/chain-of-things/index.html new file mode 100644 index 0000000..11dd1d5 --- /dev/null +++ b/blog/chain-of-things/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “The Internet will disappear. There will be so many IP addresses, so many devices, sensors, things that you are wearing, things that you are interacting with, that you won’t even sense it. It will be part of your presence all the time.”

    +
    + +

    These words, spoken in the World Economic Forum in 2015 by Google’s then Chairman Eric Schmidt, are quickly proving to be true. From smart homes to smart citites, the Internet of Things is everywhere. The number of connected devices has grown by a whopping 31% over the last year. However, all this data is present on a very hackable internet, and this poses an ever increasing security and privacy threat.

    + +

    What is Blockchain?

    + +

    While the Internet of Things is taking the tech world by storm, another revolutionary technology has started a new era in the financial world: Blockchain. Bitcoin, one of the first cryptocurriencies, built on a Blockchain platform, made it possible to have peer-to-peer online electronic cash transactions without any intermediaries.

    + +

    Understanding it through Money Transactions

    + +

    Historically, when it comes to transacting money or anything of value, people and businesses have relied heavily on intermediaries like banks and governments to ensure trust and certainty in the transaction by various practices like authentication and record-keeping. Because digital assets like money, stocks & intellectual property, are essentially files, they are incredibly easy to reproduce. This creates what’s known as the double spending problem (the act of spending the same unit of value more than once) which until now has prevented the peer to peer transfer of digital assets. This is where blockchain comes into picture.

    + +

    Simply put, a blockchain is a type of distributed ledger or decentralized database that keeps continuously updated digital records of who owns what. Rather than having a central administrator like a traditional database a distributed ledger has a network of replicated databases, synchronized via the internet and visible to anyone within the network.

    + +

    When a digital transaction is carried out, it is grouped together in a cryptographically protected block with other transactions that have occurred in the last 10 minutes and sent out to the entire network. Miners (computers in the network with high levels of computing power) then compete to validate the transactions by solving complex coded problems.The first miner to solve the problems and validate the block receives a reward. (In the Bitcoin Blockchain network, for example, a miner would receive Bitcoins).

    + +

    The validated block of transactions is then timestamped and added to a chain in a linear, chronological order. New blocks of validated transactions are linked to older blocks, making a chain of blocks that show every transaction made in the history of that blockchain.The entire chain is continually updated so that every ledger in the network is the same, giving each member the ability to prove who owns what at any given time.

    + +

    This brings unprecedented security benefits. Hacking attacks that commonly impact large centralized intermediaries like banks would be virtually impossible to pull off on the blockchain. For example — if someone wanted to hack into a particular block in a blockchain, a hacker would not only need to hack into that specific block, but all of the proceeding blocks going back the entire history of that blockchain. And they would need to do it on every ledger in the network, which could be millions, simultaneously.

    + +

    A Marriage of the Titans: Blockchain and IoT

    + +

    Using blockchain to increase the reliabilty and security of Internet of Things is going to be the next big thing in the industry. Consider tech giants like Google or Amazon. They have the resources to employ teams of security analysts whose job is to detect flaws in their softwares before any malicious third party does. Thier software is updates through regular security patches. Not let us imagine a company providing a city-wide webcam surveillance service. Unlike tech giants like Google, or Amazon, this company does not have the resources to provide such security. The ability to prevent future cyberattacks like that depends on creating a way companies like this can quickly, easily and cheaply issue software updates to customers when flaws are discovered.

    + +

    Also there is the issue of connectivity. IoT devices need to be connected to the network to function. If your Amazon Echo goes offline for a while, there is no real issue. But say a medical Bot goes offline, or starts installing an update in the middle of a surgery, there’s going to be a problem.

    + +

    Blockchain Solution

    + +

    A blockchain solution would be available for device makers to use in place of creating their own software update infrastructure the way the tech giants have. These smaller companies would have to program their products to check in with a blockchain system periodically to see if there was new software. Then they would securely upload their updates as they developed them. Each device would have a strong cryptographic identity, to ensure the manufacturer is communicating with the right device. As a result, device makers and their customers would know the equipment would efficiently keep its security up to date. Also, even if connectivity is lost in one area, other areas are still connected to the internet.

    + +

    Many companies are now investing in a Blockchain-IoT future. IoT desperately needs the blockchain’s features while the blockchain is hungry for the big-time opportunity that IoT represents. Together, it seems like this is going to be the next big thing.

    + +

    References:

    + +
      +
    1. ‘Using Blockchain to secure the Internet of Things’, Nir Kshetri,Professor of Management, University of North Carolina – Greensboro
    2. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/challenger-disaster/index.html b/blog/challenger-disaster/index.html new file mode 100644 index 0000000..eaa5401 --- /dev/null +++ b/blog/challenger-disaster/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    On January 28th 1986, the scheduled launch for NASA’s space orbiter- the Challenger, took place as planned. But the launch was the only part of the mission that stuck to plan. 73 seconds after liftoff, the shuttle exploded and broke up, bringing a devastating end to the spacecraft’s 10th mission, claiming all 7 lives onboard. All because of a tiny, rather overlooked aspect of a structure failing due to a very basic property of the given material.

    + +

    After extensive failure analysis, it was determined that the failure of 2 rubber O-rings caused the disaster.

    + +

    To understand why the O-rings failed, the answer lies in a basic concept of polymer materials- the glass transition temperature. When a polymer is cooled below this temperature, it becomes hard and brittle, like glass. The temperature at which this happens is called glass transition temperature( Tg). Each and every polymer material has a glass transition temperature that varies with its structure, substituent groups, molecular mass etc.

    + +

    An analogy to make things clear

    + +

    A good way to understand why this transition occurs is to use an anology of snakes. Polymers exist as highly coiled chains. Consider a room full of snakes. Let each snake represent a polymer chain. We know that snakes are cold blooded. When it’s warm, snakes move more, slither and slide over each other easier. The snakes move randomly. Now, when the temperature is reduced, snakes generally don’t move much. They slow down and tend to stay still. They’re still wrapped around, over and under each other, but there is no motion. Polymer chains work similarly. This lack of movement in the polymer chains causes it to become a brittle mass.

    + +

    Scientific background to the problem

    + +

    The O-Ring in the Challenger shuttle was made of nitrile rubber- a synthetic variant of natural rubber. The glass transition temperature of nitrile rubber used was around 1-2o C. Due to the cold ambient temperature along with the ice collected on the launch pad due to some unusual temperatures, the rubber became a brittle mass losing its ability to seal the fuel tanks properly. This allowed leakage of exhaust gases, which caused uncontrolled combustion between the liquid hydrogen and oxygen, destroying the fuel tanks and causing the shuttle to break apart.

    + +

    It is interesting to note that the engineers involved in the design of the shuttle did warn their superiors about certain components of the shuttle failing at low temperatures but, for whatever reasons, these warnings were unheeded. This was also the first time NASA launched shuttles at such low temperatures. The coldest temperature of a previous launch was 11oC higher.

    + +

    Impact of the disaster

    + +
    +

    Almost a billion US dollars and, more importantly, seven lives were lost because world renowned scientists and engineers forgot to keep in mind basic concepts of simple materials. Law suits were filed against both NASA and the company responsible for designing the rocket boosters and the tanks- Morton Thiokol.

    +
    + +

    To this day, this incident is a case study in many discussions of engineering safety and workplace ethics. This incident only goes on to prove the importance of materials used when designing structures.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/charge-crowding/index.html b/blog/charge-crowding/index.html new file mode 100644 index 0000000..e738e1e --- /dev/null +++ b/blog/charge-crowding/index.html @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Charge crowding

    + +

    Electrostatic Discharge

    + +

    Electrostatic Discharge, or ESD, is a single-event, rapid transfer of electrostatic charge between two objects, usually resulting when two objects at different potentials come into direct contact with each other. ESD can also occur when a high electrostatic field develops between two objects in close proximity. ESD is one of the major causes of device failures in the semiconductor industry +Electrostatic charge build-up occurs as a result of an imbalance of electrons on the surface of a material. Such a charge build-up develops an electric field that has measurable effects on other objects at a distance. The process of electron transfer as a result of two objects coming into contact with each other and then separating is known as ‘triboelectric charging’.

    + +

    This charging process results in one object gaining electrons on its surface, and therefore becoming negatively charged, and another object losing electrons from its surface, and therefore becoming positively charged. A person can get triboelectrically charged in a number of ways, even by just walking across a room. The tendencies of various materials to charge up either positively or negatively are shown in a Triboelectric Series.
    +There are three (3) predominant ESD models for IC’s: 1) the Human Body Model (HBM); 2) the Charged Device Model (CDM); and 3) the Machine Model (MM). The HBM simulates the ESD event when a person charged either to a positive or negative potential touches an IC that is at another potential. The CDM simulates the ESD event wherein a device charges to a certain potential, and then gets into contact with a conductive surface at a different potential. The MM simulates the ESD event that occurs when a part of an equipment or tool comes into contact with a device at a different potential. HBM and CDM are considered to be more ‘real world’ models than the MM. .

    + +

    ESD Control With Ionization

    + +

    Introduction

    + +

    Electrostatic charge attracts contamination to surfaces of semiconductor wafers and flat panel displays, as well as to critical surfaces of process tools. Electrostatic discharge (ESD) damages electronic components as well as the tools used to manufacture them (for example, semiconductor photomasks).

    + +

    The ESD sensitivity of semiconductor components is routinely decreasing with each succeeding semiconductor generation. While typical damage thresholds for semiconductors may range from 50 volts to over 10,000 volts. Technology trends in all areas of electronics production will make existing static problems worse.

    + +

    Static charge control with ionisation

    + +

    Static charge generation is unavoidable. Triboelectric charging occurs through the contact and separation of materials. A charged surface can also induce an electrostatic potential (voltage) on conductive objects close to the static charge without any actual contact. Avoiding charge generation and transfer throughout the electronics manufacturing process is essentially impossible, but with a comprehensive program, it can be controlled. Every static control program starts with extensive grounding of all conductive and static dissipative materials including personnel.

    + +

    Non-conductors are required in process areas (most often, they are the product itself). Since charged non-conductors will not consistently lose their charge by grounding, methods of neutralization are needed. Ionization is the most used technology for the neutralization of static charge on non-conductors and conductors that are isolated from ground. Room ionizers provide neutralization over large areas, worksurface ionizers target smaller production areas, and point-of-use ionizers are included in production equipment. Ionizers used in electronics production areas must follow the same general guidelines for material compatibility as other equipment in the area.

    + +

    Challenges

    + +

    Most current ionization techniques used in electronics production are electronic, employing corona ionization. Efficient designs, providing sufficient ion densities for fast neutralization, use the AC, steady-state DC, and pulsed DC technologies currently available. Increasing future requirements for low levels of ionizer balance require the use of sophisticated methods of monitoring and feedback control. We have already learned in disk drive production that there is a practical limit of about 3-5 volts in control of corona ionizer balance. This has produced a shift to the use of alpha or soft x-ray ionizers. Physics dictates that these ionizers produce a continuous balance of positive and negative ions without feedback and control methods. They will find increasing uses in applications requiring low levels of ionizer balance, particularly in industries shifting to automated production techniques. Maintenance of these ionizers involves the periodic replacement of their active elements and compliance with the applicable government regulations.

    + +

    Measuring methods of ionization may need to be changed to better represent the range of sizes of ESD sensitive components. Static charge issues for a one-meter square of glass (flat panel display) are very different than for a GMR head, and neither is adequately represented by measurements made with a CPM. Yield analysis needs to establish requirements for ionizer balance, as well as the applicability of existing ionizer technologies (particularly AC ionizers) in handling extremely static-sensitive components.

    + +

    Close attention must also be paid to turbulence generation by the ionizer. Cleanrooms use laminar airflow to prevent particle deposition on critical surfaces. The use of ionizing blowers or other ionizers placed in the airflow path means that turbulence could compromise the laminarity of the airflow. Therefore, bar ionizers, ionizing blowers or other types of ionizers must be carefully selected to minimize this effect. The cleanroom compromises between contamination control and ESD control must be well understood.

    + +

    The following are some recommendations that will assist manufacturers of ionizer products in updating equipment specifications:

    + +
      +
    1. Establish the “real” damage thresholds of electronic devices with a well-defined testing program, including simulation methods that reflect the ESD hazards that devices will encounter. For example, the increasing use of automation tends toward CDM and MM testing rather than HBM. Estimate how sensitive devices will be in the future.
    2. +
    3. Establish ionizer neutralization time and balance specifications for standard airflow rates (both laminar and turbulent) and operating distances. Relate this information, if possible, to production yield or defect rates.
    4. +
    + +

    Conclusion

    + +

    Ionization continues to be an essential element in a static control program. As with other elements in the program, control of the operating parameters will become more critical with technological change. Product design to maximize ESD damage thresholds may not be able to keep up with this rapid change, putting more dependence on ionizers and other static control methods to protect products. In all areas we are looking at rapidly approaching technology barriers. Surmounting these barriers means, “static control is not an option”. Ionizers and ESD control methods will need to keep pace with rapid technology change or they will become the barriers to future production.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/charge-your-phone/index.html b/blog/charge-your-phone/index.html new file mode 100644 index 0000000..750e548 --- /dev/null +++ b/blog/charge-your-phone/index.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Charge your phone whenever you walk into the room

    + +

    One quick and easy way to induce anxiety is to misplace your phone charger. You’re stressed out just thinking about it right now, well what if instead of dealing with your wiry bundles and ports and mats and plugs and cords, you could just….walk into a room and automatically your mobile phones, laptops any other appliances get charged. However, mobile devices are not truly mobile if they require connection to power cord.

    + +

    Wi-charge technology provides us finally a way to get rid of the power cord, efficiently and safely. The device itself looks something like a smoke detector on the ceiling. The product is FDA approved. Anything transmitted over air has to comply with safety and commercial regulations. As long as your phone, tablet, laptop, wireless speakers, etc. are in view of the Wi-charge, you will get the juice. It is the technology called “line-of-sight”. Power is delivered over distances using infrared beams of light. The system consists of two units:

    + +
    +

    The transmitter unit – Connected to power source (standard AC, DC or USB), delivers power to receivers anywhere in its vicinity. The transmitter emits focused, safe infrared beams that carry power to receivers.

    +
    + +
    +

    The receiver unit – Captures the light from the transmitter and converts it to electrical power using a photo voltaic cell, just like the way that solar panels converts sunlight into electricity.

    +
    + +

    image1

    + +

    Transmitter and recievers

    + +

    The transmitter is a very smart device. Within its coverage area, it automatically identifies chargeable devices and discovers the power requirements. It delivers power to receivers based on their priority, power requirements, battery level and other parameters. Multiple clients can be charged simultaneously using an intelligent power- management algorithm embedded in the transmitter. Automatically, the transmitter directs a safe infrared beam to each receiver, establishing a virtual photonic power cord. No light is spread outside the beam; 100% of the power delivered from the transmitter to receiver.

    + +

    Depending on size and power requirements of the charging device, the tiny thumb size receiver is automatically illuminated by the invisible infrared beam. The receiver converts power from the beam to an electric charge which is used to power the device or recharge its battery. The tiny receiver may be embedded in the mobile device or plugged externally into an existing charging port.

    + +

    image2

    + +

    Power delivery

    + +

    Efficient power delivery via light necessitates a great deal of intelligence in the transmitter. The power of client identification and power delivery is performed automatically without any user intervention. For example, the mobile phone user simply enters the room and transmitter will automatically find it and begin charging it. The receiver is detectable by the transmitter even if device’s battery is drained, and it will stop charging the device once the battery is full.

    + +

    Line of sight

    + +

    Power flows in a straight, narrow line. If, for any reason, the line of sight between the transmitter and receiver is blocked, Transmission stops immediately. This ensures that power emission levels are always compliant with safety standards and international regulations, Once the line of sight is restored, charging restarts automatically. To ensure steady power delivery, each Wi-charge receiver is equipped with an energy storage buffer (capacitor or battery).

    + +

    This can be used in commercial spaces, which considering the panic and stress of a dying phone while on-the-go, might be more helpful anyway.

    + +

    For further more details about Wi-Charge and its working:-

    + +
      +
    1. +

      IEEE Spectrum - Phone Charging by Infrared Lasers

      +
    2. +
    3. +

      WI Charge - Technology

      +
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/chatbot/index.html b/blog/chatbot/index.html new file mode 100644 index 0000000..c16ebcf --- /dev/null +++ b/blog/chatbot/index.html @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    

    +
    +

    “Hey Siri, What’s my schedule for today”
    +“Hey Cortana, when is my appointment with the dentist today”

    +
    + +

    These are a few phrases that we use casually from day to day in order to make our life a tad bit easier. In this time of rapid advances in AI and Machine learning Chatbots are one avenue that has been ushered into reality by this magical paradigm that has been growing by leaps and bounds in the past few years. But what if Chatbots can be a vital link in another field that is rapidly gaining traction, namely IoT.

    + +

    chatbot

    + +

    What is a Chatbot?

    + +

    A Chatbot put in simple terms is a computer program that can have a conversation with a human, that is it simulates conversations with human users. Chabot’s use a dialog system to have a conversation with a human.
    +The first step is converting human input into an understandable context for the Chatbot. This is done through input recognizers and decoders, which can analyze speech, text and even gestures. The next step is applying Natural Language Processing to check the user input and analyze the meaning of what he/she has said or written. All the while the input is managed and processed by a dialog manager to ensure a proper exchange of information from and to the user.

    + +

    Neural Networks

    + +

    Neural networks are one of the prime algorithms that are used by Chatbots to get as close as it can to mimicking a human while in conversation with a human participant. They consist of different layers for analyzing and learning data. Every hidden layer tries to detect patterns in the conversation. The more layers in a neural network, the more is learned and the more accurate the pattern detection is. Neural Networks learn and attribute weights to the connections between the different neurons each time the network processes data. So the next time it encounters a similar dialogue it will be ready with answer instantly.

    + +

    Chatbots and IoT

    + +

    Apart from their existing use in mobile applications one interesting field of utilization would be in IoT based applications. Chatbots can act as an interface and thus improve the user experience. For example, Amazon Echo is an example of integrating speech in your chatbot experience, it will allow you to order anything from the Amazon web shop. A new report, states that Amazon has sold near 3 million Amazon Echo smart speakers which supports the belief that chatbots are the future of IoT and retail, and it will be interesting to see what else retailers come up with in the coming years.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cloud-computing-in-detail/index.html b/blog/cloud-computing-in-detail/index.html new file mode 100644 index 0000000..4afb8e2 --- /dev/null +++ b/blog/cloud-computing-in-detail/index.html @@ -0,0 +1,560 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Cloud computing is a computing paradigm, where a large pool of systems is connected in private or public networks, to provide dynamically scalable infrastructure for application, data, and file storage. In the simplest terms, cloud computing is storing data and programs over the Internet instead of storing them in a computer’s hard drive. “The cloud” refers to servers that are accessed over the Internet, and the software and databases that run on those servers. Cloud servers are located in data centers all over the world. By using cloud computing, users and companies don’t have to manage physical servers themselves or run software applications on their machines.

    + +

    Cloud computing is a practical approach to experience direct cost benefits. It can transform a data center from a capital-intensive set up to a variable priced environment. Cloud computing customers do not own the physical infrastructure, rather they rent the usage from a third-party service provider i.e., consume services and pay only for the resources that they use.

    + +

    Cloud Computing Models

    + +

    Cloud computing is offered in three different service models which each satisfy a unique set of business requirements. These three models are known as Software as a Service (SaaS), Platform as a Service (PaaS), and Infrastructure as a Service (IaaS).

    + +

    Software as a Service (SaaS)

    + +

    Software as a Service offers applications that are accessed over the web and are not managed by your company, but by the software provider. It is a software licensing and delivery model in which software is licensed on a subscription basis and is centrally hosted. It is sometimes referred to as “on-demand software”, and was formerly referred to as “software plus services” by Microsoft. SaaS applications are also known as Web-based software, on-demand software, and hosted software.

    + +

    In this model, a complete application is offered to the customer, as a service on demand. A single instance of the service runs on the cloud & multiple end users are serviced. There is no need for upfront investment in servers or software licenses on the customers’ side, while for the provider, the costs are lowered since only a single application needs to be hosted & maintained. Today SaaS is offered by companies such as Google, Salesforce, Microsoft, Zoho, etc.

    + +

    Infrastructure as a Service (IaaS)

    + +

    Infrastructure as a service (IaaS) is a form of cloud computing that provides virtualized computing resources over the internet. They are online services that provide high-level APIs used to dereference various low-level details of underlying network infrastructure like physical computing resources, location, data partitioning, scaling, security, backup, etc.

    + +

    IaaS provides basic storage and computing capabilities as standardized services over the network. Servers, storage systems, networking equipment, data center space, etc. are pooled and made available to handle workloads. The customer would typically deploy his software on the infrastructure. Some common examples are Amazon, GoGrid, 3 Tera, etc.

    + +

    Platform as a Service (PaaS)

    + +

    Platform as a Service is halfway between Infrastructure as a Service (IaaS) and Software as a Service (SaaS). It offers access to a cloud-based environment in which users can build and deliver applications without the need of installing and working with IDEs (Integrated Development Environments, which are often very expensive).

    + +

    Here, a layer of software, or development environment is encapsulated & offered as a service, upon which other higher levels of service can be built. The customer has the freedom to build his applications, which run on the provider’s infrastructure. To meet manageability and scalability requirements of the applications, PaaS providers offer a predefined combination of OS and application servers, such as LAMP platform (Linux, Apache, MySQL, and PHP), restricted J2EE, Ruby, etc. Google’s App Engine, Force.com, etc are some of the popular PaaS examples.

    + +

    Public, Private and Hybrid Clouds

    + +

    Enterprises can choose to deploy applications on Public, Private or Hybrid clouds. Cloud Integrators can play a vital part in determining the right cloud path for each organization.

    + +

    Public Cloud

    + +

    The public cloud is defined as computing services offered by third-party providers over the public Internet, making them available to anyone who wants to use or purchase them. It uses the standard cloud computing model to make resources – such as virtual machines, applications, or storage – available to users remotely. Public cloud services may be free or offered through a variety of subscription or on-demand pricing schemes, including a pay-per-usage model.

    + +

    Examples: Amazon Elastic Cloud Compute(EC2), Google App Engine, Blue Cloud by IBM, and Azure services Platform by Windows.

    + +

    Private Cloud

    + +

    A private cloud is a server, data center, or distributed network wholly dedicated to one organization. Private clouds are built exclusively for a single enterprise. They aim to address concerns on data security and offer greater control, which is typically lacking in a public cloud. There are two variations to a private cloud:

    + +
      +
    • On-premise Private Cloud: On-premise private clouds, also known as internal clouds are hosted within one’s own data center. This model provides a more standardized process and protection but is limited in aspects of size and scalability. IT departments would also need to incur the capital and operational costs for the physical resources. This is best suited for applications that require complete control and configurability of the infrastructure and security.
    • +
    • Externally hosted Private Cloud: This type of private cloud is hosted externally with a cloud provider, where the provider facilitates an exclusive cloud environment with a full guarantee of privacy. This is best suited for enterprises that don’t prefer a public cloud due to sharing of physical resources.
    • +
    + +

    Examples: HP Data Centers, Microsoft, Elastra-private cloud, and Ubuntu

    + +

    Hybrid Cloud

    + +

    Hybrid cloud is an IT infrastructure that connects at least one public cloud and at least one private cloud, and provides orchestration, management, and application portability between them to create a single, flexible, optimal cloud infrastructure for running a company’s computing workloads. Hybrid cloud architectures help organizations integrate their on-premises and cloud operations to support a broad spectrum of use cases using a common set of cloud services, tools, and APIs across on-premises and cloud environments.

    + +

    Examples: Amazon Web Services (AWS), Microsoft Azure, or Google Cloud Platform (GCP)

    + +

    Benefits of Cloud Computing

    + +
      +
    • Flexible and Scalable: One of the major benefits of cloud computing for any business which has opted for cloud computing can increase or decrease the bandwidth as per requirement. The cloud is not constricted to low bandwidths, and unlike the conventional in-house technical infrastructure, it is flexible enough to allow business owners to engage in last-minute changes and still have the ease of work.
    • +
    • Reduced Infrastructure Cost: Moving to the cloud reduces the cost of managing and maintaining servers. Cloud computing eliminates the need to invest in servers and software. Cloud also reduces the overhead costs like IT Staff, power, data storage, and bandwidth.
    • +
    • Mobility: The omnipresence of the cloud marks mobility as its prime feature. With the help of cloud connection, companies can connect remotely over an array of devices like smartphones, iPad, and Laptops with ease. Remote accessibility enables quick turnaround time, instant solutions, and constant connection. It is perfect for freelancers, remote employees, organizations with offices in different locations and different sectors.
    • +
    • Automated Updates on Software: In cloud computing, the server suppliers regularly update your software including the updates on security, so that you do not need to agonize on wasting your crucial time on maintaining the system. With automatic software updates and cyclic upgrades, users can now focus their time & energy on work.
    • +
    • Enhanced Collaboration: Cloud computing guarantees ease of access and remote accessibility, which makes it an instant hit to the technical world. Cloud applications enhance collaboration by authorizing diverse groups of people to virtually meet and exchange information with the help of shared storage. Such capability helps in improving the customer service and product development and also reducing the marketing time.
    • +
    + +

    Cloud Computing Challenges

    + +

    With all these benefits come the challenges of Cloud Computing. Data Security is a crucial element that warrants scrutiny. Enterprises are reluctant to buy an assurance of business data security from vendors. They fear losing data to competition and the data confidentiality of consumers. In many instances, the actual storage location is not disclosed, adding to enterprises’ security concerns.

    + +

    In some of the European countries, Government regulations do not allow customer’s personal information and other sensitive information to be physically located outside the state or country. To meet such requirements, cloud providers need to set up a data center or a storage site exclusively within the country to comply with regulations. Having such an infrastructure may not always be feasible and is a big challenge for cloud providers.

    + +

    Every time a company moves data from the internal storage to a cloud, it is faced with being compliant with industry regulations and laws. For example, healthcare organizations in the USA have to comply with HIPAA (Health Insurance Portability and Accountability Act of 1996), public retail companies have to comply with SOX (Sarbanes-Oxley Act of 2002), and PCI DSS (Payment Card Industry Data Security Standard).

    + +

    Cloud computing marks the beginning of a new era in information and communication technology as it brings with it an evolutionary paradigm that can change how computing was done. In conclusion, cloud computing is a recent technological development that has the potential to have a great impact on the world. It has many benefits that it provides to its users and businesses. It reduces operating costs by spending less on maintenance and software upgrades and focuses more on the businesses.

    + +

    But there are other challenges cloud computing must overcome. These challenges include security, privacy and reliability of data, consistency in the availability of services, interoperability issues due to unstandardized application programming interfaces which are unique to different service providers, issues in assessment and implementation of cloud computing, high costs of data transfers, and bugs in large-scale distributed systems.

    + +

    Cloud computing as a recent technology is still at a nascent stage of its development. There is still so much potential that can be realized due to ongoing research and development in this regard.

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cloud-computing/index.html b/blog/cloud-computing/index.html new file mode 100644 index 0000000..b6d8fe8 --- /dev/null +++ b/blog/cloud-computing/index.html @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    You are probably using cloud computing right now, even if you don’t realise it. If you use an online service to send an email, edit documents, watch movies or TV, listen to music, play games or store pictures and other files, it is likely that cloud computing is making it all possible behind the scenes.

    +
    + +

    The first cloud computing services are barely a decade old, but already a variety of organisations, from tiny start-ups to global corporations, government agencies to non-profits, are embracing the technology for all sorts of reasons.

    + +

    What is Cloud Computing?

    + +

    Cloud Comp

    + +

    Cloud computing is the on-demand delivery of compute power, database storage, applications, and other IT resources through a cloud services platform. It is made available to the user via the Internet with pay-as-you-go pricing. Whether the users are running applications that share photos to millions of mobile users or they are supporting the critical operations of their business, a cloud services platform provides rapid access to flexible and low-cost IT resources which is available in just a few seconds. This allows enterprises, start-ups, small and medium-sized businesses, and customers in the public sector to access the building blocks they need to respond quickly to changing business requirements.

    + +

    With cloud computing, users don’t need to make large upfront investments in hardware and spend a lot of time on the heavy lifting of managing that hardware. Instead, with cloud computing they can provision exactly the right type and size of computing resources they need to power their newest bright idea or operate their organization’s IT department. This means the users don’t need to buy their own hardware, instead, the Cloud Computing Service provider will buy the network-connected hardware required for the user’s application, and maintain it for them. The users can access as many resources as they need, almost instantly, and only pay for what they use.

    + +

    How Cloud Computing Works?

    + +

    Cloud computing services all work a little differently, depending on the provider. But many provide a friendly, browser-based dashboard that makes it easier for IT professionals and developers to order resources and manage their accounts

    + +

    Advantages of Cloud Computing:

    + +

    Replacing up-front capital infrastructure expense for variable expense:

    + +

    Instead of having to invest heavily in data centres and servers before a user know how they are going to use them, they can pay only when they consume computing resources, and pay only for how much they consume. Hence, with the cloud, businesses no longer need to plan for and procure servers and other IT infrastructure weeks or months in advance. Instead, they can instantly spin up hundreds or thousands of servers in minutes and deliver results faster.

    + +

    Benefit from massive economies of scale:

    + +

    By using cloud computing, users can achieve a lower variable cost than what they can get on their own. As usage from hundreds of thousands of customers is aggregated in the cloud, service providers can achieve higher economies of scale, which translates into lower pay as-you-go prices for the users.

    + +

    Eliminates the process of guessing about capacity required:

    + +

    Cloud computing eliminates guessing on the infrastructure capacity needs. When a user makes a capacity decision prior to deploying an application, they often end up either sitting on expensive idle resources or dealing with limited capacity. With cloud computing, these problems go away. They can access as much or as little capacity as they need, and scale up and down as required with only a few minutes’ notice.

    + +

    Increased speed and agility:

    + +

    In a cloud computing environment, new IT resources are only a click away, which means that organizations can reduce the time required to make those resources available to their developers from weeks to just minutes. This result in a dramatic increase in agility for the organization, since the cost and time it takes to experiment and develop is significantly lower.

    + +

    Eliminates workload of running and maintaining data centers:

    + +

    Cloud Computing lets organizations focus on projects that differentiate their business, and not on the infrastructure. Cloud computing lets them focus on their own customers, rather than on the heavy lifting of racking, stacking, and powering servers.

    + +

    Allows going global in minutes:

    + +

    Organizations can easily deploy their application in multiple regions around the world with just a few clicks. This means they can provide lower latency and a better experience for the customers at minimal cost.

    + +

    Cloud Computing

    + +

    Categories of Cloud Computing:

    + +

    Now all this sounds like a very broad domain, so cloud computing can be essentially divided into 3 categories:

    + +

    1. Infrastructure as a Service (IaaS): Here the users are provided access to the basic hardware and they are free to customize it to their use case. For ex, they are provided access to the machine and they can choose whatever Operating System they would like and configure it’s every system related detail.

    + +

    2. Platform as a Service (PaaS): This removes the need for the user to manage the underlying infrastructure (usually hardware and operating systems) and allows them to focus only on the deployment and management of their applications.

    + +

    3. Software as a Service (SaaS): With a SaaS offering, the user need not have to think about how the service is maintained or how the underlying infrastructure is managed; they only need to think about how they will use that particular piece of software. Hence, this provides them with a completed product that is run and managed by the service provider. Eg: Gmail, Youtube.

    + +
    +

    These three types of services are sometimes called the cloud computing stack, because they build on top of one another. Knowing what they are and how they are different makes it easier for an organization to accomplish their business goals.

    +
    + +

    Types of Cloud Deployment:

    + +

    Not all clouds are the same. There are three different ways to deploy cloud computing resources:

    + +

    Public Cloud: With a public cloud, all hardware, software and other supporting infrastructure is owned and managed by the cloud provider. The users access these services and manage their account using a web browser.

    + +

    Private Cloud: A private cloud refers to cloud computing resources used exclusively by a single business or organisation in which the services and infrastructure are maintained on a private network. A private cloud can be physically located on the company’s on-site datacenter.

    + +

    Hybrid Cloud: Hybrid clouds combine public and private clouds, bound together by technology that allows data and applications to be shared between them. By allowing data and applications to move between private and public clouds, hybrid cloud gives businesses greater flexibility and more deployment options.

    + +

    Why is Cloud Computing the Future?

    + +

    Although the cloud is far from a new idea, its true capabilities are only now beginning to be realized. It is predicted that Cloud will provide the digital infrastructure of tomorrow’s cities, where an estimated 6 billion of the world’s population will live by 2045. The cloud will support emerging technologies such as artificial intelligence and help them to adapt to new platforms such as mobile. Therefore, it can be well said that Cloud Computing will be one of the technological shift into which the world will leap towards in the near future.

    + +

    Resources:

    + +
      +
    1. +

      Overview of AWS

      +
    2. +
    3. +

      Cloud Computing: A Beginner’s Guide

      +
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cloud-gaming/index.html b/blog/cloud-gaming/index.html new file mode 100644 index 0000000..427fa68 --- /dev/null +++ b/blog/cloud-gaming/index.html @@ -0,0 +1,561 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Till today gaming had been possible only on dedicated machines like PCs, gaming consoles like nintendo, playstations and xbox and in the recent times on mobile phones too. But even today the AAA titles or the large budget games like Assassin’s Creed Unity, GTA 5 are only available on consoles and PCs(only windows), but a new technology is emerging today which aims to break all barriers and bring AAA gaming to all devices alike(yes, even to mac and linux). Read on to find what this new awesome tech is all about and how you can get a glimpse of the future, today.

    + +

    History of Streaming

    +

    In its early days internet was a place for static pages. Online video found its place only after certain wrapper formats were released around 1995, during this time Macromedia Corporation released its Shockwave Flash player for Netscape Navigator which remained the de-facto online content player till the introduction of html5. Apple too released its QuickTime player format in 1999. Streaming video and audio became mainstream only during 2005 - 2010. Youtube, Google Video, Dailymotion, Netflix etc. saw their popularity rise during this time. One of the major reasons of the new found success was better broadband penetration and increased internet speeds. Till a few years from now people still believed in downloading content before watching, very fast and cheap internet access today has made it possible to stream content directly. Twitch, Youtube streaming are some services that rely solely on streaming to provide live content over the internet. +The video and audio streaming services are in their golden age. Today we see a new industry rising, The Cloud Gaming Industry.

    + +

    Cloud Gaming

    +

    Platforms like Steam and Nvidia shield have long provided a way to stream games locally. The game may be rendered on a powerful gaming pc on the home network and then the rendered frames streamed onto a tv connected to the same home network. The bandwidth and latency requirements for a smooth gaming experience were possible only on the local network. But today Nvidia and Google have been trying to push this technology to the next level, Game Streaming is in its definitive stage.

    + +

    The two pioneers today are:

    +
      +
    • Nvidia Now
    • +
    • Google’s Project Stream
    • +
    + +

    Working explained

    +

    The concept that makes this technology possible is fairly simple and similar to what video streaming uses. The game resides on a cloud computer that runs the game for you. The frames are rendered in real time and then streamed to your device in real time as well. The inputs are then sent back to the cloud system and then a frame is rendered and the process goes on. If someone has tried to stream their gaming session live to facebook, twitch or youtube gaming, they know that one of the major problems in streaming is compressing and encoding the data stream to be transferred over the internet. Low internet speeds result in laggy and low quality streams. High internet speeds coupled with fast compression techniques too result in low quality streams. The perfect combination is high internet speeds (at least 20mbps for 720p 60fps, twitch supports a maximum of 6mbps bitrate) and good compression(requires a lot of software based encoding on CPU, hardware encoding is not as good) with low latency. +It may be a difficult task even for a fast gaming PC but fairly simple task for server grade, multi core systems(many cores = better compression performance) available with cloud gaming providers. So the sheer computing power available today and fast internet have made it possible to stream games over the internet.

    + +

    Google’s Project Stream

    +

    stream

    +
    +

    “Project Stream has the potential to become a gaming platform”

    + +

    -The Verge

    +
    + +

    Project Stream is google’s entry into the gaming industry. It is a cloud gaming service currently in beta stage and available only in the United States and Canada. The access to the service is free and is on invitation basis. Currently, only Assassin’s Creed Odyssey is available for testing purposes.

    + +

    How to apply?

    +

    This service is only available for chrome users.

    +
      +
    • Goto https://projectstream.google.com +stream +You may be greeted with the above message. In order to circumvent the above page and trick google into thinking that you are from USA, use a VPN or a proxy service that connects you to either USA or Canada and then revisit the link.
    • +
    • If the above step goes well, you will be presented with the google login page. Login to your google account.
    • +
    • The website asks you to verify that you are 17 years or above. Verify and then the page will ask you if you have a invitation code(setup code).
    • +
    • Since we don’t have an invitation code, click on the Request for invitation link. +stream
    • +
    • You will be presented with the request form. Fill it. +stream
    • +
    • Pray that you are lucky and you get the invite. (I haven’t yet received one).
    • +
    + +

    Nvidia Now

    +

    now +Nvidia has been the pioneer in the gaming industry. Nvidia was the first to explore this area with the introduction of shield gaming devices. And now it has the “Now” service to revolutionize the gaming industry. This service is still in the beta stage and also available on invitation basis(just like Project Stream). Lot of games are available to anyone who gets an invitation.

    + +

    How to apply?

    +
      +
    • Goto https://www.nvidia.com/en-us/geforce/products/geforce-now/ +now
    • +
    • Click on Request Beta Access. +now
    • +
    • Click on Login/Register.
    • +
    • Create an ID if you don’t already have one, or login with your credentials. +now
    • +
    • Fill in your details. +now
    • +
    • You will receive a confirmation email.
    • +
    • Again, pray that you are lucky and get access to the service. (I am still praying xD)
    • +
    + +

    What to expect

    +

    I have not yet been able to test these services on my own, but depending on what i have read and seen online the service is working smoothly for many people. Whereas this may not be the case with you. You may go into several bottlenecks: slow internet, incapable hardware, etc. Me being in India at the time of writing this article can guarantee that i will face latency issues while using these services. The latency is the time taken by the packets to travel from one system to another on the internet. High latency will make streaming games a horrible experience, akin to playing demanding games on old and slow hardware or even worse. High latency means you may press a button but may see the game responding to that key press after a second or so (not a very great experience). Google is geo restricting the Project Stream so that they can actually test the gaming experience while the latency is still under control. Streaming Online multiplayer games like Dota 2 and Rainbow Six Siege where a very low latency(below 50ms) is indeed desirable will mean that the streaming services will struggle to coop up with the expectations of the gamers. +This new industry is still in its early stages and will definitely improve in the coming years. Google and Nvidia are doing a remarkable job even when the services are still in beta. The latency issue may be remedied by distributing a very large number of cloud centers over the globe, just like Netflix did, but this may be a costly proposition. This is still very much young and its future uncertain, but it is exciting to know that these services will make the best available and accessible to everyone.

    + +

    Since, I have not been able to try these services yet, if you are lucky and get a chance, do mail your expericence to me.

    + +

    Peace.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/colonization-of-mars/index.html b/blog/colonization-of-mars/index.html new file mode 100644 index 0000000..8201c2d --- /dev/null +++ b/blog/colonization-of-mars/index.html @@ -0,0 +1,530 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The colonization of Mars has been a popular theme of discussion over the past few decades. Whether it's in the spirit of exploration, expansion of human settlement or mining for additional resources, the idea of inhabiting another planet has allured us.

    + +

    This is also evident in how often the idea of colonizing Mars appears in fiction and pop culture: from "The Martian Chronicles" by Ray Bradbury to "The Martian" by Andy Weir, the prospect of humans inhabiting the red planet has been explored from the perspectives of fantasy to science.

    + +

    Keeping aside the political and ethical challenges that are intrinsic to such a monumental project, how are scientists and engineers all around the world planning to accomplish the colonization of Mars?

    + +

    How living on Mars will be different: The Challenges

    + +

    The most fundamental obstacle to living on Mars is its conditions, which are vastly different to that of Earth's (and not in a good way).

    + +
      +
    • Mars is cold, with average surface temperatures between -87C to -5C.
    • +
    • The atmosphere is lethal. It's made up of 95% carbon dioxide, 3% nitrogen and 1.6% argon.
    • +
    • Pressure on Mars is much less than on Earth, with average pressure on the surface being about 0.6kPa.
    • +
    • The surface gravity of Mars is 38% that of Earth's.
    • +
    • Mars experiences annual dust storms that cover pretty much most of the planet, and which can last up to several weeks and prevent sunlight from entering the surface of the planet, and also effectively block all communication with Earth.
    • +
    • The Martian soil is toxic, thereby rendering it useless for agriculture.
    • +
    • Unlike Earth, Mars's atmosphere is not capable of blocking out harmful radiation, so living on Mars could mean constant exposure to harmful cosmic rays and solar particle events.
    • +
    + +

    There are some silver linings: The Good Stuff

    + +
      +
    • A day on Mars is quite similar to a day on Earth (a little more than 24 hours), so theoretically, we can expect the human circadian rhythm to not change on Mars.
    • +
    • Various missions to Mars have all confirmed the presence of water, in the form of ice under the Martian surface and in the form of CO2 icecaps near the poles.
    • +
    + +

    Equipped with all this information, how would the Martian explorers potentially carry out their mission?

    + +

    The Plan

    + +

    Setting Up Camp

    + +

    The best places to colonize on the planet are underground - Mars has large caverns under its surface that provide the best protection from the harmful radiation that the planet's surface is exposed to.

    + +

    Other locations worth considering are the poles, which contain the ice deposits built up over millennia. To counter the exposure to deadly radiation, protective habs must be built, which is essentially a dome built with polyethylene fibers. Here is where the Martian scientists' ingenuity comes into play: using the Martian soil itself to create a layer over the hab to provide further protection from harmful UV rays.

    + +

    The Atmosphere

    + +

    Without oxygen, the people that touch down on the Martian surface would have just enough time to admire its beautiful red landscape. Then, they would die. Oxygen is the elixir of life, so it's absolutely essential that future Mars explorers have plenty of oxygen to breathe.

    + +

    NASA has developed MOXIE (Mars OXygen In situ resource utilization Experiment) which splits up carbon dioxide (which is relatively abundant in the Martian atmosphere) into molecular oxygen through a process called solid oxide electrolysis.

    + +

    Water: Battling Dehydration

    + +

    How do we harness the precious water present underneath Mars's surface to make it potable? A tried and tested method has been to take a substantial amount of Martian soil and bake it in an 'oven', essentially targeting it with microwave beams that vaporizes the water from the soil, which can be condensed elsewhere.

    + +

    Food: Creating a Sustainable Environment

    + +

    Constantly shipping food from Earth to the Martian citizens is not an option: it's too expensive and risky. So, growing food on Mars is imperative. Providing supplements and removing some of the harsher chemicals from Martian soil should render it possible for vegetation.

    + +

    Another viable option is the hydroponic farming, which is the method of growing plants without soil by instead using mineral nutrient solutions in a water solvent.

    + +

    These are just the solutions to a few of the innumerable problems that Mars explorers and scientists will face, some of which haven't even been thought of yet. There exist the unanswered questions about consequences of the Martian low gravity and pressure on the human body. How will being on another planet affect their psychologies? We don't have the answers yet.

    + +

    Nevertheless, after the revolutionary Apollo Moon Landing of 1969, this is the most ambitious project undertaken by humans in the field of space exploration. Success of such a mission will provide answers to many important questions in science, opens up new possibilities in virtually every realm of human life and establishes us as an interplanetary species.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/communication-protocols-part1/index.html b/blog/communication-protocols-part1/index.html new file mode 100644 index 0000000..6cbba41 --- /dev/null +++ b/blog/communication-protocols-part1/index.html @@ -0,0 +1,568 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Consider a multiplayer game that involves two or more participants. As there are many multiplayer games on an online platform, there’s always a need to be a proper collaboration between the players. A game is only as good as its rules, and how well we play the game is defined by how well we follow the rules. Often, players ignore these “protocols” and end up messing the system with no result and just chaos. From this, you may guess these “protocols” are not just a necessity in games, but most of the aspects of life. Users (which include you and your online friend) need to communicate through a network to help simplify things.

    + +

    It involves “communication networks” which are a collection of methods that users employ to pass on valuable information. But what if illegitimate details are being passed on which is against the common man’s beliefs, or maybe the devices failed to communicate with each other because they didn’t talk in an organized manner or some unknown reason.

    + +

    In any communication network, it’s rules and regulations are essential for the smooth functioning of it. Similarly, in this electronic world, communication protocols are crucial for proper operating of the electronic system with each other.

    + +

    So anyone might raise a question: what do these communication protocols indicate in the Electronic world? We know that the set of rules and regulations is called a Protocol. Also, we can define communication (in general) as an exchange of information from one point, place, or system to another in a mutually accepted code understandable by both the sender and receiver. So through these sort of statements, we can define communication protocols, in terms of the electronic world, as a set of rules and regulations which ensure the flawless transfer of digital information within a system of two or more electronic networks.

    + +

    We can classify these protocols into two parts based on a communication channel, aka wired (like commonly used USB cable) and wireless (like Bluetooth/WiFi). Well, you know what these mean, but this is a vast division.

    + +

    Let us now concentrate our thinking on wired communication in a system where two or more electronic devices are present on it. Each packet is transmitted and received over a network. The packet contains binary data (ones and zeros that encode the contents of each message). As from basic knowledge of digital electronics, we know that electronic devices only understand binary language, or we can say that they transmit and receive information in the form of a bit or bits. Now maybe you think that why I highlighted these familiar words with almost the same meaning. Well, the tiny difference between these two words gives way to two further divisions for wired communication, i.e., serial and parallel.

    + +

    Serial communication means that while communicating, only 1 bit of information/data is passed at a time. Still, on the other hand, in Parallel communication, quite a few bits are sent at a time.

    + +

    img

    + +

    Their advantages and disadvantages can be deduced from their definitions only.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SerialParallel
    An only a single bit is getting transferred at a time so data transfer rate slow.Multiple bits are passed at the time, so transmission is fast as compared to Serial
    Serial Transmission is used for long-distance as less probability of cross talk.Parallel Transmission is used for a short distance as quite high chances of cross talk due to multiple wires
    Fewer wires/pins in a serial cable, which significantly reduces the size and thus the cost.More wires/pins increase size, and thus the overall cost.
    It requires a select type of converters to convert data into the serial form.There is no such requirement of converters in parallel transmission systems
    Examples: USB, I2C etc.Examples: PCI, SCSI, ISA etc.
    + +

    The decreasing cost and better performance of integrated-circuits have led to serial communication being used in favor of parallel communication.

    + +

    Serial Communication

    + +

    The most common serial communication system protocols can be classified under the following categories:

    + +
      +
    1. Asynchronous
    2. +
    3. Bit-Synchronous
    4. +
    5. Synchronous
    6. +
    + +

    Asynchronous

    + +

    A protocol which is not governed by a clock pulse, they don’t have to wait until the clock changes. The state of the system changes as soon as the input change. Bits of information are transmitted between two devices at an arbitrary point of time. RS-232, RS-422, RS-423, and RS-485 are some of the recommended standards (RS-XXX) of the Electronic Industry Association (EIA) for asynchronous serial communication. They also specify the communication system characteristics of the hardware, such as voltage levels, terminating resistances, cable lengths, etc.

    + +

    img

    + +

    Synchronous

    + +

    In contrast to Asynchronous protocols, in this type of protocol, clock signal wire is used by both receiver and sender to sample data. Synchronous data transfer with variable speed devices goes as fast as the slowest device involved in the transmission. This communication passes more information at a constant rate.

    + +

    Other Classifications

    + +

    The other type of classification we can do is based upon the type of external or internal data transfer i.e.

    + +
      +
    1. Intra: Communication between devices inside a single system
    2. +
    3. Inter: Communication between devices of two or more different systems
    4. +
    + +

    Some Important Points

    + +

    Before we jump into the individual protocol details, you need to look upon some essential terms which we will be using frequently:

    + +
      +
    1. A full-duplex system means data can be sent and received simultaneously. On the other hand, Half-duplex is referred to the method wherein data can be sent or received. It cannot be done at the same time.
    2. +
    3. Master/slave describes a bus where one device is the master, and others are slaves. These buses are usually synchronous, as the master often supplies the timing clock for data being sent along in both directions.
    4. +
    + +

    So, this concludes the introductory part of our series of blogs. To give you an idea of the further topics, the following diagram depicts the topics which will be covered in the upcoming blogs of this series.

    + +

    img

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/compliant-mechanisms/index.html b/blog/compliant-mechanisms/index.html new file mode 100644 index 0000000..a702ace --- /dev/null +++ b/blog/compliant-mechanisms/index.html @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What is a Mechanism?

    + +

    A mechanism is a mechanical device used to transfer or transform motion, force, or energy. Traditional rigid-body mechanisms consist of rigid links connected at movable joints. Whatever machines you see in your day to day life has some underlying mechanisms that govern its motion to produce the desired output. For example A NUT CRACKER works on the principle of MECHANICAL ADVANTAGE based on LEVER MECHANISM. This mechanism transfers energy from the input to the output.

    + +

    Since energy is conserved between the input and output (neglecting friction losses), the output force may be much larger than the input force, but the output displacement is much smaller than the input displacement. As mentioned earlier these mechanisms involve relative motion of rigid bodies often at very high speeds which various problems like Frictional Losses, Non Linear behavior, Non uniform Heat dissipation, etc. Thus modern day scientists are working on mechanisms that more or less achieve the same motion and force transfer with the help of flexible links and linkless joints.

    + +

    These 2 terms have tremendous significance when its comes to the emerging and exciting field of COMPLIANT MECHANISMS. So lets see what these wonders are and what are they capable of.

    + +

    Compliant Mechanisms

    +

    Compliant Mechanism

    + +

    A compliant mechanism also transfers or transforms motion, force, or energy. Unlike rigid-link mechanisms, however, compliant mechanisms gain at least some of their mobility from the deflection of flexible members rather than from movable joints only. Basically not all the links of a mechanism need to be flexible for it to be termed as A Compliant System but some important links must be flexible. Fully compliant mechanisms are very unstable and unreliable.

    + +

    Compliant mechanisms rely upon elastic deformation to perform their function of transmitting and/or transforming motion and force. From an overall perspective that considers performance, manufacturability, economy of material, scalability to micro and Nano sizes, adaptability to smart actuations and embedded sensors, resistance to wear, etc., compliant mechanisms are preferable over rigid body mechanisms.

    + +

    alt text

    + +

    Large number of compliant mechanisms are constructed of rigid links that are interconnected by Flexure Hinges design to undergo relatively low levels of rotation that traditional Revolute Pair Joints. A relatively less number of compliant mechanisms have compliant links in addition to the Flexure Hinges designed to undergo large deformation.

    + +

    alt text

    + +

    Currently available design techniques for compliant mechanisms can be grouped broadly into the following three categories based on the methods used as well as the type of mechanisms created using them.

    +
      +
    • Flexural pivot-based compliant mechanisms.
    • +
    • Flexible beam-based compliant mechanisms.
    • +
    • Fully compliant, elastic continua.
    • +
    + +

    Flexural pivot-based compliant mechanism

    + +

    Flexural pivot-based designs use narrow sections connecting relatively rigid segments. Thus, compliance is lumped to a few portions of the mechanism. They are usually of monolithic construction. They can be systematically designed either by starting from an available rigid-body linkage or an intuitively conceived linkage. So in this type mainly the joints are flexible which connects rigid links with each other. The biggest problem faced in this type is the force and momentum transfer is very limited. Compliant mechanisms of this type are often restricted to a small range of motion. Their applications are in precision instrumentation and many consumer products.

    + +

    Flexible beam-based compliant mechanisms

    + +

    Flexible beam-based compliant designs extend the range of motion because the slender beam-like segments are designed to undergo large deformations. These are not always of monolithic construction, as they may have some rigid segments and kinematic joints. Thus, they are sometimes partially compliant. Unlike in flexural pivot- based designs, the compliance is distributed in flexible beam-based designs.

    + +

    alt text

    + +

    Design of Compliant Mechanisms

    + +

    The first step in the design of a compliant mechanism is to establish a kinematicaly functional design that generates the desired output motion when subjected to prescribed input forces. This is called topological synthesis. Although the size and shape of individual elements can be optimized to a certain extent in this stage, local constraints such as stress and buckling constraints cannot be imposed while the topology is being determined. Once a feasible topology is established, performance constraints can be imposed during the following stage in which size and shape optimization are performed.

    + +

    Topology synthesis—which involves generation of a functional design in the form of a feasible topology starting from input/output force/motion specifications,

    + +

    Size and shape optimization—to meet performance requirements such as maximum stress, motion amplification or force amplification etc.

    + +

    General Design procedure involves Systematic methods of design of compliant mechanisms starting from functional specifications. First is deriving the topology of a compliant mechanism given the desired input forces and output displacements. Next, is optimizing the size and shape of various elements of a compliant mechanism in order to satisfy prescribed mechanical or geometric advantage, stress constraints, size constraints etc.

    + +

    alt text

    + +

    Advantages of Compliant Mechanisms

    + +

    There are a number of reasons why a compliant mechanism may be considered for use in a particular application.

    + +

    One advantage of compliant mechanisms is the potential for a dramatic reduction in the total number of parts required to accomplish a specified task.

    + +

    Some mechanisms may be manufactured from an injection-moldable material and constructed of one piece. For example, consider the fully compliant crimping mechanism shown in the figure below, along with its pseudo- rigid-body model. Due to symmetry, only half the mechanism is shown. The number of components required for the compliant mechanism are considerably less than for the rigid mechanism. The reduction in part count may simplify manufacturing and reduce manufacturing and assembly time and cost.

    + +

    alt text

    + +

    It is possible to realize a significant reduction in weight by using a compliant mechanism over their rigid- body counterparts. This may be a significant factor in aerospace and other applications. Compliant mechanisms have also benefited companies by reducing the weight and shipping costs of consumer products.

    + +

    The reduction in the total number of parts and joints offered by compliant mechanisms is a significant advantage in the fabrication of micro mechanisms. Compliant micro mechanisms may be fabricated using technology and materials similar to those used in the fabrication of integrated circuits.

    + +

    Disadvantages of Compliant Mechanism

    + +

    Perhaps the largest challenge is the relative difficulty in analyzing and designing compliant mechanisms. Knowledge of mechanism analysis methods and the deflection of flexible members is required. The combination of the two bodies of knowledge in compliant mechanisms requires not only an understanding of both, but also an understanding of the interactions of the two in a complex system. Since many of the flexible members undergo large deflections, linearized beam equations are no longer valid. Nonlinear equations must be used that account for the geometric nonlinearities caused by large deflections.

    + +

    Conclusion

    + +

    I believe the field of Complaint Mechanisms is still in its nascent stage and lots of research and quality work needs to be done regarding the fabrication of proper materials and design of flexible linkages. On the brighter side some of the greatest and brightest minds of the country are working on this field to expand its applications.

    + +

    Dr. G K Ananthasuresh from IISc Bangalore and Dr. Anupam Saxena from IIT Kanpur are among those few who have contributed quite a lot towards this field. I consider myself lucky to have got the opportunity to meet both of them personally here in NITK when they visited our college last semester for a 2 Day workshop on Kinematics and Mechanism conducted by Dr. Somasekhar Rao sir.

    + +

    Below are the links to the references. Thank You

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/computational-approaches-of-shock-waves/index.html b/blog/computational-approaches-of-shock-waves/index.html new file mode 100644 index 0000000..70c0e26 --- /dev/null +++ b/blog/computational-approaches-of-shock-waves/index.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    In this article I would like to discuss the two different CFD approaches while +solving for flows involving shock waves.

    + +

    In flow fields involving shock waves there is a sharp discontinuous change in +the flow variables like pressure, density, temperature, etc. across the shock. +The first approach is to have the shock wave appear naturally in the +computational domain as a direct solution of the governing equations. This is +called the shock capturing method. The second approach is to explicitly +introduce the shock wave into the flow and then solve the governing equations +for the rest of the domain (between the shock and some boundary) to determine +the effect of the shock on the flow field. This is called the shock fitting +method.

    + +

    The shock capturing method is used for complex flows for which we do not know +the location or number of shock waves. This approach also does not require any +special treatment of the shock within the algorithm used and hence simplifies +programming. The disadvantage of this approach is that the shock wave obtained +is smeared over a finite number of grid cells and rarely resembles the shape of +the physical shock wave and hence the precise location of shock discontinuity +and the shock thickness are uncertain within the mesh elements’ size.

    + +

    In contrast in the shock fitting method, the shock is treated as a discontinuity +and its location is defined numerically. However prior knowledge of the shock’s +location and the number of shocks is required which is a major disadvantage +while dealing with complex flows.

    + +

    Hence a combination of these two methods is generally used whenever possible. A +shock capturing approach is used to predict the approximate location of shocks +and then these shocks are fit midway during computation. Another combination is +to fit shocks explicitly in those parts where we know they occur and to employ a +shock capturing method for the remainder of the flow field.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/concorde/index.html b/blog/concorde/index.html new file mode 100644 index 0000000..16179b4 --- /dev/null +++ b/blog/concorde/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Concorde: Why did it fail?

    + +

    We had it.

    + +

    From January 21st, 1976 to October 24, 2003, we had a commercial supersonic passenger service, called the Concorde, that would bring people from London to New York in just 3.5 hours, a journey that now takes about seven. Alongside the Tupolev Tu 144, Concorde was an aircraft that could brag about its supersonic speed, at a time when other jets could only manage speeds of about 800kmph.

    + +

    Over the years, Concorde came to represent class and style among the elite class in England, France and the United States. With tickets costing up to 6 times the average cost of today's airfare, flights were usually jampacked with 120 members of the elite class, who enjoyed an extensive 2.5-hour French meal during the flight.

    + +

    The Concorde was a sight to marvel amongst all aviation enthusiasts, featuring ogival delta wings with four Olympus engines; Concorde flew at a record speed of Mach 2, twice the speed of sound. It was the only commercial aircraft that carried passengers at supersonic speeds, at a time when long distance travel was both expensive and difficult.

    + +

    Then, on October 24th, 2003, British airways flew Concorde for the last time. For 27 long years, passengers had access to a means of super sonic transport, and then suddenly, we stopped.

    + +

    The main reason for the retirement of Concorde came on July 2000, when an Air France operated Concorde suffered a fatal crash just after take-off. The crash took 113 lives, including all of the passengers and crew and four people on ground. It was the only fatal crash involving Concorde.

    + +

    According to the official investigation conducted by the Bureau d'Enquêtes et d'Analyses pour la Sécurité de l'Aviation Civile (BEA), the crash was caused by a metallic strip that had fallen from a Continental Airlines flight that had taken off minutes earlier. The metal strip punctured a tire on the Concorde's main wheel, causing the wheel to explode, puncturing the fuel tank in consequence. The resulting fire forced the crew to shut down the engine 2, and with engine 1 providing only little power, the aircraft was not able to gain altitude or speed. After a rapid pitch up, the aircraft suddenly descended and crashed at Hôtelissimo Les Relais Bleus Hotel in Gonesse.

    + +

    Following this incident, Concorde was grounded for a year. Service resumed in September 2001, by which time the 9/11 attacks had already depressed the industry.

    + +

    While both tragedies did contribute to the ultimate grounding in 2003, they were only a couple of pieces of the ultimate challenge the aircraft faced.

    + +

    High levels of noise during take off were one thing, but the sonic booms had no comparison. During test runs, residents complained of broken windows and extremely high noise disturbances. All this meant limiting supersonic flights to over the ocean, which crushed the American dream of Concorde.

    + +

    Concorde guzzled a lot of fuel, as it was always soaring higher and higher, going faster and faster. Fuel requirements limited the flights to trans-Atlantic flights, meaning there would be no trans pacific flights. They also guzzled enough fuel that slight changes in fuel prices would affect Concorde harder than others. fitting only 120 passengers at max capacity, this meant the prices had to be exorbitant. It couldn't compete with the cost distribution of high capacity flights like the Airbus A340 that could carry way more passengers for a lower cost. Concorde also needed specially trained crew members, and the maintenance cost was extravagant.

    + +

    And all this came for a very demanding crowd. Air France and British Airways had to position spare Concordes in New York in case the returning flight had some problems. So, there were always a Concorde on ground, not making any money, just in case. Because Concorde passengers expected to get walk onto a Concorde, for they had paid a lot of money.

    + +

    All these reasons, combined with minimal support from the aircraft manufacturers led to the ultimate downfall of the Concorde. The beast that once rose through the skies now sits idle at the many museums around the world. The story of Concorde tells us that no matter how innovative, jaw dropping, or inspiring a business model is, without proper supply systems, political resolves and a plan to expand, it won't sustain unless it makes money. People may not like that idea, but it is a fact of life.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/concrete-the-way-youve-not-seen-it/index.html b/blog/concrete-the-way-youve-not-seen-it/index.html new file mode 100644 index 0000000..9fbdca9 --- /dev/null +++ b/blog/concrete-the-way-youve-not-seen-it/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Concrete, as we know it today, is a mixture of cement, water, and some aggregates along with it. After Portland Cement was patented in 1824, concrete came out to the world as one of the most useful materials ever made by human beings. Now, it’s leading the construction industry from the front by being the most durable building materials. It provides good fire resistance, and structures made of concrete have a long service time. But, to go along with the endless list of positives of concrete, there are a few negatives as well. Let’s find out more.

    + +

    History of Concrete

    + +

    The traders may have built the first concrete structures in oases of Southern Syria around 6500 BC. These traders kept the concrete as dry as possible as excess water weakens the concrete. By 700 BC, they figured out how to build kilns to produce material for the construction of concrete floors, rubble-wall houses, underground waterproof cisterns, etc. These cisterns were kept secret and probably were why these people were able to thrive in the deserts of Syria.

    + +

    The Egyptians, later in-3000BC, used gypsum and lime mortars in building the pyramids. The bedding material used in the Great Pyramid of Giza was 500000 tonnes of lime mortar. The mortar was used for casing stone which is the visible surface of the pyramid. Around the same time, the Chinese were able to build the Great Wall of China using a particular kind of cement which was also used in boat building.

    + +

    Later came the Romans, who are considered the masters of cement and concrete. By 200BC, the Romans were building very successfully with material like cemented rubble. They have created many beautiful structures like the Pantheon, Colosseum, and numerous arches and domes.

    + +

    The Rise of the Concrete Industry

    + +

    Concrete is the most used human-made material ever. It’s the second most consumed substance after water. Every second, over 3000 bathtubs of concrete are used for construction. Concrete production has increased more than 30 folds since 1950 and almost four-folds since 1990. China used more concrete in 2011-2013 than the USA in the 20th century. All these numbers say concrete is one of the essential materials in the modern-day. It is the foundation of modern development, roof for billions of people, strengthening us to fight the natural calamities, and providing structure to significant buildings like schools, hospitals, etc.

    + +

    So, why are we speaking these numbers? Why are we calculating the amount of concrete which is helping humans in such a notable fashion? It is because one of the chief nature of the concrete is to harden and degrade dangerously slowly. Then why is it less discussed than plastic?

    + +

    Concrete against Nature

    + +

    It’s because it’s not getting found in the stomachs of animals, its traces aren’t found in our blood, we don’t see it in every other trash.

    + +

    Not degrading is not the only problem with concrete. Concrete is a dominant contributor to global warming and other climate crises. If concrete were a country, it would be the third most CO₂ producer only after the USA and China. The main ingredient in concrete is cement, which is produced by a kiln which requires a tremendous amount of fossil fuels which in turn contributes to CO₂ emission. This is not the only way in which the concrete industry produces CO₂.

    + +

    Half of the CO2 emissions in the production of concrete come from the reaction that breaks up the calcium carbonate into CO and CO₂, and the other half from the fossil fuels required to heat the kilns and transport the materials. Concrete accounts for about 8% of total CO₂ emission. This might not sound much compared to other industries such as transportation, electricity, agriculture, but researchers have already come up with a few gripping solutions to this concrete situation.

    + +

    Solutions

    + +

    It’s almost unbelievable sometimes that with some research and innovation, what feat we can achieve. One example is CarbonCure’s concrete. Its innovative system injects CO₂ into the concrete as it’s being mixed. When the concrete hardens, those otherwise harmful emissions are sequestered forever before it even enters our atmosphere. CarbonCure converts the CO₂ into a mineral which itself helps to strengthen the material. So, now, we will be able to use less cement in their mixture and still get the same strength. With its innovative technology, CarbonCure has saved over a hundred thousand tonnes of CO₂ produced. The best thing about CarbonCure is, it comes at the same cost as the standard concrete which we use!

    + +

    There are multiple other alternatives such as ashcrete, greencrete, mycelium, etc. But these materials are new and can’t account for the same strength that concrete promises.

    + +

    Conclusion

    + +

    With everything said, there are multiple arguments against concrete, and many of which show us why using concrete is necessary. But we must control concrete from growing into a highly polluting industry like plastic. The recent increase in concrete consumption and the predicted increase in consumption in coming years only acknowledge the fact. CarbonCure and other innovations such as this can make the burden less on nature to sustain.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/consensus-mechanism-in-blockchain/index.html b/blog/consensus-mechanism-in-blockchain/index.html new file mode 100644 index 0000000..1567b1b --- /dev/null +++ b/blog/consensus-mechanism-in-blockchain/index.html @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    CONSENSUS MECHANISM

    + +

    The Blockchain is an undeniably ingenious invention, By definition,_ Blockchain_ is a continuously growing list of records, called blocks, which are linked and secured using cryptography. Each block typically contains a cryptographic hash of the previous block, a timestamp, and transaction data. By design, a blockchain is inherently resistant to modification of the data. It is “an open, distributed ledger that can record transactions between two parties efficiently and in a verifiable and permanent way”. This technology has led to various new inventions in the cryptocurrency marketplace such as Bitcoin, Ethereum, Ripple, and many others, all of these technologies use DLT (Distributed Ledger Technology) as their core foundation, For use as a distributed ledger, a blockchain is typically managed by a peer-to-peer network collectively adhering to a protocol for validating new blocks.

    + +

    Thus, Blockchains in essence are distributed databases, the network’s nodes must reach an agreement on the network’s current state. This agreement is achieved using consensus mechanisms.

    + +

    NEED FOR CONSENSUS MECHANISM

    + +

    In a centralized organization, all the decisions are taken by the leader or a board of decision-makers. This isn’t possible in a blockchain because a blockchain has no “leader”. For the blockchain to make decisions, they need to come to a consensus using “consensus mechanisms”. Consensus algorithms check the integrity of new blocks and past blocks

    + +

    Distributed systems rely on large numbers of autonomous authorities to cooperate in the maintenance of a single network. These distinct nodes must have a computational mechanism by which to arrive at an agreement on what the most recent and accurate record of data is.

    + +

    Over the years different kinds of consensus mechanisms were devised based on different principles, let’s take a look at 2 of the most important mechanisms;

    + +

    PROOF OF WORK:

    + +

    The Blockchain network is shared by numerous users who do transactions. These transactions need to be further validated to add them to the block and then to the chain. This task is carried out by miners (The validators), The miners validate a set of transactions from the transaction pool, verify them, bundle them together in a block, and add this block to the current blockchain. But in order to prevent any forgery and double-spending and to agree upon the correct sequence of the blocks, we need a consensus mechanism. That’s where proof of work comes into the picture.

    + +

    In proof of work, miners compete to add the next block (a set of transactions) in the chain by racing to solve an extremely difficult cryptographic puzzle. The miners calculate a complex mathematical puzzle, called the NONCE.

    + +

    transactions are processed into blocks. Each block has a:

    + +

    block difficulty – for example: 3,324,092,183,262,715

    + +

    mixHash – for example: 0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29

    + +

    nonce – for example: 0xd3ee432b4fb3d26b

    + +

    The proof-of-work protocol requires miners to go through an intense race of trial and error to find the nonce for a block. Only blocks with a valid nonce can be added to the chain. The miner that gets the valid nonce first gets to add the next block in the blockchain.

    + +

    The proof-of-work protocol follows the longest chain rule.

    + +

    “ The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. — Satoshi Nakamoto

    + +

    All the nodes trust the longest chain in a blockchain without trusting each other directly. The objective of proof-of-work is to extend the chain. The longest chain is most believable as the valid one because it’s had the most computational work done. It’s nearly impossible to create new blocks that erase transactions, create fake ones, or maintain a second chain. That’s because a malicious miner would need to always solve the block nonce faster than everyone else.

    + +

    To consistently create malicious yet valid blocks, you’d need over 51% of the network mining power to beat everyone else. You’d need a lot of computing power to be able to do this amount of “work”. And the energy spent might even outweigh the gains you’d make in an attack.

    + +

    PROOF OF STAKE

    + +

    POS uses a different approach compared to POW. The miner commits the currency ( stake) he has to the blockchain network to get an opportunity to mine. A chosen random miner with a stake validates the block transaction. If a miner cannot commit to the stake, the miner can join a stake pool to participate in the mining.

    + +

    Unlike proof-of-work, validators don’t need to use significant amounts of computational power because they’re selected at random and aren’t competing. They don’t need to mine blocks; they just need to create blocks when chosen and validate proposed blocks when they’re not. This validation is known as attesting. Validators get rewards for proposing new blocks and for attesting to ones they’ve seen.

    + +

    If you attest to malicious blocks, you lose your stake.

    + +

    A COMPARISON

    + +

    Energy consumption is one major difference between the two consensus mechanisms. Because proof-of-stake blockchains don’t require miners to spend electricity on duplicative processes (competing to solve the same puzzle), proof of stake allows networks to operate with substantially lower resource consumption.

    + +

    Both consensus mechanisms have economic consequences that penalize network disruptions and malicious actors. In proof of work, the penalty for miners submitting invalid information, or blocks, is the sunk cost of computing power, energy, and time. In proof of stake, the validators’ staked crypto funds serve as an economic incentive to act in the network’s best interests. In the case that a validator accepts a bad block, a portion of their staked funds will be “slashed” as a penalty. The amount that a validator can be slashed depends on the network

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/convnets/index.html b/blog/convnets/index.html new file mode 100644 index 0000000..1e93c7a --- /dev/null +++ b/blog/convnets/index.html @@ -0,0 +1,590 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    img-1

    + +

    A Convolutional Neural Network is a Deep Learning algorithm which can take an input image, assign learnable weights to various aspects/objects in the image and be able to differentiate one from the other.

    + +

    It is based on the convolution mathematical operation. Convolution layers consist of a set of filters that are just like two-dimensional matrices of numbers. The filter is then convolved with the input image to produce the output. In each convolution layer, the filter slides across the image to perform the convolution operation. The main agenda of the convolution operation is matrix multiplication of the filter values and pixels of the image, and the resultant values are summed to get the output.

    + +

    But why ConvNets over traditional neural networks?

    + +

    Reason 1: Images are Big

    + +

    Images used for Computer Vision problems nowadays are often 224x224 or larger. Imagine building a neural network to process 224x224 colour images: including the 3 colour channels (RGB) in the image, that comes out to 224 x 224 x 3 = 150,528 input features! A typical hidden layer in such a network might have 1024 nodes, so we'd have to train 150,528 x 1024 = 150+ million weights for the first layer alone. Our network would be huge and nearly impossible to train.

    + +

    Reason 2: Positions can change

    + +

    If you trained a network to detect dogs, you'd want it to be able to a detect a dog regardless of where it appears in the image. Imagine training a network that works well on a certain dog image, but then feeding it a slightly shifted version of the same image. The dog would not activate the same neurons, so the network would react completely differently! Moreover, objects in images are made up of small, localized features, like the circular iris of an eye or the square corner of a piece of paper. It seems wasteful for every node in the first hidden layer to look at every pixel.

    + +

    So let's look at the architecture of a CNN model. It typically comprises of three types of layers

    + +

    1. Convolutional layers

    + +

    img-2

    + +

    In the convolutional layer, the weight kernel moves to the right with a certain stride value till it parses the complete width. Moving on, it hops down to the beginning (left) of the image with the same stride value and repeats the process until the entire image is traversed.

    + +

    Conventionally, the first convolutional layer is responsible for capturing the low-level features such as edges, colour, gradient orientation, etc. With added layers, the architecture adapts to the high-level features as well, giving us a network which has the wholesome understanding of images in the dataset, similar to how we would.

    + +

    To capture features in the borders, the images are typically augmented with zeros along the four edges. This is known as zero padding.

    + +

    img-3

    + +

    2. Pooling layers

    + +

    Just like convolutions, pooling is done to reduce the dimensions of the feature map in order to decrease the computational power required to process the data. The pooled values are further passed into the activation function (sigmoid, ReLU etc.) and input to the next layer.

    + +

    img-4

    + +

    There are two types of pooling, namely Max pooling and Average pooling. In max pooling, the maximum value in a kernel is pooled out whereas in average pooling the mean of the kernel is pooled out for further processing.

    + +

    3. Fully connected layers

    + +

    After going through the above processes in multiple layers, the model is able to understand features of various complexity from the training data. Finally, we flatten the final output and feed it to a regular Neural Network for classification.

    + +

    img-5

    + +

    The overall training process can be summarised as follows:

    + +
      +
    1. +

      We initialize all filters and weights with random values

      +
    2. +
    3. +

      The network takes a training image as input, goes through the forward propagation step (convolution, ReLU and pooling operations along with forward propagation in the Fully Connected layer) and finds the output probabilities for each class.

      +
    4. +
    5. +

      It calculates the total error at the output layer using a loss function like binary cross-entropy, mean-squared error, triplet loss, etc.

      +
    6. +
    7. +

      Finally, it uses backpropagation to calculate the gradients of the error with respect to all weights and uses gradient descent to update them to minimize the output error.The weights are adjusted in proportion to their contribution to the total error.

      +
    8. +
    + +

    Now, let's visualize the layers of a ConvNet. Consider the following model taken from one of the sources mentioned below:

    + +

    img-6

    + +

    The input image contains 1024 pixels (32 x 32 image) and the first Convolution layer (Convolution Layer 1) is formed by convolution of six unique 5 × 5 filters with stride 1 on the input image.

    + +

    Convolutional Layer 1 is followed by Pooling Layer 1 that does 2 × 2 max pooling with stride 2 separately over the six feature maps in Convolution Layer 1.

    + +

    img-7

    + +

    Pooling Layer 1 is followed by sixteen 5 × 5 convolutional filters with stride 1 that perform the convolution operation. This is followed by Pooling Layer 2 that does 2 × 2 max pooling.

    + +

    Finally, we have the fully connected layers as follows

    + +

    img-8

    + +

    1)120 neurons in the first fully connected layer

    + +

    2)100 neurons in the second fully connected layer

    + +

    3)10 neurons in the third and final fully connected layer. This is the output layer. Note that the pixel corresponding to the digit 8 is the brightest which means the model classifies the hand written digit as 8 with highest probability.

    + +

    Here are some popular CNN Architectures:

    + +
      +
    1. LeNet-5:
    2. +
    + +

    img-9

    + +
      +
    1. AlexNet:
    2. +
    + +

    img-10

    + +
      +
    1. VGG-16:
    2. +
    + +

    img-11

    + +

    Conclusion

    + +

    ConvNets are a trending topic today in both, academia as well as industry. They are used for a plethora of tasks like object detection and recognition, semantic segmentation, medical imaging and many more.

    + +

    In this blog, I have tried to explain the fundamental concepts of convolutional neural networks with substantial simplicity. We have seen the types of layers used in ConvNets, some popular CNN architectures and visualized different layers from a model. Hope it was informative!

    + +

    References:

    + +

    https://www.analyticsvidhya.com/blog/2018/12/guide-convolutional-neural-network-cnn/

    + +

    https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

    + +

    https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/coronary-stents/index.html b/blog/coronary-stents/index.html new file mode 100644 index 0000000..eabef93 --- /dev/null +++ b/blog/coronary-stents/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    How coronary stents work?

    +

    A Brief Breakdown On One Of The Most Frequented Surgeries.

    + +

    Ever wondered how exactly stents are used during or after an angioplasty? Why did this method replace bypass surgeries for minor heart attacks ? Well, read on to comprehend.

    + +

    What is coronary artery disease (CAD)?

    +

    CAD happens when a waxy substance called plaque builds up on the inner walls of the coronary arteries. This causes the arteries to harden and narrow, decreasing blood flow to the heart. +As a result , the heart doesnt getthe blood, oxygen and nutrients it needs, which can lead to chest pain or a heart attack.

    +

    What are stents and how do they work?

    + +

    Fig.1

    + +

    Coronary stents are small, wire, mesh tubes that help widen a clogged artery and restore adequate blood flow to the heart. during the procedure, the stent is placed over a thin, long tube with a balloon tip called a catheter and inserted into an artery in the thigh or arm. +once the stent reaches the clogged artery, the balloon is inflated to expand the stent. when the stent reaches the desired size to widen the clogged artery, it is deflated and the balloon is removed.

    + +

    Fig.2

    + +

    The stent will stay in place permanently to help prop open the artery and decreases its chance of narrowing agin. over time, the inner lining of the artery will grow over the surface of the stent, making it a permanent part of the artery.

    + +

    Materials used

    +

    Stainless steel is the most widely used material.

    + +

    Fig.3

    + +

    But in balloon expandable stents, cobalt alloy is used.It is composed of cobalt, chromium and other metal elements . compared to stainless steel , cobalt alloy is stronger and has a higher radiocapcity. these properties make thinner struts (framework) possible. thinner struts make the device more flexible and reduce the stents cross-sectional diameter. +Nitinol (fig 4) is another alloy used , which is composed mostly of nickel-titanium as well as cobalt and other metal elements. Nitinol alloy is the material most commonly used in self-expanding stents. +Nitinol stents have 2 unique merits: super elasticity and shape-memory properties.

    + +

    Fig.4

    + +

    Advantages

    +

    In certain patients, stents reduce the re-narrowing that sometimes occurs after balloon angioplasty or other procedures that use catheters. +patients who have angioplasty and stents recover from these procedures much faster than patients who have coronary artery bypass surgery. They have much less discomfort too.

    + +

    Can stented arteries reclose?

    +

    In over a third of patients who have had angioplasty without a stent , the artery that was opened begins to become narrowed again within months of the procedure. Stents help prevent this by the use of drugs along with the them

    + +

    You can watch the following video for a better visualization.
    +https://youtu.be/t-zCBKRg7Cs

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cpu-vs-gpu/index.html b/blog/cpu-vs-gpu/index.html new file mode 100644 index 0000000..23868ff --- /dev/null +++ b/blog/cpu-vs-gpu/index.html @@ -0,0 +1,560 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    CPUs Vs GPUs: Allies or Foes?

    + +

    CPUs are the brains of a computer handling connections and all the processes involved in running your computer.

    + +

    While this remains true even today, one doesn’t attain a full picture of the basic processing in a modern computer.

    + +

    See the source image

    + +

    Over the past decade, another rapidly improving component of a modern computer which is just as important or even more so is the GPU.

    + +

    So, what is a GPU?

    + +

    See the source image

    + +

    I’m not a gamer so I don’t need GPUs. +This is a common misconception that is spread among less technically-inclined people. +One might hear that “GPUs are a waste of money and only used for gaming.” +This is definitely not the complete story and a classic case of over-simplification. +A GPU or GRAPHICS PROCESSING UNIT is used for displaying video output and will be found on all modern devices capable of the same.

    + +

    iGPU vs dGPU: What do you have?

    + +

    Integrated GPUs (iGPUs) share die-space with your processor and are found baked into most desktop processors and all mobile processors. +Yes, your thin and light laptop with an Intel CPU, contrary to common myths, has a GPU too.

    + +

    See the source image

    + +

    Intel HD or Iris graphics are among the common names for Intel’s iGPUs. +Even the Adreno on your fancy Android phone is an iGPU baked into your Snapdragon processor

    + +

    Dedicated GPUs(dGPUS) are physically separate from the die-space of your CPU and communicate with the CPU via PCIE lanes.

    + +

    Due to having a physically separate die (this allows the manufacturers to have a higher degree of freedom while choosing the die size, no. of cores and other factors), we see larger variations in power draw as well as performance.

    + +

    See the source image

    + +

    Table 1

    + +

    PCIE LANES

    + +

    PCIE or Peripheral Component Interconnect Express, determines the devices that are attached or plugged into the motherboard. It identifies the links between each device, creating a traffic map and negotiates the width of each link.

    + +

    In simple terms, one could describe them as highways with a direct connection from your computer parts to your CPU. The lanes can also be visualized as highway lanes. Higher bandwidth for more lanes, just like more traffic can flow on more lanes.

    + +

    Since dedicated GPUs are bandwidth-heavy compared to other components like USBs or storage drives, we usually allocate them with 8 or 16 lanes.

    + +

    Here is a small table, containing the maximum bandwidth of various PCIE generations.

    + +

    See the source image

    + +

    PARALLEL PROCESSING

    + +

    Now, let’s have a look at the fundamental differences in the processing approach of a GPU compared to a CPU.

    + +

    Table 2

    + +

    A CPU consists of a few powerful cores (relatively speaking) with a lot of cache memory that is good at handling sequential tasks but not as good at conducting multiple tasks simultaneously. A GPU on the other hand consists of many more simpler cores which are individually weaker and capable of fewer instructions than a CPU core but together can perform a task optimized for parallel processing much faster than a CPU.

    + +

    This makes them ideal for graphics, where textures, lighting and the rendering of shapes have to be done at once to keep images flying across the screen.

    + +

    I suggest that you take a look at this short video for an interesting depiction of the idea presented above.

    + + + +

    Artificial Intelligence

    + +

    AI has also made rapid strides thanks to the parallel processing nature of GPUs.

    + +

    They have become key to a technology called “deep learning.” Deep learning pours vast quantities of data through neural networks, training them to perform tasks too complicated for any human coder to describe.

    + +

    VRAM

    + +

    VRAM or Video Random Access Memory acts as a buffer between the CPU and the GPU. It stores the data of all the images and videos the GPU generates. It is also referred to as a frame buffer.

    + +

    If the system does not have a sufficient amount of VRAM, the textures and images you are trying to load can cause GPU to overflow on the system’s RAM. This will cause poor performance due to the increased latency.

    + +

    More VRAM is better but may not necessarily indicate better performance between different GPUs.

    + +

    CONCLUSION

    + +

    We can certainly see that GPUs are here to stay.

    + +

    However, due to having better performance than CPUs only in optimized or specific scenarios, one can conclude that the two complement each others’ weaknesses rather than outright replacing the other.

    + +

    Resources:

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cuba-and-candela-thin-shell-structures-and-their-strength-through-curvature/index.html b/blog/cuba-and-candela-thin-shell-structures-and-their-strength-through-curvature/index.html new file mode 100644 index 0000000..7bf098a --- /dev/null +++ b/blog/cuba-and-candela-thin-shell-structures-and-their-strength-through-curvature/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Before plunging into understanding the beauty of the thin shell structures or even knowing whatgwho the candela in the title refers to. Let us imagine a scenario where you’re at an eatery. You pick up a slice of pizza, and you’re about to take a bite. But it flops over and sags about your fingers. Maybe you should have gone for fewer toppings? No really. Enough experience with pizzas has taught us that folding the pizza slice into a U-shape keeps the pizza from flopping over .

    + +

    img1

    + +

    Behind this simple intuition there lies a powerful mathematical result about curved surfaces. One that’92s so startling that its discoverer, the mathematical genius Carl Friedrich Gauss, named it Theorema Egregium, Latin for excellent or remarkable theorem. +Gauss’s wanted to define curvature in such a way that bending does not affect the curvature. On any surface, let us say spherical , one can trace many paths to come down from the top. Gauss intended to use all these choices into account. Here’s how it works. Starting at any point, find the two most extreme paths that you can choose (i.e. the most concave path and the most convex path). Then multiply the curvature of those paths together (curvature is positive for concave paths, zero for flat paths, and negative for convex paths). The number you get is Gauss’s definition of the curvature at that point.

    + +

    Let us take the case of a Cylinder, the two extreme paths from any point are namely, a straight path and a completely circular path. Since the straight path has zero curvature, thus the Gaussian curvature of a Cylinder is zero. That’s the reason why engineers say cylinder is flat. Similarly curvature calculations with sphere, we get the Gaussian curvature to be a non zero value.

    + +

    So spheres are curved while cylinders are flat. You can bend a sheet of paper into a tube, but you can never bend it into a ball. A surprising consequence of this result is that you can take a surface and bend it any way you like, so long as you don’t stretch, shrink or tear it, and the Gaussian curvature stays the same. That’s because bending does not change the distances between any two points. Similarly, have you ever tried gift wrapping any spherical object , let’s say a football(ggmu). No matter how you bend a sheet of paper, it’ll always retain a trace of its original flatness, so you end up with a crinkled mess.

    + +

    Now back to pizza, initially the pizza was flat, Gaussian curvature was zero. So when the pizza flopped while eating the breadth of the pizza was straight maintaining the Gaussian curvature zero. Now instead by forcing it to bend we are forcing it to become flat in the other direction..Once you recognize this idea, you start seeing it everywhere. By curving a sheet in one direction, you force it to become stiff in the other direction.

    + +

    Now let us consider the scenario of an egg. Take an egg from your fridge and try to squeeze it by putting your fingers around it. You’ll surprised to see that you can’t. This is due to the fact that egg shells are curved on both sides, thus giving higher rigidity.

    + +

    Shape for a nuclear power plant cooling tower also incorporates curvature in both directions. This shape, called a hyperboloid, minimizes the amount of material required to build it

    + +

    img2

    + +

    Hyperboloid Parabaloid is another shape that uses double curvature. You can look into the infamous punch of a Mantis Shrimp to know more regarding the exceptional strength of this shape.

    + +

    img3

    + +

    So what makes this Hyperboloid Parabaloid shape so strong? It has to do with how it balances pushes and pulls. All structures have to support weight, and ultimately transfer this weight down to the ground. They can do this in two different ways. There’s compression, where the weight squeezes an object by pushing inwards. An arch is an example of a structure that exists in pure compression. And then there’s tension, where the weight pulls at the ends of an object, stretching it apart. The hyperbolic paraboloid combines the best of both. The concave part is stretched in tension while the convex part is squeezed in compression Through double curvature, this shape strikes a delicate balance between these push and pull forces, allowing it to remain thin yet surprisingly strong.

    + +

    The strength of this shape was well understood by the Spanish-Mexican Architect and Engineer Felix Candela. He built structures that took the hyperbolic paraboloid shape. When you hear the word concrete, you might think of heavy, boxy constructions. Yet Candela was able to use the hyperbolic paraboloid shape to build huge structures that expressed the incredible thinness that concrete can provide. His lightweight, graceful structures might seem delicate, but in fact they’re immensely strong, and built to last. Felix Candela is one of the greatest structural engineers of the twentieth century. Candelas work demonstrates three ideals which are essential to the education of structural engineers and to anyone with an appreciation for the built environment: Firstly to conserve natural resources by minimizing materials. Secondly , to reduce cost by intelligent design . Lastly creating beautiful structures. His structures were a testimony to all the three ideals.

    + +

    In the late 1950’s his influence spread across the world and one such country which embraced this type of thin shell structures was Cuba. Cubans have an international reputation for their spirited high-quality art, which is manifested in mediums such as paintings, sculptures, cinema, music, as well as the design of structures. +Here are a few of the thin shell structures in and around Havana which came up during the 1950’s in consequence to the famous partnership between Max Borges and Felix Candela.

    + +

    The colorful outdoor shells frame the entrance to the famous Tropicana Nightclub in Havana, Cuba

    + +

    The Nunez Galvez tomb

    + +

    Parque Jos'e9 Mart'ed, a sports complex

    + +

    There was a lot of optimism and hope that permeated Cuba during the forties and fifties. As can be witnessed in these remarkable structures.

    + +

    But then Castro happened. And left Cuba Crawling. Numb.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cubesats/index.html b/blog/cubesats/index.html new file mode 100644 index 0000000..ad58636 --- /dev/null +++ b/blog/cubesats/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    image1

    + +

    Let’s start off with what “CubeSats” are, and how they are different from other small satellites. Any satellite that weighs less than 300 kg is called a small satellite, but a CubeSat must adhere to more specific size, shape, and weight. The aim of CubeSats is to reduce design and deployment costs and make satellites more affordable for students, commercial bodies or space agencies to work with. You might have come across a bunch of high schoolers on the news making a lightweight, cheap and workable satellite. If these satellites happen to measure 10cm x 10cm x 11cm and weigh 1.33 kg, this would be a 1U CubeSat. Where U is the standard CubeSat unit, CubeSats may be 1.5U, 2U, 3U, etc.

    + +

    CubeSats have various applications. They are useful for education and research, conducting experiments and demonstrations in space, climate monitoring and disaster response, connectivity for IoT, communications, earth monitoring, etc. NASA launched a CubeSat as part of its CAPSTONE mission in 2020 to test the planned orbit for the Lunar Gateway, a space station that would orbit the moon. The images sent by ISRO’s Cartosat-2 series satellite will be useful for more accurate cartography and land mapping, coastal land regulation, road monitoring, water distribution, etc. QuakeSat by Quakefinder California helps scientists improve earthquake detection. NASA’s GeneSat 1 is conducting bizarre biology experiments in outer space to study the genetic changes that occur on exposure to the space environment. Beyond helping space enthusiasts take their first step into rocket science, CubeSats have wide and varied applications.

    + +

    Let’s have a brief look at what makes up a CubeSat. A CubeSat consists of many subsystems such as (a) flight computer, (b) electrical power system, (c) altitude control, (d) sensors, (e) radio and other components of choice, and (f) the structure.

    + +

    image2

    + +

    Before looking into what these systems are and how they work, it is imperative to know – what do you want your CubeSat to do? Statistics show that it takes months just to develop your concept.

    + +

    After you are done with planning, how you build your satellite ultimately depends on your budget. While cheaper than other satellites, they are still not exactly affordable for an ordinary college kid to make. A CubeSat kit costs 11,000 USD ignoring payload and launch costs!

    + +

    With some research, you will find that a basic CubeSat would have a computer unit containing the memory, and the command centre. It can also have components such as an internal temperature monitor, real-time clock for time keeping, etc.

    + +

    The power system uses solar battery and would require you to know your “power budget”, i.e., how much power the various components on your avionics board consumes, and thus calculate how much minimum power is required to get your CubeSat running.

    + +

    The altitude control system is responsible for the stable orientation of the CubeSat in its orbit, generally consisting of magnetic field and torque controllers.

    + +

    Sensors like gyroscope, magnetometer, temperature sensors, etc. can be used to retrieve data about the environment. Depending on what you want your CubeSat to do, you could add on a multitude of other more specific sensors.

    + +

    A radio system is required for communication purposes, connecting the CubeSat through a communication satellite to a ground station. A GPS to track its current location and time can also be added.

    + +

    CubeSats, despite being continuously studied and improved upon for nearly three decades since their first development in the 1990s, with nearly 2000 launched as of 2020, there is still tremendous scope for research. CubeSats are essential, not just for remote sensing, but also for emerging communications technology, internet of space things, and various other applications.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/cvt/index.html b/blog/cvt/index.html new file mode 100644 index 0000000..aaaccf2 --- /dev/null +++ b/blog/cvt/index.html @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    +

    A Continuously variable transmission is a type of power transmission which be called as an efficient replacement for a conventional automobile gearbox with a gearshift. A CVT is a system of belt and pulleys which is used to achieve infinite gear ratios between the 2 transmission shafts. The CVT consists of 2 pulleys – the primary and the secondary. Both the pulleys have one movable sheave and one stationary sheave. A belt (V shaped) goes over these pulleys. The angle of the V belt is equal to the angle between the facing sides of movable and stationary sheave of the pulley. The movable sheave makes the belt to slide up or down in the pulley as it moves towards and away from the stationary sheave. This is how infinite gear ratios are achieved in a CVT. But the main reason why a CVT is used is because, after a certain speed is achieved , the rpm of the engine remains constant irrespective of the increase in the speed of the vehicle as the throttle is held open.

    + +

    alt text

    + +

    Explanation of the working through graph analysis

    +

    The below image shows the graph of working of a manual transmission system . After the max rpm is reached in 1st gear, there is a grilling sound which is an indication to change the gear. When the gear is shifted to 2nd , the rpm comes down due to the inertial effect of the increased load from the higher gear. This is due to the substantial difference in gear ratio between 1st and 2nd gear. Further, the transmission runs in the 2nd gear and while shifting to 3rd gear, the engine rpm comes down again.

    + +

    alt text

    + +

    But consider a transmission which has infinite gear ratios in which there is an infinitesimal difference between 2 gear ratios. So, while shifting the gear, the dip in engine rpm is very small which is why it can be assumed that the rpm remains constant. +alt text +The job of a CVT tuner is to set the constant working engine rpm to be equal to the rpm at which maximum torque or maximum power is attained, according to our requirement. For this, we have a set of springs and flyweights, the right combination of which will lead us to the desired working rpm.

    + +

    Use of Springs and Flyweights

    +

    At zero rpm, the belt rests lowest in the primary and highest in secondary pulley. The primary pulley has a set of pressure springs and flyweights. The pressure spring force keeps the movable sheave away from the stationary sheave. The flyweights are pivoted at one end in the movable sheave of the primary pulley. When the rpm increases, the centrifugal force(mw2r)on the flyweight increases which make them open out radially. While this happens, it presses against the pressure spring. When it has sufficient amount of centrifugal force, it will suppress the pressure spring and thus, the movable sheave moves towards the stationary sheave raising the belt higher in the primary pulley. This is known as primary pulley engagement. The secondary pulley too, has a torque spring whose inertial force has to be overcome in order to engage the secondary pulley. This engagement happens when the tension in the belt is sufficient to suppress the torque spring in the secondary. +When both sheaves are engaged , the belt rises in the primary and comes down in the secondary(as belt length remains constant).So, a new higher gear ratio is obtained at every instant which increases the load at every instant and thus, keeps the engine rpm constant while the output vehicle speed increases.

    + +

    Importance of modeling a CVT

    +

    Mathematical modeling and design optimization of the working of the CVT is very important in order to achieve a good efficiency of power transmission. It also reduces time as it prevents the iterative tests to be conducted to achieve best performance. Here, the objective function is chosen as the 0ptimization of power/torque which is governed by variables such as spring constants (k), flyweights(w) , rpm and constraints like friction. The governing equations of CVT can also be input in a simulation software in order to check the results ,and from the results obtained ,new inputs which are closer to the required values can be simulated and so on a loop can be created which finally converges to the desired value.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/dealing-with-underdetermined-systems/index.html b/blog/dealing-with-underdetermined-systems/index.html new file mode 100644 index 0000000..fa0ff37 --- /dev/null +++ b/blog/dealing-with-underdetermined-systems/index.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    incidence matrix

    + +

    What is meant by “under-constrained” system?

    + +

    I will start off this segment with my favourite quote.

    + +

    “To the ones who tread the path less taken; To the ones who believe the answer to everything lies in data.”

    + +

    The answer to all problems lies in how much you know about it. Most engineering problems and their math models are inherently under-constrained. It is not surprising, we have all seen physics problems give under-constrained systems. The best example is in the definition of electric potential. All electric potentials are with reference to potentials at infinity where the potential is assumed to be zero. In classical terms, it would sound like this.

    + +

    “If the potential at infinity is zero, the potential at x is V(x)”

    + +

    Engineering systems have to mean a lot more than “if” s. At the end of the day, we have to be able to use it and it has to make sense. An under-constrained system like this is seen more often than an engineer like to see and we have to find a way around it while keeping reality. Let’s look at some interesting examples.

    + +

    Linear Networks

    + +

    Most electric circuits, linear in nature and electronic circuits are linearised, are underdetermined. Starting from the point when we have to define potentials at nodes stating “if the potential at infinity was zero, then the potential here is ..”. To realise, analyse, debug and re-create such devices are impossible in that case. We construct a model using classical graph theory. Linear components give an incidence matrix for the linear network. The system equation then reduces to the normal equation. Even then, the square matrix constructed out of the incidence matrix A, will not be invertible because A has linearly dependent columns. How do we fix this? How do we have all our systems working if we can’t debug them?

    + +

    The insight is in localising infinity. Engineers call it circuit ground node. The simplest setup is to set it at zero and reduce the square matrix by one row and one column which then gives an invertible system. Now everything is merry and we move on debugging and building better circuits!

    + +

    Ground Node

    + +

    Optical Flow

    + +

    This problem is more in my research areas. Optical flow algorithms for calculating motion of objects in a video. The foundations layed by Horn and Schunk are based on “brightness constancy”, a very simple idea and practical in most cases since most videos are shot at more than 25fps. Turns out this is another under-constrained system. Optical flow is a displacement vector of every pixel in a movie frame. So that means every pixel needs two numbers to give its optical flow and we only have one constraint, brightness constancy. How do we deal with this?

    + +

    This is more of what Indians like to call “Jugaad”. We will expect more and then come up with another constraint. If brightness constancy gave us two conditions, we would never think of this. Jugaad for real! We will expect motions in the video to be smooth. Now of course, this wouldn’t happen in a Harry Potter movie where things magically appear and disappear, but let’s keep things “real” :P The solutions now are given from a functional that Horn and Schunk construct based on the smoothness constraint and brightness constancy. Two conditions to give two numbers and we can happily move on!

    + +

    There are faster, traditional methods to use the smoothness constraint and this time jugaad is more real! It is so jugaad-y that it lead me to write this blog on ‘Dealing with under-constrained systems’. But it makes good sense in most cases and gives good results and that’s what matters. The idea that Lucas-Kanade proposed is in using the smoothness constraint in using the same optical flow in a nine point neighbourhood. Now it suddenly becomes over-determined and the system is solved by a least-squares approximation over the nine-points. This now gives smooth variations in the optical flow of the frame! Problem solved and we make it better!

    + +

    Hamburg Taxi Sequence

    + +

    Sub-Nyquist Sampling and Reconstruction

    + +

    This is something everyone wants. Sub-Nyquist sampling, slower sampling rates and money to invest in more accuracy. Well, Shannon-Nyquist designed a theorem for the entire sampling framework and there is proof to why you cannot perfectly reconstruct every signal while sampling below Nyquist rate. Why? Simply because the system then becomes under-constrained. To what signals can we develop plausible constraints?

    + +

    We look at a class of signals called ‘FRI’ or signals with Finite Rate of Innovation. These signals are seen in transrecivers where the signal received is only a combination of delayed and attenuated versions of the signal that is transmitted. Now we have two parameters for every replication of the transmitted signal that is received and we need just twice the number of samples to the number of replications received. Then the system has enough constraints to solve! Job done again! And we see again that under-constrained systems are very much solvable under certain situations.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/deconv/index.html b/blog/deconv/index.html new file mode 100644 index 0000000..1619f03 --- /dev/null +++ b/blog/deconv/index.html @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Demystifying Deconvolutions

    + +

    This article mainly discusses about Up-sampling with Deconvolution. If you’ve heard about the term Deconvolution, and are willing to learn more about it, please read on.

    + +

    The contents of the this article is as follows:

    + +
      +
    • The need for Up-sampling
    • +
    • Convolution Operation
    • +
    • Going backward
    • +
    • Convolution Matrix
    • +
    • Transposed Convolution Matrix
    • +
    + +

    Deconvolution is also known as Transposed Convolution and Fractionally-strided Convolution.

    + +

    The need for Up-sampling

    + +

    When we use neural networks to process or generate images, there is a decrease in the size of the intermediate images in the subsequent layers.

    + +

    fig1

    + +

    Sometimes, when an output result having the size same as the input image is to be generated, using the learned parameters, up-sampling is useful. This technique is used to up-sample images from low-resolution to high-resolution.

    + +

    Convolution Operation

    + +

    I will use a simple example here to discuss about the convolution operation.

    + +

    Suppose we have a 4x4 matrix, and we wish to convert it to a smaller 2x2 matrix. This can be accomplished by using a 3x3 “kernel” as shown below.

    + +

    fig2

    + +

    The convolution operation calculates the sum of the element-wise multiplication between the input matrix and kernel matrix. Since we can slide the kernel twice through the input matrix, the resulting output will be of size 2x2.

    + +

    fig3

    + +

    One important point of such convolution operation is that the positional connectivity exists between the input values and the output values.

    + +

    For example, the top left values in the input matrix (4, 5, 8, 1, 8, 8, 3, 6, 6) affect the top left element in the output matrix (122). This spatial relationship is essential; in images, any set of features on the top-left corner must be showcased in the top-left corner of the resulting smaller image (in the form of learnable parameters).

    + +

    More concretely, the 3x3 kernel is used to connect the 9 values in the input matrix to 1 value in the output matrix. A convolution operation forms a many-to-one relationship. Let’s keep this in mind as we need it later on.

    + +

    Going backward

    + +

    Now, suppose we want to go the other direction. We want to associate 1 value in a matrix to 9 values in another matrix. It’s a one-to-many relationship. This is like going backward of convolution operation, and it is the core idea of transposed convolution.

    + +

    For example, we could up-sample a 2x2 matrix to a 4x4 matrix, maintaining the 1-to-9 relationship.

    + +

    fig4

    + +

    To talk about how such an operation can be performed, we need to understand the convolution matrix and the transposed convolution matrix.

    + +

    Convolution Matrix

    + +

    We can view the process of converting a 4x4 matrix to a 2x2 matrix, in another way. +We can express a convolution operation using a matrix. It is nothing but a kernel matrix rearranged so that we can use a matrix multiplication to conduct convolution operations.

    + +

    fig5

    + +

    We rearrange the 3x3 kernel into a 4x16 matrix as below:

    + +

    fig6

    + +

    Each row defines a convolution operation, separated by one or more zeros.

    + +

    The first step is to flatten the input matrix of size 4x4 into a column vector (16x1).

    + +

    fig7

    + +

    We can matrix-multiply the 4x16 convolution matrix with the 1x16 input matrix (16 dimensional column vector).

    + +

    fig8

    + +

    The output 4x1 matrix can be reshaped into a 2x2 matrix which gives us the same result as before.

    + +

    fig9

    + +

    In short, a convolution matrix is nothing but rearranged kernel weights, and a convolution operation can be expressed using the convolution matrix.

    + +

    Transposed Convolution Matrix

    + +

    We want to go from a smaller 2x2 matrix to a larger 4x4 matrix. But there is one very important thing to consider; we want to maintain the 1-to-9 relationship.

    + +

    Let us reshape the 2x2 input matrix to a 4x1 column vector as before. If we have a 16x4 matrix with us, we could perform the operation

    + +

    (16x4) x (4x1) = (16x1)

    + +

    to get a 16x1 column vector, which we could then resize to the desired 4x4 output.

    + +

    In order to get this 16x4 matrix, we use the convolution matrix used earlier, whose dimensions were 4x16. If the convolution matrix is denoted by C, then its transpose CT has the shape (16x4).

    + +

    Through careful observation, you can convince yourself that the transposed matrix CT connects 1 value in the input to 9 values in the output.

    + +

    fig10

    + +

    The output can be reshaped into 4x4.

    + +

    fig11

    + +

    Note: The actual weight values in the matrix does not have to come from the original convolution matrix. They are learnable. What is important is that the weight layout is transposed from that of the convolution matrix (4x16 to 16x4).

    + +

    References:

    + +

    A guide to convolution arithmetic for deep learning

    + +

    https://arxiv.org/abs/1603.07285

    + +

    Convolution Arithmetic Tutorial

    + +

    http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html

    + +

    Up-sampling with Transposed Convolution

    + +

    https://towardsdatascience.com/up-sampling-with-transposed-convolution-9ae4f2df52d0

    + +

    Convolutional Neural Networks

    + +

    http://cs231n.github.io/convolutional-networks/

    + +

    An Introduction to different Types of Convolutions in Deep Learning

    + +

    https://towardsdatascience.com/types-of-convolutions-in-deep-learning-717013397f4d

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/design-of-aircraft-windows/index.html b/blog/design-of-aircraft-windows/index.html new file mode 100644 index 0000000..3e520e7 --- /dev/null +++ b/blog/design-of-aircraft-windows/index.html @@ -0,0 +1,485 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Everything in an aircraft you see is for a reason. Nothing is there coincidentally. And one such thing is the shape and design of the windows.

    + +

    With increase in commutation through flights, the aeroplanes started flying at higher altitudes, since lesser air density meant lesser drag which directly affected fuel efficiency. Also turbulence due to atmosphere is less. But some modifications had to be done to make the conditions safe for the passengers at high altitudes. So, a pressurized cabin was introduced into the flights. This pressurized cabin keeps the interior of the flight at a higher pressure compared to the low atmospheric pressure. This initiates an expansion of the flight due to which a stress field is formed.

    + +

    The shape of the window plays an important role in the formation of this field. In square windows used before, when the stress field line flowed and encountered the window, it changed its path sharply around the corners increasing the stress at the corners significantly. This high stress caused the formation of cracks in the windows leading to three tragic crashes. Later investigation and analysis proved the reason for the cracks, leading to change the shape of windows to oval or circular where the stress field lines bend smoothly without resulting in high stress concentration.

    + +

    Another curious thing about the aircraft design is a tiny hole located at the bottom of the windows. The window is actually made of three panes. There is a gap between the outer pane and the inner pane in which air is filled to maintain a steady temperature gradient to prevent condensation of vapour on the middle pane. Now, this air, due to high pressure might crack the window open. This is where the little hole comes into picture. The hole located on the outer pane balances out the pressure difference between the atmosphere and the air in between the panes.

    + +

    The third pane? That is the inner pane which is just added as an extra safety measure so that the passengers cause no damage to the middle pane.

    + +

    So, the next time you see anything in an aircraft, remember there’s loads of engineering behind it.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/dp-on-trees/index.html b/blog/dp-on-trees/index.html new file mode 100644 index 0000000..66dfa53 --- /dev/null +++ b/blog/dp-on-trees/index.html @@ -0,0 +1,1211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    DP on Trees is a very useful Technique in problem-solving, +The prerequisite for learning this is a very basic understanding of Trees, vectors, and DP. +Before directly diving into the topic, We will discuss some topics in brief, they are:

    + +
      +
    • Difference between graphs and Trees.
    • +
    • Adjacency List
    • +
    • DFS.
    • +
    • Dynamic Programming.
    • +
    + +

    Difference between Graphs and Trees

    + +

    Trees are a Subset of Graphs, like graphs they are represented by nodes and edges, a popular shout is “ any graphs with n nodes and n-1 edges is a tree “ , it’s not completely correct, here is an example to contradict it,

    + +

    alt_text

    + +

    In the above example we have 4 nodes and 3 edges , yet it is not a tree.

    + +

    So, what’s the complete definition, the complete definition can be +“A Tree is a connected graph with no cycles”. +A Tree is a connected graph without any cycle, such graphs can be thought of suspended from the node.

    + +

    alt_text

    + +

    but any graph which satisfies the above criteria can be converted into a tree, for example

    + +

    The following diagram does not looks like a conventional tree

    + +

    alt_text

    + +

    But it can easily be converted into a tree by pivoting it at any node let’s pivot it along node 2

    + +

    alt_text

    + +

    Adjacency list

    + +

    We have seen how a tree looks like, now let’s see how we can store a graph in memory when we are given with edges between the nodes. +There are many ways to do it, but the easiest way to do it is using the adjacency list, which is an array of vectors. +For each node, we have a vector, which stores all the adjacent nodes(nodes which are directly connected to it by an edge).

    + +

    If nodes a and b are connected by an edge then a must be present in the adjacency list of b, and vice-versa.

    + +

    Let’s take an example for the following tree,

    + +

    The adjacency list of the graph is:

    + +
      +
    • 1 –> 2 , 3, 4
    • +
    • 2 –> 1, 5
    • +
    • 3 –> 1, 6, 7
    • +
    • 4 –> 1
    • +
    • 5 –> 2, 8
    • +
    • 6 –> 3
    • +
    • 7 –> 3
    • +
    • 8 –> 5
    • +
    + +

    For a tree with n nodes , there are a total of 2n - 2 elements in an adjacency list in total because we will have exactly n-1 edges and

    + +

    And each edge connects 2 nodes.

    + +

    Let’s write a C++ code for making adjacency list of a Tree.

    + +
    #include<bits/stdc++.h>
    +using namespace std;
    +
    +int main()
    +{
    +
    +    int nodes, edges, i, j; 
    +
    +    cout<<”\nEnter the Number of nodes and edges: ;
    +
    +    cin >> nodes >> edges;                //We read number of nodes and edges.
    +
    +    vector<int> adj[nodes + 1];
    +
    +    cout << "\nEnter the edges: ";
    +
    +    for (i = 1; i <= edges; i++)
    +
    +    {
    +
    +        int x, y;
    +
    +        cin >> x >> y;                    
    +
    +        adj[x].push_back(y);            //If x is adjacent to y which means that y is also adjacent to x 
    +
    +        adj[y].push_back(x);
    +
    +    } 
    +
    +    for(i=1 ;  i<=nodes; i++)             // We go through each node and print its adjacency list.
    +
    +    {  cout<<"The adjacency list of node "<<i<<" is : ";
    +
    +        for(j=0; j<adj[i].size(); j++)        
    +
    +       {     cout<<adj[i][j]<<"  "; 
    +
    +       } 
    +
    +      cout<<”\n;
    +
    +    }
    +
    +    return (0);
    +
    +}  
    +
    + +

    Input:

    + +

    Enter the number of nodes and the edges: 8 7

    + +

    Enter the edges: 1 2 1 3 1 4 2 5 3 6 3 7 5 8

    + +

    Output:

    + +
      +
    • The adjacency list of node 1 is: 2 3 4
    • +
    • The adjacency list of node 2 is: 1 5
    • +
    • The adjacency list of node 3 is: 1 6 7
    • +
    • The adjacency list of node 4 is: 1
    • +
    • The adjacency list of node 5 is: 2 8
    • +
    • The adjacency list of node 6 is : 3
    • +
    • The adjacency list of node 7 is : 3
    • +
    • The adjacency list of node 8 is: 5
    • +
    + +

    Note that no list can be empty because in tree every node is connected to at least one node.

    + + + +

    Traversing a Graph means visiting each node of a Graph.

    + +

    There are 2 main ways of traversing a graph:

    + +
      +
    • DFS (depth first search)
    • +
    • BFS (breadth first search)
    • +
    + +

    We will be discussing DFS only on Trees , not on Graph.

    + +

    For DFS on Graph you can refer to this link:https://www.geeksforgeeks.org/depth-first-search-or-dfs-for-a-graph/

    + +

    We will only discuss DFS because it is required for understanding DP on Trees.

    + +
      +
    • Parent-child convention: + For understanding DFS or any topic related to Tree, we use this convention, in this, we fix a root node and then we add children to it, then if the child also has a child we call it grandchild of root node and child of the node which is connected to.
    • +
    + +

    alt_text

    + +

    In the above example node, 1 is the root node, node 2 and 3 are children of root 1, node 4 and 5 are children of root 2 and grandchildren of root 1, and similarly, 6 is the child of root 3 and grandchild of root 1. +It is often misunderstood that a node cannot have more than 2 children.
    +Only in a Binary Tree, we can have at most 2 children, but in general, it’s ok if a node has more than 2 children.

    + +

    alt_text

    + +

    So in the above figure , if we do dfs of root node 1, the order will be

    + +

    1 → 2 → 5 → 3 → 4→ 6→ 7 → 8

    + +

    So overall in DFS we finish all the children before moving to the next child, and this is true for every node we visit.

    + +

    alt_text

    + +

    First, 1 is Parent Node and node 2 is its child, so before visiting 3 we have to complete 2.

    + +

    alt_text

    + +

    Similarly, now node 2 is its parent node and root 4 and its children have to be completed before we visit 5. +Let’s take an example:

    + +

    alt_text +First we visit the root node.

    + +

    alt_text +Then we move on to its first child.

    + +

    alt_text +Then we visit the child of node 2.

    + +

    alt_text +after we are done with all the children of node 2 we move onto node 3.

    + +

    alt_text +Since there are no children of 3 we move to the next child which is 4.

    + +

    alt_text + then we move to first child of 4 That is node 6.

    + +

    alt_text +Then we complete the node 7.

    + +

    alt_text + and we finish it with node 8.

    + +

    Now let’s write code for it, in which we have the edges(using the adjacency list program ) and print the order in which the nodes are visited.

    + +

    Here we define a function DFS which accepts the adjacency list, + the node on which we are performing DFS, and the parent of the node.

    + +
     void Dfs(int v,vector<int> adj[], int p)
    +
    +{
    +
    +    cout << v << " ";     //We print the current node
    +
    +    int i;
    +
    +    for (i = 0; i < adj[v].size(); i++)
    +
    +    {
    +
    +        if (adj[v][i] != p)    // so that we don't print the parent node 
    +
    +        {
    +
    +            Dfs(adj[v][i], adj, v);  //Now our current node becomes the   parent node , and the child of it                                becomes the main node(v)                                   
    +
    +        }                                                          
    +
    +    }
    +
    +}  
    +
    + +

    Input:

    + +

    Enter the edges: 1 2

    + +

    2 5

    + +

    1 3

    + +

    4 8

    + +

    1 4

    + +

    4 6

    + +

    4 7

    + +

    Output:

    + +

    1 2 5 3 4 8 6 7

    + +

    Now let us see how the code works :

    + +
    dfs(1, 0)
    +
    +    dfs(2, 1)
    +
    +         dfs(5, 2)
    +
    +         end
    +
    +    end
    +
    +    dfs(3, 1)
    +
    +    end
    +
    +    dfs(4, 1)
    +
    +        dfs(6, 4)
    +
    +        end
    +
    +        ....
    +
    +    end
    +
    +end
    +
    +
    + +

    Dynamic Programming (DP)

    + +

    Dynamic Programming is a very powerful technique, it is a huge topic in itself, for a more detailed overview of DP you can visit +https://www.geeksforgeeks.org/dynamic-programming/. +To put it in a nutshell Dynamic Programming is mainly an optimization over plain recursion, it helps us to reduce both space and time complexity(For learning more about time Complexity please refer to https://www.geeksforgeeks.org/understanding-time-complexity-simple-examples/ ). +The idea is to store the results of previous subproblems so that we do not have to re-compute them when needed later. Though it does not sound very groundbreaking, it can convert an exponential function to a linear one, let’s consider some examples

    + +

    Find the nth term of Fibonacci .

    + +

    If you don’t know what Fibonacci series is please refer:

    + +

    https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/

    + +

    Now we know the following property of a fibonacci number

    + +

    F[n] = F[n-1] + F[n-2] , n>2

    + +

    F[1] = 0

    + +

    F[2] = 1

    + +

    Now the first approach which comes to mind is the recursion

    + +
     int fib(int n)   //To find the n fibonacci number 
    +
    +{ if(n==1)
    +
    +   return(0); 
    +
    +   if(n==2)
    +
    +   return(1); 
    +
    +   else 
    +
    +   return(fib(n-1) + fib(n-2));
    +
    +}  
    +
    + +

    The recursion is very straight forward, but the time complexity of program is exponential https://www.geeksforgeeks.org/time-complexity-recursive-fibonacci-program/ +Now let’s calculate the same with DP

    + +

    Let’s declare an array of integer fib[100] in which the i index will contain the ith term of Fibonacci series, +Now the first 3 values can be assigned manually fib [0]=0 as there is no 0th term. +Fib[1] =0 as the first term is 0. +Fib[2] =1 as second term is 1.

    + +

    Now run a basic for loop from index 2,

    + +
    int fib(int n)
    +
    +{ int i,fib[100]; 
    +
    +   fib[0]=0; 
    +
    +   fib[1]=0;
    +
    +   fib[2]=1; 
    +
    +    for(i=3; i<=n; i++)
    +
    +    fib[i]=fib[i-1]+fib[i-2]; 
    +
    +    return(fib[n]);
    +
    +}   
    +
    + +

    So basically we calculate the value of any term from the previous two terms, we do this in a linear time hence time complexity is 0(n). +Plus we have one more advantage if we are given with x queries of +Terms, for example: find the nth term of Fibonacci series for the following terms: x1, x2, x3, x4, …xn. +If we go by recursion the answer will take even more time, but solving it with DP, we can do it in linear time just going through the for loop once, how? +All we need to find out the largest among x1,x2,….xn.
    +And we can then find Fib[max(x1,x2,x3….)], and all other values will be calculated among the way, +Ex: let’s say im given with 5 queries : 3, 8, 17, 27, 21.
    +Now, all we need to calculate is Fib[27] because values of Fib[17], Fib[21], Fib[3], Fib[8], will be calculated along the way.

    + +

    Ex: let’s say im given with 5 queries : 3, 8, 17, 27, 21.

    + +

    Now all we need to calculate is Fib[27] because values of Fib[17], Fib[21], Fib[3], Fib[8], will be calculated along the way.

    + +

    Let us consider one more example :

    + +

    We have an array of n integers and we have to find the maximum subarray(continuous block of integers having maximum sum), the problem is only interesting if we take negative integers into consideration otherwise it is a no brainer, and length of block is not fixed.

    + +

    For example, consider the following array

    + +

    alt_text

    + +

    If we check manually the greatest sum is from index 1 to index index 5 which is

    + +

    alt_text

    + +

    2 + 4 + (-3) +5 +2 = 10. But it is impossible to check it manually for larger array, so how do we go about it?

    + +

    The first approach which comes to mind is fixing the first element

    + +

    And then calculating all possible cases with remaining elements, store the maximum result and then change the first element and repeat the process.

    + +

    Understanding it with diagrams

    + +

    Let’s fix “a” at index 0 and then lets shift “b” first b will start with index “0”, this is the case when the maximum subarray is the first element itself

    + +

    alt_text

    + +

    The sum is -1

    + +

    Then let’s shift b to index 1

    + +

    alt_text

    + +

    the sum will be a to b that is -1 +2 = 1.

    + +

    Now shift b to right once more

    + +

    alt_text

    + +

    Sum is 1+ 4 = 5.

    + +

    Keep shifting it, till you reach the end

    + +

    alt_text

    + +

    Sum is 5 +(-3) = 2

    + +

    alt_text

    + +

    Sum is 2+ 5 = 7.

    + +

    alt_text

    + +

    Sum is 7 +2 = 9.

    + +

    alt_text

    + +

    Sum is 9 +(-5) = 4

    + +

    alt_text

    + +

    Sum is 4 +2 = 6.

    + +

    Now b has reached the end, note the maximum sum = 9

    + +

    Now when b reaches the last index shift a to right by 1 index

    + +

    alt_text

    + +

    alt_text

    + +

    alt_text

    + +

    Keep going till the b reaches its end then again shift a by 1 index to the right, finally stop when we have reached the following stage:

    + +

    alt_text

    + +

    And note the maximum value noted throughout the process, its code is very straight forward

    + +
    int maxsub(int a[], int n)
    +
    + {   int i,j; 
    +
    +     int best = 0;
    +
    +      for (i = 0; i < n; i++)
    +
    +    {
    +
    +        int sum = 0;
    +
    +        for (j = i; j <= n; j++)
    +
    +        {
    +
    +            sum = sum + a[j];
    +
    +            best = max(best, sum);
    +
    +        }
    +
    +    } 
    +
    +    return best;
    +
    +}
    +
    + +

    We assign best to the minimum value possible, then we repeat the above process. +The time complexity of this method is O(n^2).

    + +

    Now surprisingly, we can also solve this in O(n) approach using DP, Let’s see how, +The idea is to calculate for each position, the maximum sum of the subarray that ends at that position, after that the answer is a maximum of those sums.

    + +

    Now consider the subproblem of finding the maximum-sum subarray that ends at position k , there are 2 possibilities

    + +
      +
    • The Subarray only contains the element at position k
    • +
    • The subarray consists of a subarray that ends at position k-1, followed by the element at position k.
    • +
    + +

    In the latter case, since we want to find a subarray with the maximum sum, the subarray that ends at position k-1 should also have the maximum sum, thus we can solve the problem efficiently by calculating the maximum subarray sum for each ending position from left to right.

    + +

    Example

    + +

    Initially we assign sum =0 and best =0 (which will store our answer) and consider the same array

    + +

    alt_text

    + +

    Let’s write the code first and then we will discuss more,

    + +
    int Maxsub(int a[], int n)
    +
    +{
    +
    +    int k, i, sum = 0, best = 0; 
    +
    +     for (k = 0; k < n; k++)
    +
    +    {
    +
    +        sum = max(a[i], a[i] + sum + a[i]);
    +
    +        best = max(sum, best);
    +
    +    } 
    +
    +    return best; 
    +
    +}
    +
    + +

    When we iterate for the first time, sum =0, a[i]=-1, a[i]+sum =-1 , so either way the value of sum becomes -1, and the best values remains the same 0, it means that any subarray ending at index i=0, will have a maximum sum of -1,then for the second time i=1, a[i] = 2, and sum+a[i] = 1, so sum will now take maximum of those values which is 2, and best value will also become 2, means the maximum subarray that ends at index 1, can have a sum of 2, now when we iterate for the 3rd time, a[i] =4, sum + a[i] = 6, so sum will take maximum of value which is 6 and best will also be equal to 6, again which means maximum subarray that ends at index 2 has sum of 6, we can go on till the last index and find the maximum subarray sum which is value of best.

    + +

    DP on Trees

    + +

    Now that we have covered every prerequisite topics, in brief, we will move on to DP on Trees. Let’s directly dive into some problems, +The first problem is very standard:

    + +

    Given a Tree with n weighted nodes(nodes which contain any finite value), calculate the maximum sum of the node values along a path from root to any leaves without re-visiting any node

    + +

    Now first let us understand the problem, +We are at the root node, we need to go to any leaf node, to which the sum of nodes visited along the way is maximum, now if we think carefully, we can only visit a node in only one way, and to visit a specific leaf node , there is only one way , hence we will calculate the sum of elements along the way , this would become clear with the following diagram.

    + +

    alt_text

    + +

    Now if we come out of node

    + +

    11 –> 3 + 1 +1+4 = 9

    + +

    12 –> 5 +1+1+3 =10

    + +

    13 –> 9 + 9 + 2 + 3 = 23

    + +

    14 –> 8 + 9 + 2 + 3 = 22

    + +

    8 –> 1+10+3 = 14

    + +

    9 –> 5 + 10 + 3 = 18

    + +

    10 –> 3 + 10 + 3 = 16

    + +

    Here since the tree is small , we can manually calculate,but if the trees are large, it is impossible to do it manually, so we will try to solve it using DFS and Dp,

    + +

    Let’s Write the complete Program for it

    + +
    #include <bits/stdc++.h>
    +
    +using namespace std;
    +
    +int dfs(int v, vector<int> adj[], int p, int a[])
    +
    +{
    +
    +    int i, max = 0;
    +
    +    for (i = 0; i < adj[v].size(); i++)
    +
    +    {
    +
    +        if (adj[v][i] != p)
    +
    +        {
    +
    +            int temp = dfs(adj[v][i], adj, v, a);
    +
    +            if (temp > max)
    +
    +                max = temp;
    +
    +        }
    +
    +    }
    +
    +    return (max + a[v]);
    +
    +}
    +
    +int main()
    +
    +{
    +
    +    int nodes, i, edges;
    +
    +    cin >> nodes>>edges;
    +
    +    int a[nodes + 1];
    +
    +    cout << "\nEnter the values in the node: ";
    +
    +    for (i = 1; i <= nodes; i++)
    +
    +        cin >> a[i];
    +
    +    vector<int> adj[nodes + 1];
    +
    +    cout << "Enter the edges: ";
    +
    +    for (i = 0; i < edges; i++)
    +
    +    {
    +
    +        int x, y;
    +
    +        cin >> x >> y;
    +
    +        adj[x].push_back(y);
    +
    +        adj[y].push_back(x);
    +
    +    }
    +
    +    cout << dfs(1, adj, 0, a) << "\n";
    +
    +    return (0);
    +
    +}
    +
    + +

    Now Let’s go through the program,

    + +

    The main function is almost the same as the adjacency list one, except here we have some values, stored in the node itself, so here we pass 4 things to the function, the root node, the adjacency list, parent of node(which is 0 for root node), and an array of values in the nodes.

    + +

    Now, the main logic of the problem is that we first go to the leaves nodes, and then we start moving upward and each time, we move up , we pass the maximum value that can be obtained from the children of the root to its root then the root returns the maximum value plus the value in the root to its parent node, this process continues till we reach the root node.

    + +

    Now Let’s Trace the code

    + +
    dfs(1,adj,0,a)
    +
    +    dfs(2,adj,1,a)
    +
    +      dfs(5,adj,2,a) 
    +
    +         dfs(11,adj,5,a)
    +
    +         returns  4 to dfs(5,adj,2,a),setting the max value to 4
    +
    +         End dfs(11,adj,5,a)
    +
    +         dfs(12,adj,5,a) 
    +
    +         returns  5 to dfs(5,adj,2,a),changing  the max value to 5
    +
    +         End  dfs(12,adj,5,a) 
    +
    +      returns  (5+1(its own value)) to dfs (2,adj,1,a)
    +
    +     End dfs(5,adj,2,a) 
    +
    +     dfs(6,adj,2,a)
    +
    +     Returns 3(its only value)  to dfs(2,adj,1,a)
    +
    +     End
    +
    +    returns 6 + 1(its own value ) to dfs(1,adj,0,a)    
    +
    +    dfs(3,adj,1,a) 
    +
    +    .
    +
    +    .
    +
    +    .
    +
    +    .
    +
    +    .
    +
    +    .
    +
    +
    +    Till we get the maximum sum from the 3 children, and we finally add the value of node 1 (3) to it.  
    +
    + +

    Now there is one more interesting property, we can find this value for any node present on the tree, how? +Because we can suspend a tree from any node in the tree, here is an example of suspending it from node 5

    + +

    alt_text

    + +

    We can still calculate the maximum sum ,all we need to do is to call dfs(5,adj,0,a) instead of dfs(1,adj,0,a) from the main function !!!

    + +

    Now Let’s take one more example

    + +

    Given a Tree with n weighted nodes(with values attached to them),

    + +

    choose a subset of nodes such that no two adjacent nodes(i.e. nodes connected directly by an edge) are chosen and sum of values of the chosen nodes is maximum.

    + +

    Now, the problem might sound a bit complex, if we think the problem breaks down to , choosing nodes which are not directly connected by an edge, we cannot choose both the child and parent in every child parent node, this problem is very similar to +1-D array problem where we are given an array A1, A2, …, AN; we can’t choose adjacent elements and we have to maximise sum of chosen elements, Here the approach will be very similar to the earlier question( maximum subarray ), either the element will be included or it won’t be included. +The final formula will be

    + +
    dp[i] = max(dp[i-1],a[i]+dp[i-2]),   i <= i<= n.
    +
    + +

    This gives us some basic idea about the problem, but unlike the array problem, we don’t have direct adjacent elements, the best way will be defining our state to which subtree we are solving for. For defining subtrees we need to root the tree first. Say, if we root the tree at node 1 and define our dp[v] as the answer for subtree of node V, then we will keep moving up till we reach node 1. +Now, similar to the array problem, we have to decide on including node V in our subset or not. If we include node V, we can’t include any of its children(say v1, v2, …, vn), but we can have the grandchildren of node v, and if we don’t include v we can include +All the children of node v, +Let’s say we are at node v, to calculate the maximum from the leaf nodes, we will again have to travel from bottom to node v, and then decide whether we want to consider the value of node v, and then we pass the value to the parent node of v, Here is the code

    + +

    For this we have to consider 2 arrays, we need the adjacency list and also the value in the nodes and parent of node, let’s assume they are present globally,

    + +
    vector<int> adj[100];
    +int dp1[100], dp2[100];
    +void dfs(int V, int p, int a[])  //a is the value in the nodes 
    +{
    +
    +    
    +    int sum1 = 0, sum2 = 0;
    +    for (auto v : adj[V])
    +    {
    +        if (v == p)
    +            continue;
    +        dfs(v, V);
    +        sum1 = sum1 + dp2[v];
    +        sum2 = sum2 + max(dp1[v], dp2[v]);
    +    }
    +
    +    dp1[V] = a[V] + sum1;
    +    dp2[V] = sum2;
    +} 
    +
    +The final answer will be the maximum value of dp1[1] and dp[2]. 
    +
    + +

    Useful Resources

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/ds1-a-demonstration-spacecraft-and-its-communication-aspects/index.html b/blog/ds1-a-demonstration-spacecraft-and-its-communication-aspects/index.html new file mode 100644 index 0000000..b95b456 --- /dev/null +++ b/blog/ds1-a-demonstration-spacecraft-and-its-communication-aspects/index.html @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Deep Space 1: How and what does it do on Space??

    +

    Deep Space 1 or DS1 is a satellite launched by National Aeronautics and Space Administration (NASA) in 1998 to serve its purpose as a technology demonstration spacecraft. It was launched to test various upcoming technologies in space, its conditions, outcomes, threats or limitations of the proposed technology etc. in real time in space rather than earthly simulations. +We are interested to learn how DS1 or any satellite in outer space carry out efficient communications to Space stations in Earth. For this, we must first be aware of Deep Space Network (DSN).

    +

    Deep Space Network

    +

    Deep Space Network is a network of large antennas positioned in Earth to capture various signals from the spacecrafts, used to provide scientific data, instructions to spacecraft, health of the spacecraft etc. NASA has positioned three antennas on three locations on Earth, namely California, Spain and Australia, each oriented at an angle of 120 degrees with each other and are spread onto three equidistant points on Earth as above so that at any +Each location has ultra-sensitive receiver systems with huge antennas namely

    +
      +
    • High Efficiency Antenna (HEF) for high gain (34m in diameter)
    • +
    • Two or more Beam Waveguide Antennas (BWG) (34m in dia)
    • +
    + +

    and several other independent antennas for tracking the spacecraft.

    + +

    alt text +alt text +alt text

    + + +

    Tracking of the satellite is mainly achieved by uplink and downlink communications by satellites and space stations on Earth. Uplink refers to communication from a space station to the satellite, whereas downlink refers to communication from satellite to station. When both uplink and downlink occur, it is referred to as Two Way communication. Communication is mainly done using RF signals (mainly microwaves, i.e. in GHz range).

    + +

    alt text

    +

    Lag

    +

    Lag is another term that decides the efficiency of communication in DSN. It is the time gap between sending of signal by source and receiving it by the receiver. Lag should be taken care, as when a satellite sends signals for help, instant solutions to the problems must be ready, otherwise making it too late for anything more. +So back to our satellite DS1.

    + +

    DS1 also uses DSN as the network to downlink data. DS1 mainly transmits two kinds of data :

    +
      +
    • Health of spacecraft: It refers to the status of the spacecraft with its surroundings in terms of temperature, pressure, voltages, images etc. These measurements (which may go around 1000 in number) are collected and transmitted as radio waves. These are radio waves are simple enough to be received by any receiver on Earth. They contain mainly information like All OK, Track urgent, Red Alert etc.
    • +
    • Scientific data: The critical tests and measurements, images of various locations of interests, objects of scientific importance etc. come under this category. These messages are specially encrypted and can be received only by high gain DSN receivers.
    • +
    + +

    alt text

    + +

    Apart from the data, the characteristics of received waves also reveal a lot! The speed of the spacecraft, its distance from Earth and other useful parameters can be calculated by Doppler Effect using the frequency shifts in received waves. +The primary goal of DS1 in space is to test and execute new technologies in space. Some of which are:

    +
      +
    • Miniature Integrated Camera Spectrometer (MICAS)
    • +
    • Autonomous Navigation (AutoNav)
    • +
    + +

    MICAS

    +

    MICAS is one of the advanced technologies used in DS1 till date. It is basically an array of cameras placed on the surface of the craft used to take images in the presence of light in space. From its design, it can be clear that there are no moving parts in DS1 for orienting MICAS. So, for a change in angle, the entire spacecraft has to change its position and attitude (orientation), so as to perfectly capture the images.

    + +

    alt text

    + +

    One of the interesting features about MICAS is that it is not only capable of capturing light images but also heat waves, UV and IR radiations and form images out of those waves. These data prove to be quite useful to determine temperature distributions in various desired locations in space through simple images. +MICAS achieves this using an array of light sensitive charged cells inside a device called Charge Coupled Device (CCD). These cells absorb the light falling on them, and then releases a specific amount of charge proportional to the intensity of light falling. CCD stores this charge as the value of each pixel in the image. Then each value is binary coded to generate bits, which are transmitted as radio waves to Earth stations or used by DS1 itself. This technique of digital imaging has an advantage over film imaging as film images cannot be transmitted as radio waves. +alt texts +One of the drawbacks of MICAS is that exposure to sunlight can damage its working. The UV and high intensity Ultra UV radiations can change the crystal structure of CCD. So, it is generally oriented away from Sun. +One of the coolest application of MICAS is that DS1 uses MICAS to locate and orient itself. This is done using Autonomous Navigation or AutoNav.

    +

    Autonomous Navigation

    +

    Autonomous Navigation or AutoNav is an experimental system being tested on DS1. It is used by DS1 to navigate itself and intelligently decide whether it is deviating from its programmed path. +On its path MICAS takes a number of images and stores for reference. While on path AutoNav decides, from the stars, asteroid positions and the reference images, whether the path taken is the desired one. When not, it uses its thrusters and rockets to re-orient itself.

    + +

    alt text

    + +

    So thats it guys. This concludes my work on how is DS1 achieving its communication with Earth and Navigation. If you guys want some more insight into any of these

    +
      +
    • How basically an RF signal is transmitted over large distance here
    • +
    • Different kinds of antennas here
    • +
    • What could go wrong in communications here
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/e-Ink/index.html b/blog/e-Ink/index.html new file mode 100644 index 0000000..88bd0a6 --- /dev/null +++ b/blog/e-Ink/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Let’s start with talking about the screen you’re currently glaring at to read this article. If you don’t scroll down then the screen is pretty much static right? Not really. Behind the screen, all the pixels controlling what you see is getting multiplexed so fast that our eyes make it out as a constant one. Basically, a word is constantly consuming energy just to remain onscreen.

    + +

    If you write a word on paper, does it need any more energy to remain on the paper? No. It remains there forever. This is the basic idea behind E Ink. Energy should only be used to ‘write’ the word. After that, no more energy should be consumed.

    + +

    The notion of a low-power paper-like display had existed since the 1970’s, originally conceived by researchers at Xerox PARC, but had never been realized. MIT undergrads J.D. Albert and Barret Comiskey came up with the idea of microencapsulated electrophoretic display to solve this problem. The initial idea was to create small spheres of half black and half white particles and somehow manipulate them to create images. Comiskey while experimenting could create tiny all white particles. Comiskey experimented with charging and encapsulating those all-white in microcapsules mixed in with a dark dye. The result was a system of microcapsules which could be applied to a surface and then could be charged independently to create black and white images.Once the orientation is attained, no energy is required to keep them in that fashion. Thus the image remains in that state forever.

    + +

    E_Ink

    + +

    The above picture depicts how the pixels of E Ink display can be controlled using the potential difference. The MIT undergrads went on to create the E Ink Corporation in 1997 which created several new designs of the E Ink technology. Since then the technology has been improved tremendously. The first generation was called vizplex. Next came pearl and mobius. Pearl is used in almost all amazon kindle products except the paperwhite and oasis series. Pearl’s major disadvantage was it’s substrate made of thin glass which made it’s structure fragile. This disadvantage was overcame by mobius which has a substrate of flexible plastic. The third generation E Ink called triton features a colour display which is easy to read in high light. The next updates carta and carta HD improved the resolution of the screen.

    + +

    E_Ink

    + +

    Zoomed image of E Ink display. The black white sphere demarcation can be seen clearly.

    + +

    That was all about how the E Ink was made and how it developed. Where is “reads like paper” part? Well, this was achieved using the screen lighting properties. A general screen like the one you are using is backlit. Meaning it produces light of its own below the screen surface. ‘Electronic paper’ mimics the normal paper, it does not produce light, rather reflects it. This means that they are more comfortable to read and have wider viewing angles than most light-emitting displays. The contrast ratio in e-paper available as of 2008 approaches newspaper and newly developed displays are slightly better. An ideal e-paper display can be read in direct sunlight without image appearing to fade. Since it uses light reflected on it to display, thus you won’t be able to see anything in a dark room (just like paper!). But have you seen the new kindle paperwhite? It boasts of it’s readability even in dark with almost zero glare. Paperwhite uses an integrated lighting system. It’s not a backlight. Its a small light shown onto the front screen which hits the screen and bounces back to you.

    + +

    Nice right? Lots of innovations like these are happening in the world of E Ink. E Ink is slowly replacing LCD screens in lots of applications without us even noticing. The newly announced Advanced Colour E- Paper (ACeP) boasts of a display of 32000 colours. Currently they have a refresh rate of 2 seconds. Yes, the future is exciting. These durable easy to read screens are taking over the world from billboards to price tags to walls of your house. We have been imagining this future forever: the all screen worlds of total recall, minority report, blade runner, and other less dystopian movies.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/earthing-systems/index.html b/blog/earthing-systems/index.html new file mode 100644 index 0000000..cc71c7b --- /dev/null +++ b/blog/earthing-systems/index.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Many appliances such as an electric heater, a refrigerator, a CPU etc. have metallic body (casing).If with use the insulation of a wire breaks or melts , the live wire may touch the casing. If we happen to touch the casing carrying a current we may receive a severe shock.

    + +

    image001

    + +

    To avoid this, metal casing of all electrical appliances are earthed.

    + +

    image002

    + +

    What is an earthing system?

    + +

    The connection between electrical appliances and devices with the earth plate or electrode through a thick wire of low resistance to provide safety is known as ‘Earthing’ or Grounding.

    + +

    The main objective of the Earthing system is to provide an alternative path for dangerous currents to flow so that accidents due to electric shock and damage to the equipment can be avoided.

    + +

    Importance of earthing

    + +
      +
    • The earthing protects the personnel from the short circuit current.
    • +
    • The earthing provides the easiest path to the flow of short circuit current even after the failure of the insulation.
    • +
    • The earthing protects the apparatus and personnel from the high voltage surges and lightning discharge.
    • +
    + +

    Types of earthing

    + +

    Neutral Earthing

    + +

    In neutral earthing, the neutral of the system is directly connected to earth by the help of the GI wire. The neutral earthing is provided in the generator, transformer, motor etc.

    + +

    Equipment Earthing

    + +

    Such type of earthing is provided to the electrical equipment. The non-current carrying part of the equipment like their metallic frame is connected to the earth by the help of the conducting wire.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/electric-cars/index.html b/blog/electric-cars/index.html new file mode 100644 index 0000000..fe41169 --- /dev/null +++ b/blog/electric-cars/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Should you really buy an electric car?

    + +

    Electric vehicles are hitting the world’s roads and with government support behind them these are hyped up to be the next big thing in the automobile industry . Combustion engine vehicles generate huge quantities of pollution, and developed economies create more than their fair share of this. The US transportation sector accounts for around 30 percent of US global warming emissions which is an order of magnitude more than most countries. In this blog I will tell you what I think on buying an electric car.

    + +

    Pros

    + +
      +
    1. +

      Quick and Quiet : It takes just one ride in a battery – powered card to understand the improved ride quality of an EV(Electric Vehicle) compared to a conventional fuel car . The drive is much smoother and you won’t even realize at what speed you are moving at until you look at your speedometer . It makes most regular cars seem clunky and outdated. Acceleration is also smooth and very quick.

      +
    2. +
    3. +

      Cheaper to operate : Though the initial investment on electric cars may be higher , the cost to operate them is lower what with the higher efficiency of electric engines and the lower cost of electricity compared to conventional fuels such as petrol or diesel .

      +
    4. +
    5. +

      Emissions : If you are an Indian you would definitely have experienced the nauseating puff of smoke being thrown out by the vehicles in front you on the street .With EVs we can finally say goodbye to that and breathe in much fresher air on the streets .

      +
    6. +
    + +

    Cons

    + +
      +
    1. Limited range : Electric engines are the kings of limited mileage range .The Nissan Leaf has been claimed to go up to a 100 miles and the Chevorlet Volt 40 miles on all completely electric power .Although this may seem sufficient for daily commute you will have to part with your occasional road trips .
    2. +
    + +

    Variables

    + +
      +
    1. +

      Cost : The initial investment for an electric car is definitely going to sting you more than a regular car because the technology involved in its manufacture is much higher than a regular car . But on the long run since electricity is usually cheaper than petrol/diesel the cost per mile for an electric car is lesser and the more you drive the more you save . This of course, depends on the fact that you are actually going to keep the same car for a long time which would leave you without the choice of buying a newer car after a few years . Once you buy it , you’ll be stuck with it for years to come .

      +
    2. +
    3. +

      Refuelling time ; If you have an electric car you can refuel at home at night like you charge you cellphone and use it all day . But what if you have to travel a long distance or between two cities ? Currently we don’t have enough charging stations available and even at those stations if these cars become popular you will have to wait in line for hours if you want to recharge . An even bigger nightmare is if your battery runs out halfway . If it were a petrol/diesel vehicle you could fill in a bottle at the nearest station and use it drove upto that station but what will you do with an electric car ? you will have to tow it all the way to a charging station which I would rather never do .

      +
    4. +
    5. +

      Pollution : I find it hard to believe that electric cars are very green and eco-friendly . Sure they don’t emit smoke which you can see but where do we get the electricity to run them ? Fossil fuels . And how exactly are we going to get the batteries for the car? lithium mining and extraction . And what exactly are you going to do with dead batteries ? Shoot them into outer space ? Unless battery technology, renewable energy and recycling methods advance hugely we are not helping nature as much as we would like to believe . Good luck to you if you think you are going to save the Earth by buying an electric car .

      +
    6. +
    + +

    Well these are the most important things that you need to know if you are planning on buying an electric car .Though It’s pretty clear what I think about that idea :P

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/electronic-aspirin/index.html b/blog/electronic-aspirin/index.html new file mode 100644 index 0000000..39bade4 --- /dev/null +++ b/blog/electronic-aspirin/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    ELECTRONIC ASPIRIN

    + +

    For people who suffer from migraines, cluster headaches and other causes of chronic, excruciating head or facial pain, the "take two aspirins and call me in the morning" method is useless. Doctors have long associated the most severe, chronic forms of headache with the sphenopalatine ganglion (SPG), a facial nerve bundle, but haven't yet found a treatment that works on the SPG long-term.

    + +

    Well, there is technology for the rescue: The Electronic Aspirin.

    + +

    It is a patient-powered tool for blocking SPG signals at the first sign of a headache.

    + +

    Working :

    + +

    It consists of two components. A nerve-stimulated implant is placed in the patient’s upper gum near the area where the patient experiences the most pain. The procedure to input the neuro-stimulator device is fairly simple and is conducted with minimal invasiveness and has minimal side effects.

    + +

    The implant is attached to the Sphenopalantine Ganglion (SPG), a collection of nerves deep in the bone cavity of the mid-face area. The permanently embedded implant has a pointed tip which connects with the SPG bundle of nerves. When a patient senses the first sign of a headache, he/she the places a hand held remote device on the cheek area nearest the implant device. When the remote is pressed, a slight electrical charge stimulates nerve cells, which works to block the neurotransmitter signals causing pain.

    + +

    image

    + +

    The Central Nervous System (CNS) is composed of the brain, brain stem, and spinal cord. The transmission mechanism that drives these communication pathways is separated into two types of signals, namely electrical signals for long pathways through neurons and chemical signals through short pathways between neurons. The shape and biology of neurons are well-adapted to generating, processing, and propagating these signals.

    + +

    Neuro-stimulators are devices dedicated to eliciting action potentials in targeted neurons.

    + +

    Different types of neuro-stimulators:

    + +
      +
    1. The BION microstimulator
    2. +
    3. An Ultrasound-Powered Neurostimulator
    4. +
    5. CMOS-Circuit Neurostimulator
    6. +
    7. Capacitor-Based Neurostimulators
    8. +
    9. 16-Channel Neural Stimulator IC
    10. +
    + +

    When the remote is pressed the electrical signals from the neuro-stimulator effects the neuron of SPG, causing certain blocks in the nervous network. This stops the release of pain causing neuro-transmitters.

    + +

    This process does not effect the other functions.The patient has complete control over the remote. Also, the implanted neuro-stimulator can be removed once the frequency and magnitude of migraine attack reduces.

    + +

    Possible Side effects:

    + +

    While there is no threatening risk attached to the use of electronic aspirin, some of the reported symptoms include lower blood pressure, throat numbness, or nausea. However, in rare cases, the symptoms can be a nasal infection, nasal bleeding and a slight increase in headache.

    + +

    Nonetheless, electronic aspirin is an effective solution to facial and head pains. It helps the sufferers to improve their lifestyle and this small invention can help millions in the incorporation of medicine into innovative technology.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/electronic-skin/index.html b/blog/electronic-skin/index.html new file mode 100644 index 0000000..bfe2809 --- /dev/null +++ b/blog/electronic-skin/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    ELECTRONIC SKIN

    + +

    Hand with electronic skin

    + +

    Touch is the first sense we acquire and has been shown to play a crucial role in physical and mental health. The nerve cells in our skin allow us to experience the several experiences of touch such as a cold splash of water, the tug of a strong breeze or the heat from your coffee mug. Scientists are trying to develop electronic skin to help robots and prosthetic devices to attain these abilities.

    + +

    Researchers report a new method in ACS Applied Materials & Interfaces that creates an ultrathin, stretchable electronic skin, which could be used for prosthetics, robotics, virtual reality and even wearable health monitors. The main challenge is to transfer ultrathin electrical circuits onto complex 3D surfaces. Moreover, the electronics have to be bendable and stretchable enough to allow movement. Current methods for producing these electronics are slow, expensive and require sophisticated equipment and techniques.

    + +

    In the new approach the researchers patterned a circuit template on to a sheet of transfer tattoo paper with an ordinary desktop laser printer.

    + +

    Printing circuit with laser printer

    + +

    Then, they coated the template with silver paste which stuck only to the printed toner ink and wiped away the excess silver.

    + +

    Ag epoxy deposition

    + +

    Driving silver epoxy

    + +

    On top of the silver paste the team deposited a gallium indium liquid metal alloy that increased the flexibility and electrical conductivity of the circuit.

    + +

    E-GaIn deposition

    + +

    Subsequently, they added external electronics such as microchips with silver epoxy or conductive glue made of vertically aligned magnetic particles embedded in a polyvinyl alcohol gel.

    + +

    Placing components with silver epoxy

    + +

    The researchers used water to help transfer the electronic tattoo to 3-D objects. This was done by immersing the object in a tub of water and then placing the circuit on the surface of the water.

    + +

    Immersing object in tub of water

    + +

    The paper backing of the tattoo is separated from the carrier film which floated on the surface of the water.

    + +

    Finally, when the researchers lifted the object out of the water, the circuit adhered to the contours of the object.

    + +

    Circuit adhered to the contours of the object

    + +

    This electronic skin remains functional under bending, folding, twisting, and strains up to about 30% (similar to human skin). They can adapt and adhere to highly curved 3-D surfaces, like a model of a human brain or an apple.

    + +

    Various applications of the new method include controlling a robot prosthetic arm, incorporating proximity sensors into a 3D model of a hand and epidermal bio monitoring.

    + +

    The research was performed in collaboration between Carnegie Mellon's Soft Machines Lab and the Institute of Systems and Robotics at the University of Coimbra in Portugal.

    + +

    The findings were published in the paper, "EGaIn-Assisted Room-Temperature Sintering of Silver Nanoparticles for Stretchable, Inkjet-Printed, Thin-Film Electronics," in Advanced Materials.

    + +

    To know more about electronic tattoos and their applications check out this video

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/evacuated-tube-collector/index.html b/blog/evacuated-tube-collector/index.html new file mode 100644 index 0000000..55a7d4b --- /dev/null +++ b/blog/evacuated-tube-collector/index.html @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Renewable energy is the key for the planet’s existence in the future. The fossil fuels are non-renewable and require finite resources, which are dwindling because of high cost and environmentally damaging retrieval techniques. Climate change is real. Global warming is real. It took some time to accept this hard fact, but now with the realization, production of clean energy has become the primary goal of countries across all continents.

    + +

    Great amount of research is carried in improving the efficiency of renewable energy and making it inexpensive. The main objective is to minimize or eliminate the usage of electricity produced by burning of coal which leaves behind large amounts of CO2. Solar Powered houses is the solution to this problem. One of the key components of this being the solar water heater.

    + +

    Need

    + +

    The conventional solar water heaters used flat-plate collectors with water as the heat-transfer fluid. These type of collectors are less efficient. This is owing to the heat losses in the form of convection and radiation. The simple fundamental to increase the efficiency is to decrease the heat losses. We know that convection requires material medium. So,if there is no material medium, there won’t be convection and thus, heat losses would be only due to radiation. This is the basic idea behind evacuated tube collectors. Solar water heating systems using vacuum tubes made of borosilicate glass with special coating to absorb the solar energy are called as Evacuated Tube Collector system (ETC Systems).

    + +

    Working

    + +

    Air between the two glass tubes is evacuated. It results in high level vacuum which acts as insulation and minimizes heat loss from the inner tube. The black coating in the inner tube absorbs the solar energy and transfers it to the heat transfer fluid.

    + +

    Evac details

    + +

    An evacuated tube collector can achieve high temperatures in the range of 350K-450K, and work very efficiently. Although, they are more expensive than the flat plate collectors, the return would be greater for ETCs. +There are a few different vacuum tube configurations, single wall tube, double wall tube, direct flow, heat pipe, and these differences can determine how the fluid is circulated around the solar hot water panel.

    + +

    In heat pipe ETC, a heat pipe is connected to an absorber plate inside a vacuum sealed tube.

    + +

    Heating

    + +

    The heat pipe is hollow and is evacuated. Inside the heat pipe is small quantity of heat transfer fluid like alcohol with some additives. The heat pipe is connected to a manifold. Vacuum enables the liquid to boil at lower temperatures. The hot vapour rises and heats the heat pipe which heats the manifold. The fluid flowing through manifold picks up the heat. The connection between absorber and manifold is dry and thus can be easily setup and replaced.

    + +

    In direct flow ETC, two pipes run through the vacuum sealed tube.

    + +

    evactube

    + +

    The fluid to be heated directly flows through these pipes and heats up. The arrangement is similar to flat-plate collectors, with the addition of evacuated tubes. Since the fluid flows into and out of each tube, it cannot be easily replaced.

    + +

    The need was to minimize heat losses through convection and what better way can be, than to stop it completely from happening. The application of the simplest of concepts of eliminating convection by getting rid of the material medium itself has led to major improvements in this field as the efficiency has risen manifold.The understanding of fundamental sciences has provided one of the biggest leaps in the effort of making renewable energy efficient and inexpensive.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/evolution-of-bicycle/index.html b/blog/evolution-of-bicycle/index.html new file mode 100644 index 0000000..ffdd6a9 --- /dev/null +++ b/blog/evolution-of-bicycle/index.html @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Ever since a person began thinking of sources of transportation, maximum development until date has been in the field of bicycle.

    + +

    Here are a few of the designs discussed briefly, innovation in them and the reasons for their failure or upgradation.

    + +

    The first known bicycle was the velocipede, a human powered vehicle which required the person riding it to actually push himself against the ground in order to move. No pedals, chain whatsoever, just 2 wheels, a frame and a seat.

    + +

    Archetype of a Bicycle

    + +

    Slowly, came an era of multi-wheeled bicycles. Improved stability, increased load carrying capacity and improvement in design. But still the human power dependence was similar to that of a velocipede.

    + +

    The first known mechanical bicycle which looks similar to a modern bicycle was invented by a Scottish blacksmith named, Kirkpatrick MacMillan. The cycle was still man powered but the power transmission was through crank and rods, similar to that in a steam engine.

    + +

    Image result for kirk patrick first bicycle

    + +

    Turning while driving and cycling downhill were the main problems caused which are eliminated by the usage of free wheels in modern bicycles.

    + +

    About 50 years later came the first pedal driven bicycle. It was called the boneshaker, as it had wheels made of iron and practically, make the ride pretty uncomfortable.

    + +

    The drawback of this? It had a fixed pedal to the front wheel, and the input given to it was directly used to propel the cycle. Absence of freewheel makes pedaling necessary and for smaller wheels, one had to pedal more rotations for moving the same distance. Thus the bicycles with huge driving wheel came into picture.

    + +

    Related image

    + +

    This was a great innovative idea, but this too had its own limitations…

    + +

    What happened next?

    + +

    What was the reason for the change?

    + +

    Stay tuned to know more!

    + +

    To be continued…

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/favicon.ico b/blog/favicon.ico new file mode 100644 index 0000000..c3941e4 Binary files /dev/null and b/blog/favicon.ico differ diff --git a/blog/feed.xml b/blog/feed.xml new file mode 100644 index 0000000..13960f6 --- /dev/null +++ b/blog/feed.xml @@ -0,0 +1,185 @@ + + + + A blog about our findings and musings + A blog documenting random findings and musings of our members + https://ieee.nitk.ac.in/blog/ + + Tue, 12 Apr 2022 19:04:13 +0530 + Tue, 12 Apr 2022 19:04:13 +0530 + Jekyll v4.2.2 + + + Consensus Mechanism in Blockchain + <h1 id="consensus-mechanism">CONSENSUS MECHANISM</h1> <p>The Blockchain is an undeniably ingenious invention, By definition,<strong>_ Blockchain_</strong> is a continuously growing list of records, called blocks, which are linked and secured using cryptography. Each block typically contains a cryptographic hash of the previous block, a timestamp, and transaction data. By design, a blockchain is inherently resistant to modification of the data. It is “an open, distributed ledger that can record transactions between two parties efficiently and in a verifiable and permanent way”. This technology has led to various new inventions in the cryptocurrency marketplace such as Bitcoin, Ethereum, Ripple, and many others, all of... + Mon, 11 Apr 2022 05:30:00 +0530 + https://ieee.nitk.ac.in/blog/consensus-mechanism-in-blockchain/ + https://ieee.nitk.ac.in/blog/consensus-mechanism-in-blockchain/ + + IEEE NITK + + CompSoc + + Blockchain + + + compsoc + + + + + I2C + <h2 id="introduction"><strong>Introduction</strong></h2> <p>The I<sup>2</sup>C bus was developed in the early 1980’s by Philips Semiconductors. Its original purpose was to provide an easy way to connect a CPU to peripheral chips in a TV-set. Its name, Inter-Integrated Circuit, literally explains its purpose: to provide a communication link between Integrated Circuits.</p> <p><img src="/blog/assets/img/i2c/I2C1.jpg" alt="alt_text" /></p> <h2 id="how-does-it-work"><strong>How does it work</strong></h2> <p>I<sup>2</sup>C requires two digital lines: Serial Data line (SDA) to transfer data and Serial Clock Line (SCL) to keep the clock. Each slave has a unique 7bit (generally) address in a system so that up to 128 devices can communicate using only... + Mon, 23 Aug 2021 05:35:00 +0530 + https://ieee.nitk.ac.in/blog/i2c/ + https://ieee.nitk.ac.in/blog/i2c/ + + IEEE NITK + + Diode + + + Diode + + + + + Cloud Computing in Detail + <p>Cloud computing is a computing paradigm, where a large pool of systems is connected in private or public networks, to provide dynamically scalable infrastructure for application, data, and file storage. In the simplest terms, cloud computing is storing data and programs over the Internet instead of storing them in a computer’s hard drive. “The cloud” refers to servers that are accessed over the Internet, and the software and databases that run on those servers. Cloud servers are located in data centers all over the world. By using cloud computing, users and companies don’t have to manage physical servers themselves or... + Mon, 23 Aug 2021 05:35:00 +0530 + https://ieee.nitk.ac.in/blog/cloud-computing-in-detail/ + https://ieee.nitk.ac.in/blog/cloud-computing-in-detail/ + + IEEE NITK + + Diode + + + Diode + + + + + A future called Quantum + <h2 id="introduction">Introduction</h2> <blockquote> <p><em>Life is not just made of a good(1) or a bad(0) experience it is a superposition of such experiences.</em> $\qquad \qquad \qquad \quad \quad$ –<strong>Manav</strong></p> </blockquote> <p>Then why do we only think and hear of binary when it comes to information transfer in computers? Presenting to you a new field, called Quantum Computing which works on the superposition of two bits you constantly hear about the 0 and the 1 to give a qubit.</p> <p>In this realm we believe that the information is stored in |$\varphi$&gt; a ($\alpha$|0&gt;+$\beta$|1&gt;) state wherein $\alpha ,\beta$ are the respective coefficients of... + Mon, 23 Aug 2021 05:30:44 +0530 + https://ieee.nitk.ac.in/blog/a-future-called-quantum/ + https://ieee.nitk.ac.in/blog/a-future-called-quantum/ + + IEEE NITK + + CompSoc + + Quantum Computing + + + CompSoc + + + + + DP on Trees + <h2 id="introduction"><strong>Introduction</strong></h2> <p>DP on Trees is a very useful Technique in problem-solving, The prerequisite for learning this is a very basic understanding of Trees, vectors, and DP. Before directly diving into the topic, We will discuss some topics in brief, they are:</p> <ul> <li>Difference between graphs and Trees.</li> <li>Adjacency List</li> <li>DFS.</li> <li>Dynamic Programming.</li> </ul> <h2 id="difference-between-graphs-and-trees"><strong>Difference between Graphs and Trees</strong></h2> <p>Trees are a Subset of Graphs, like graphs they are represented by nodes and edges, a popular shout is “ any graphs with n nodes and n-1 edges is a tree “ , it’s not completely correct, here is an... + Mon, 16 Aug 2021 05:35:00 +0530 + https://ieee.nitk.ac.in/blog/dp-on-trees/ + https://ieee.nitk.ac.in/blog/dp-on-trees/ + + IEEE NITK + + CompSoc + + + Compsoc/Diode/Piston + + + + + From 1G to 5G + <p>First mobile phones had to be packed in a <em>briefcase!</em> Mobile technology has come a long way. It will play a crucial role in technologies of the future like <em>IoT</em> and <em>autonomous vehicles!</em> Let us look at the evolution from 1G to 5G</p> <h2 id="what-are-cellular-networks-and-why-are-they-important">WHAT ARE CELLULAR NETWORKS AND WHY ARE THEY IMPORTANT?</h2> <p><img src="/blog/assets/img/from-1g-to-5g/Cells.png" alt="Cells" /></p> <p>Networks are a group of connected devices. A common network architecture has all devices connected by ‘links’. When the devices can move from one place to another these ‘links’ are <em>wireless</em>. The networks where the end devices are connected to the network wirelessly... + Mon, 16 Aug 2021 05:30:44 +0530 + https://ieee.nitk.ac.in/blog/from-1g-to-5g/ + https://ieee.nitk.ac.in/blog/from-1g-to-5g/ + + IEEE NITK + + Diode + + + Diode + + + + + Different Ways to console.log for Better Clarity + <h2 id="here-are-5-ways-you-can-ninjafy-your-console-logging-skills">Here are 5 ways you can ninjafy your console logging skills</h2> <h3 id="1-consolelog-colored_text-"><strong>1. console.log( ‘COLORED_TEXT’ )</strong></h3> <p>You will have to use <code class="language-plaintext highlighter-rouge">%c</code> with each occurrence accompanied by an argument that expresses the styling that you desire</p> <div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="dl">'</span><span class="s1">%c Object A instantiated %c before B !! </span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">background: white; color: red</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">background: red; color:white</span><span class="dl">'</span> <span class="p">);</span> </code></pre></div></div> <p>Note that you could use any CSS property under the sun into as an argument. In case of the above string this... + Mon, 16 Aug 2021 05:30:00 +0530 + https://ieee.nitk.ac.in/blog/javascript-console-better-debugging/ + https://ieee.nitk.ac.in/blog/javascript-console-better-debugging/ + + IEEE NITK + + CompSoc + + Javascript + + Debugging + + + Compsoc + + + + + Amateur Radio + <p><img src="/blog/assets/img/amateur-radio/image1.jpg" alt="image-1" /></p> <p>We are all fascinated by how our voice travels through the atmosphere by electromagnetic waves and reaches its destination. We humans have built transmitters and receivers suitable to our needs.</p> <h2 id="what-is-amateur-radio-and-who-are-these-amateurs"><strong>What is Amateur Radio and who are these Amateurs?</strong></h2> <p>Amateur Radio operators are a group of people interested in wireless communication technology worldwide. According to the Indian Wireless Telegraphs (Amateur Service) Rules, 1978, Amateur Radio or HAM radio is ‘A service of self-training, inter-communication and technical investigations carried on by amateurs, that is, by persons duly authorized under these rules interacted in radio technique solely... + Mon, 16 Aug 2021 05:30:00 +0530 + https://ieee.nitk.ac.in/blog/amateur-radio/ + https://ieee.nitk.ac.in/blog/amateur-radio/ + + IEEE NITK + + Diode + + + Diode + + + + + Playing Blackjack Optimally with Reinforcement Learning + <h2 id="introduction-to-reinforcement-learning">Introduction to Reinforcement Learning</h2> <p>Reinforcement learning(RL) is a branch of machine learning which draws from <strong>the way humans learn to do tasks</strong>. For anyone unfamiliar with Pavlov, he is a physicist popularly known for his work in conditioned response. He trained a dog such that every time he rang a bell, he would immediately give the dog food. The dog soon learned to salivate at the sound of the bell. The same foundation to Jim’s mint prank in The Office for those who get the reference xD.</p> <p><img src="/blog/assets/img/blackjack/pavlov.jpg" alt="Pavlov's Experiment" /></p> <p>Reinforcement learning (or RL) takes Pavlov’s experiment... + Mon, 09 Aug 2021 05:30:00 +0530 + https://ieee.nitk.ac.in/blog/playing-blackjack-optimally-with-reinforcement-learning/ + https://ieee.nitk.ac.in/blog/playing-blackjack-optimally-with-reinforcement-learning/ + + IEEE NITK + + CompSoc + + Reinforcement Learning + + + compsoc + + + + + Where's the Bot Now? + <p>Have you ever wondered how life was way before GPS was introduced.I remember taking an OLA ride to a place back in 2013s when google map was not incorporated into the OLA app, and both the driver and I were new to the location and although we were right in front of the location , we didn’t know where exactly we were!!!.</p> <p>We kept driving around the same location for over 30 min only to find that we were at the right location way before. The bill amounted to 1000 and I was devastated. <strong>So answering the question of what... + Mon, 09 Aug 2021 05:30:00 +0530 + https://ieee.nitk.ac.in/blog/localization-robotics/ + https://ieee.nitk.ac.in/blog/localization-robotics/ + + IEEE NITK + + Diode + + Robotics + + + diode + + + + + diff --git a/blog/finfets/index.html b/blog/finfets/index.html new file mode 100644 index 0000000..44b6dc9 --- /dev/null +++ b/blog/finfets/index.html @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Hello folks, today I’m going to discuss in detail about FinFET technology. The demand for smartphones and tablets with better performance and longer battery life has been driving the industry to come up with chips that are faster, smaller and use less power. To remain on this treadmill known as Moore’s Law, chipmakers have in recent years relied on a series of technological breakthroughs, most recently 3-D transistors known as FinFETs.

    + +

    The FinFET technology promises to provide the deliver superior levels of scalability needed to ensure that the current progress with increased levels of integration within integrated circuits can be maintained.FinFET technology has recently seen a major increase in adoption for use within integrated circuits.This type of FET gained its name from Profs. Chenming Hu, Tsu-Jae King-Liu and Jeffrey Bokor at the University of California, Berkeley who were the first to coin the term as a result of the shape of the structure.

    + +

    Intel and Samsung are betting billions of dollars on FinFET technology because it is power efficient and delivers superior processing power. Intel has been using FinFET technology since 2011. It had produced 22nm Ivy Bridge processor for the first time based on this technology means FinFET isn’t the brand new technology for Chipset makers, but it did take lot of time to hit the mobile SoC industry. Mobile chipmakers are now trying to tape out the FinFET based SoCs for their high-end mobiles.

    + +

    What is FinFET technology?

    +

    The FinFET technology is a technological breakthrough in recent years. It redefined the entire chipset industry with newly implemented 3D transistors. What is 3D transistor? The traditional planar transistors contain Source and Drain parts, which separated by High K-Dielectric surface. The entire power flow goes through Dielectric surface gate only. The 3D transistor drain part raised like Fin structure in FinFET transistors, so these transistors are called FinFETs. Usually, this kind of protruding parts will allow power to pass through all three parts at the same time. Also, it will allow multiple transistors to share a common gate and common contacts so the ultimate power supply consumption will significantly be reduced. In simple words, FinFET technology will allow chipset makers to build ultra-powerful processors, which only take a little power when compared to traditional planar transistors. +alt text

    + +

    Why is it so revolutionary?

    +

    The traditional transistor takes significantly higher amount of power so the entire chipset will consume a greater amount of power because a chipset contains billions of transistors. Due to this high power consumption, the sustainability of the processor will decrease along with heat increase, which chipset makers don’t like. Talking about FinFET transistors, as we said, these will use standard drain and contacts so it takes less power and expose less heat so the processor performance won’t fall like the traditional chip. In the meantime, the processor can deliver superior returns. This is the main reason; all the chip makers are interested in FinFET technology. There is another important reason that is, FinFET transistors will take a lot less power at the stand-by time. For example, consider the Intel desktop processor, which fabricated at 22nm, assume it usually takes the 1.0V at X amount of clock speed. Compare the same configuration with FinFET technology-based processor, this new technology will only consume 0.7v means we see around 37% decrease in power at same speeds. These two key reasons are ultimately pushing all chipset makers toward this new technology.

    + +

    Conclusion

    + +

    To summarize, you may have got some knowledge about what is FinFET and how it works? And Why it is so important ?. These FinFET transistors are going to drive billions of devices in coming years. We will see more processor in future using this technology, and more chip makers are trying to deploy their chips with FinFETs including Samsung, Qualcomm, Intel.

    + +

    You can visit following pages for more information:

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/fingerprint-recognition/index.html b/blog/fingerprint-recognition/index.html new file mode 100644 index 0000000..7cfdf40 --- /dev/null +++ b/blog/fingerprint-recognition/index.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Fingerprint recognition systems are practically everywhere today, from your smartphone, laptops, and are an integral part of the Aadhar system enabling us to authenticate our identity easily. Here’s a look at how the whole system of fingerprint recognition works.

    + +

    Fingerprints are the tiny friction ridges on the ends of our fingers and thumbs make it easier to grip things. By making our fingers rougher, these ridges increase the force of friction between our hands and the objects we hold, making it harder to drop things. Unless you have accidents with your hands, your fingerprints remain the same throughout your life.

    + +

    Why Fingerprints?

    + +

    Fingerprints in are a brilliant way of telling people apart because fingerprints develop through an essentially random process according to information encoded in our DNA. Even the fingerprints of two identical twins are slightly different. Its is however possible that two people may have the same fingerprint, however the chances of this happening are 1 in 64 million. Such chances are really small to worry about, hence fingerprints are widely used to authenticate identity.

    + +

    Ok so now does does an electronic device recognize fingerprints? It involves two components, the physical sensing(hardware) part, and the analysis and verification(software part).

    + +

    The Sensor

    + +

    The first part of this system involves recognizing and creating a digital version of your fingers. Three types of such systems are used:

    + +
      +
    1. +

      Optical Scanners
      +They are the oldest method of capturing and comparing fingerprints. It relies on capturing an optimal image (basically a photograph), and uses algorithms to detect unique patterns on the surface, such as ridges or any unique marks, by analysing the lightest and darkest areas of image. These scanners are bulky(from the viewpoint of smartphones) as they pack a very high number of diodes per inch to capture details up close. However, the major disadvantage of such a scanner is that it be easily fooled with a 2D picture of good enough quality. So such systems are being slowly phased out, for better ones, like the capacitive scanners. +1

      +
    2. +
    3. Capacitive Scanners
      +The most commonly found type of fingerprint scanner used today is the capacitive scanner. Again the name gives away the core component, the capacitor. Instead of creating a traditional image of a fingerprint, capacitive fingerprint scanners use arrays tiny capacitor circuits to collect data about a fingerprint. As capacitors can store electrical charge, connecting them up to conductive plates on the surface of the scanner allows them to be used to track the details of a fingerprint. The charge stored in the capacitor will be changed slightly when a finger’s ridge is placed over the conductive plates, while an air gap will leave the charge at the capacitor relatively unchanged. An op-amp integrator circuit is used to track these changes, which can then be recorded by an analogue-to-digital converter. Once captured, this digital data can be analysed to look for distinctive and unique fingerprint attributes, which can be saved for a comparison at a later date. What is particularly smart about this design is that it is much tougher to fool than an optical scanner. The results can’t be replicated with an image and is incredibly tough to fool with some sort of prosthetic, as different materials will record slightly different changes in charge at the capacitor. The only real security risks come from either hardware or software hacking.
      +2
    4. +
    5. Ultrasonic Scanners
      +This is one of the latest fingerprint scanning technology, being actively developed by Qualcomm, and they are calling it Sense ID technology. The idea here is to capture the details of a fingerprint using a ultrasonic transmitter and a receiver. An ultrasonic pulse is transmitted against the finger that is placed over the scanner. Some of this pulse is absorbed and some of it is bounced back to the sensor, depending upon the ridges, pores and other details that are unique to each fingerprint. A sensor that can detect mechanical stress is used to calculate the intensity of returning ultrasonic pulse at different points on the scanner. Additional depth data can be captured if scanned for longer time duration. The 3D nature of this capture technique makes it an even more secure alternative to capacitive scanners.
    6. +
    + +

    Embed video

    + +

    Fingerprint matching

    + +

    Okay, so now we have the fingerprint with us. We now need to extract unique information out of it.

    + +

    Accompanying the physical scanner is a dedicated IC that deals with interpreting the scanned data and transmitting this in a useful form to your smartphone’s main processor. Different manufacturers use slightly different algorithms to identify key fingerprint characteristics, which can vary in speed and accuracy.

    + +

    Typically these algorithms look for where ridges and lines end, or where a ridge splits in two. Collectively, these and other distinctive features are called minutiae. If a scanned fingerprint matches several of these minutiae then it will be considered a match. Rather than comparing the whole fingerprint each time, comparing minutiae reduces the amount of processing power required to identify each fingerprint, helps avoid errors if the scanned fingerprint is smudged, and also allows the finger to placed off-centre or be identified with only a partial print.

    + +

    On smartphones, the above information is kept safe on the device, away from the code that could compromise it. Most manufacturers allocate a secure area for keeping this secure data on a separate part of the processor that cannot be accessed by apps operating in the regular operating system environment. Any authentication request is handled by strong cryptographic protocols, such as FIDO(Fast IDentity Online) Alliance. They enable the requesting service to verify the identity, without the requesting service being able to actually read/process our fingerprint scan.

    + +

    Fingerprint scanners have become quite a secure alternative to remembering countless passwords, and with the rollout of services like Samsung Pay, Apple Pay, these scanners are likely to become a more common and crucial security tool in the future.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/first-20-hours/index.html b/blog/first-20-hours/index.html new file mode 100644 index 0000000..e9004cc --- /dev/null +++ b/blog/first-20-hours/index.html @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    image-1
    + +

    The amount of time to acquire and master a skill is approximated to be 10,000 hours. But these approximations were taken by studying top athletes, artists, musicians, etc. at the top of the game. They were one of the best in the world.

    + +

    So it is a misconception that you need that amount of time to get good at something. Good is a relative word. It is idiosyncratic, it simply means that it depends on the individual. So good for a professional whose life revolves around a skill (you get what I mean) and for a person for whom it is just another tool in the shed or a hobby is completely different. Many of us don’t need to have mastery over a skill as a professional does. Hence the term good enough!

    + +

    Having said that, the main reason that it takes so much time for a professional to get the mastery is because as you get better, even smaller improvements need a lot of time to be attained. This is explained visually in the infamous learning curve graph. So it takes a lot less time than the 10,000 hours to get good. According to the speaker its only 20 hours.

    + +

    So the first 20 hours if managed effectively will make you get good at that skill. There are 4 simple steps to manage these hours properly.

    + +

    1. Deconstruct the skill

    + +

    Figure out what you want to be able to do once you get good. Then break the skill down into manageable chunks. Classify parts which are important to get the skill and practice them first. When you practice the important ones first and spend more time on them you improve faster.

    + +

    2. Learn enough to self correct

    + +

    Practice and to know are two different things. There may be things you need to know before you start to practice a skill. You need to have some knowledge to self correct when you go wrong. Here what goes wrong is that people focus on the wrong thing. For example, when you want to learn programming, reading a whole book on programming and then starting to practice programming is not the right way. It leads to procrastination and may even get you overwhelmed. So read just enough that you know what you’re doing and practice then repeat the process.

    + +

    3. Remove practice barriers

    + +

    This is obvious. Remove distractions while you practice. Focus on what is in front of you. It just takes a little bit of willpower to get rid of them. Short periods of focused practice or learning, even 15-20 min will improve you much faster than an hour of distracted mess.

    + +

    4. Practice for at least 20 hours

    + +

    When learning something new there is always the feeling of frustration. We feel stupid not being able to do what we intend to. So commit yourself to practice for at least 20 hours so you overcome that period of frustration, stick to the practice and reap the rewards eventually.

    + +

    These are the four simple ways to guide your first 20 hours into learning a new skill.

    +
    +

    The major barrier to learning something new is not an intellectual problem but an emotional one.

    +
    + +

    We are scared to feel stupid, we do not like to feel that. So we unconsciously decide its better off not learning it at all. So put 20 hours into learning anything. That feeling of stupidity will eventually go off. And after those 20 hours when you feel something different, some sense of achievement of drastic improvement, it surprisingly motivates you to get even better than good.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/fluid-mechanics-from-living-to-machines/index.html b/blog/fluid-mechanics-from-living-to-machines/index.html new file mode 100644 index 0000000..48e4d45 --- /dev/null +++ b/blog/fluid-mechanics-from-living-to-machines/index.html @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Birds, bats, insects, fish, whales, and other aquatic and aerial life-forms perform remarkable feats of fluid manipulation, optimizing and controlling their shape and motion to harness unsteady fluid forces for agile propulsion, efficient migration, and other exquisite maneuvers. The range of fluid flow optimization and control observed in biology is breathtaking and has inspired humans for millennia. How do these organisms learn to manipulate the flow environment?

    + +

    To date, we know of only one species that manipulates fluids through knowledge of the Navier–Stokes equations. Humans have been innovating and engineering devices to harness fluids since before the dawn of recorded history, from dams and irrigation to mills and sailing. Early efforts were achieved through intuitive design, although recent quantitative analysis and physics-based design have enabled a revolution in performance over the past hundred years. Indeed, physics-based engineering of fluid systems is a high-water mark of human achievement. However, there are serious challenges associated with equation-based analysis of fluids, including high dimensionality and nonlinearity, which defy closed-form solutions and limit real-time optimization and control efforts. At the beginning of a new millennium, with increasingly powerful tools in machine learning and data-driven optimization, we are again learning how to learn from experience.

    + +

    image-1

    +
    Figure: First example of learning and automation in experimental fluid mechanics: Rechenberg’s (1964) experiments for optimally corrugated plates for drag reduction using the Galtonbrett (Galton board) as an analog random number generato
    + +

    image-2

    + +

    Challenges and Opportunities for Machine Learning in Fluid Dynamics

    + +

    Fluid dynamics presents challenges that differ from those tackled in many applications of ML, such as image recognition and advertising. In fluid flows it is often important to precisely quantify the underlying physical mechanisms in order to analyze them. Furthermore, fluid flows exhibit complex, multiscale phenomena the understanding and control of which remain largely unresolved. Unsteady flow fields require algorithms capable of addressing nonlinearities and multiple spatiotemporal scales that may not be present in popular ML algorithms. In addition, many prominent applications of ML, such as playing the game Go, rely on inexpensive system evaluations and an exhaustive categorization of the process that must be learned. This is not the case in fluids, where experiments may be difficult to repeat or automate and where simulations may require large-scale supercomputers operating for extended periods of time.

    + +

    I believe that this nonexhaustive list of challenges need not be a barrier; to the contrary, it should provide a strong motivation for the development of more effective ML techniques. These techniques will likely impact several disciplines if they are able to solve fluid mechanics problems. The application of ML to systems with known physics, such as fluid mechanics, may provide deeper theoretical insights into algorithms. We also believe that hybrid methods that combine ML and first principles models will be a fertile ground for development.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/fluid-mechanics-in-everyday-life/index.html b/blog/fluid-mechanics-in-everyday-life/index.html new file mode 100644 index 0000000..2b40951 --- /dev/null +++ b/blog/fluid-mechanics-in-everyday-life/index.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Applying Makeup!

    +

    Image1

    + +

    When you put on eye shadow or powder, you are most definitely applying shear and pressure forces. When you put foundation on a sponge and smear it over your face you can feel the shear stress acting on your face. Furthermore, the shear stress increases as the foundation moves from the sponge to your face. This causes no slip at the boundary, which allows the foundation to stick to your face rather than slide off. This is a great example of Couette Flow!!! It is amazing to realize how much fluid mechanics applies to our lives. I’m excited about using all that I have learned to better understand the world.

    + +

    Using Lotion!!!

    +

    Image2

    + +

    Today I thought about the fluid mechanics used in applying lotion. When you squeeze the container to get lotion out, you are actually applying a pressure force to the container. In addition, once the container is set upright, the lotion slowly slips down the side of the container. Since the lotion is coming into contact with the sides of the container shear forces are present. This situation is representative of Couette flow.

    + +

    Washing Dishes!!!

    +

    Image3

    + +

    As I was washing dishes today, the extra soap on the dishes became slippery. I realized that this was because the soap was acting as a lubricant for the dish. The viscosity of the soap lessened the effect of the shear forces on the plate. This is what causes the plate to slip out of your hand!!!

    + +

    Flags!

    +

    Image4

    + +

    Today I thought about how beautiful a flag looks when it waves. I realized that the the wind blowing on the flag actually produces a drag force on the flag. This force acts on both sides of the flag. This drag is due to the wind blowing over the side of the flag. Thus the force itself is actually the shear force acting on the flag. So the next time you see a flag waving, think about the fluid mechanics involved!!!!

    + +

    Making Coffee!

    +

    Image5

    + +

    As I was pouring creamer into my coffee today, I thought about the design of the container. I noticed the flow of my creamer into the cup was laminar rather than turbulent and wondered why. I noticed the container had a curved point from which the fluid flowed. I decided that this design inhibited the flow of the creamer particles close to this point. As a result, this allows the remaining creamer to flow slower, which leads to a less turbulent flow.

    + +

    Blood Pressure!!!!!

    +

    Image6

    + +

    When I went for a general health check up I was talking to some nurses about how the blood pressure meter works. I was thrilled by all the fluid mechanics involved! To begin with, the cuff is pumped with air by use of a hand pump. Clearly there are frictional losses in this method. Once the cuff is full of air, it cuts off the blood circulation in the artery, which causes the pressure to build up. The top number in your blood pressure measurement tells you the pressure of your blood when the artery is not pumping blood, and the bottom number tells you the pressure of your blood when blood flow continues. The flow of blood through your veins is much like that of a fluid flowing through a pipe. The flow of blood is steady and laminar, so the velocity profile would be parabolic due to friction occurring at the walls of the arteries. This velocity profile would be altered if there is plaque build up in the artery.

    + +

    Forces on a Soap Dispenser!

    +

    Image7

    + +

    As I was washing my hands today, I got soap from a soap dispenser that was attached to the wall. I remembered that by using the momentum equation, you can calculate the force the screws need to hold the soap dispenser up. This is the same approach you would take to find the forces needed to hold a pipe in place. You would need to sum the forces in the y-direction and use a variable for the force holding the soap dispenser in place. You would then need to consider whether you are analyzing the dispenser when soap is coming out or when the dispenser isn’t being used. If you choose the later, the problem would become very simple because you would not have any momentum coming out. It was rewarding to recognize a fluid mechanics problem in disguise!

    + +

    Showering!

    +

    Image8

    + +

    Today as I was taking a shower, I was mindful of the momentum of the water coming out of the faucet. I realized that the momentum of the water is what washes off the soap. In addition as you increase the velocity of the water, you also increase the momentum.

    + +

    Toothpaste!

    +

    Image9

    + +

    Today as I brushed my teeth, I was reminded of the extreme difference between the viscosity of water and the viscosity of the toothpaste. Water is a Newtonian fluid that has a very low viscosity and flows freely at room temperature. My toothpaste, on the other hand, has a very high viscosity. It is actually considered a Non-Newtonian plastic fluid because a shear force must be applied to it before it will move! This works to my advantage when I brush my teeth! Think how hard it would be to put toothpaste on your toothbrush if it just poured out of the container when you opened the cap!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/fluids-and-satellites/index.html b/blog/fluids-and-satellites/index.html new file mode 100644 index 0000000..cd9b1ac --- /dev/null +++ b/blog/fluids-and-satellites/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The increasingly large volumes of fluid that have to be carried aboard satellites designed for long operating lifetimes, but which often must also deliver high-accuracy pointing, mean that special attention has to be paid to the behavior of fluids in low gravity.

    + +

    Low gravity and fluid dynamics

    + +

    There are several methods for analyzing the dynamic behavior of fluids under normal gravity conditions on Earth. A common assumption in such methods is that the free surface of the fluid is flat and at right angles to the direction in which gravity is acting, i.e. normal to the gravity vector. In this case, surface tension does not contribute to the fluid’s dynamic behavior. However, this assumption is no longer valid if gravity is significantly reduced, as is the case for a satellite in orbit.

    + +

    An indicator of the importance of the surface tension is the so-called ‘Bond number’, which is a measure of the relative magnitudes of the gravitational and capillary forces. It is proportional to the gravity level, the fluid density and the square of the characteristic length of the fluid’s free surface, and is inversely proportional to the surface tension of the fluid. If the Bond number is much greater than 1, the surface- tension effects can be neglected and if it is much less than 1, the gravity forces can be neglected.

    + +

    For example, the Bond number for water in a 2.7 mm- diameter tube subject to Earth’s gravity is 1, and the fluid surface in such a tube is curved. If the tube diameter is much smaller, gravity forces have no significant influence on the fluid, and the water would not flow out when the tube is turned upside down.

    + +

    The gravity level on an orbiting spacecraft is very low. Under such conditions, a fluid in a typical 1 m-diameter tank will have a Bond number of less than 1, which means that the free surface will be curved and surface tension has to be considered when modelling the fluid. In some cases, it might be possible to neglect gravity effects in the analysis, depending on the tank’s diameter and the type of fluid that it holds. This would be true, for example, for a 0.6 m tank carrying nitrous oxide, for which the Bond number would be 0.1 under a ‘Eureca-type’ residual acceleration.

    + +

    Tanks for microgravity applications often contain baffles and fluid-management devices and their effects need to be considered as a next step.

    + +

    Fluid sloshing frequencies

    + +

    The fluid sloshing modes of tanks subject to Earth’s gravity exhibit frequencies that are usually far below the structural resonance frequencies. The first sloshing mode in a typical spacecraft tank has a frequency around 1 Hz. The frequency is approximately proportional to the square root of the gravity, and therefore decreases if the gravity level is reduced. If the Bond number becomes small, the frequency’s dependence on the surface-tension increases. Analytical solutions are possible for simple problems of limited engineering value, but numerical methods are needed to model complex engineering problems.

    + +

    Fluid sloshing mode frequencies in microgravity are generally very low, typically in the range 0.1 to 0.01 Hz. These low- frequency modes could interfere with the structural bending modes of large solar arrays, or with the satellite’s Attitude and Orbit Control System (AOCS). As a result, such fluid effects in low gravity need to be determined as one of the more critical inputs when analyzing the dynamic control of satellites.

    + +

    Analysis methods

    + +

    Appropriate analysis capabilities require facilities for the generation of a simplified dynamic model (few degrees of freedom) of the propellant fluid in low gravity for coupling with satellite mass and stiffness matrices as input to the satellite AOCS model.

    + +

    The analysis is conducted in three steps. As a first step, the shape of the fluid’s free surface is determined. Subsequently, the mass and stiffness matrices are evaluated. Finally, the fluid modes and frequencies are computed and simplified models are derived, assuming a rigid tank. At present, the analysis of the tank geometry is limited to cylindrical tanks with elliptical end caps, a spherical tank being a special case of such a geometry.

    + +

    Free-surface shape determination

    + +

    As mentioned earlier, the two shape extremes are the flat free surface obtained when the surface tension is negligible, and the spherical surface in zero gravity. Numerical analysis is necessary when gravity and surface tension are taken into account simultaneously, and in most cases a non-linear iteration process is required to derive the free-surface shape. The latter is discretized using finite elements, and this idealization is employed to describe the boundary of the fluid.

    + +

    Following figure shows the different shapes of the free surface at different Bond numbers for fluid contained in a cylindrical tank. It is possible in the analysis to define an offset angle between the tank’s axis and gravity vector. The surface shapes displayed in the right-hand figure are for an offset angle of 5 degrees. +bionic

    + +

    Once the free surface and its contact line with the tank wall have been established, it is easy to determine the fluid boundary necessary to establish the fluid dynamics.

    + +

    Generation of fluid mass and stiffness matrices

    + +

    To account for the effect of the fluid on the satellite, the fluid mass and stiffness matrices are generated and implemented in the satellite mathematical model. In general, the latter is built up using the finite-element method (FEM). Similar finite-element representation of the fluid would involve a significant mesh- generation effort. Boundary-element techniques, however, facilitate the generation of the fluid matrices. A number of difficulties related to the usage of the boundary-element method (BEM) for this type of fluid processing have been solved. The combination of FEM and BEM techniques arrived at has been employed successfully to represent satellite propellant tanks, which have then been coupled into the satellite mathematical model for pointing-performance +evaluations.

    + +

    As an example of the analysis possibilities, following figure shows the first mode of vibration of the fluid in a satellite tank. +bionic +The first fluid sloshing mode at 0.02 Hz

    + +

    Derivation of dynamically equivalent simple models

    + +

    The importance of each mode of vibration depends on the load generated at the tank interface with the satellite. The interface force depends on the effective modal mass matrix of the vibrational modes. It is possible to derive from the latter single-degree-of-freedom models which have equivalent dynamic behavior in terms of tank interface loads.

    + +

    Mass-spring and pendulum models are two types of models which can be inserted directly into the satellite AOCS model +bionic +The mass-spring and pendulum models

    + +

    The simplified mass-spring models are determined by the vibrating mass and its location, the spring stiffness, and the residual mass and its location. The vibration characteristics of the pendulum model are determined by the pendulum length rather than the spring stiffness, and can be used for non-zero-gravity conditions.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/forward-swept-wings/index.html b/blog/forward-swept-wings/index.html new file mode 100644 index 0000000..d6d9a11 --- /dev/null +++ b/blog/forward-swept-wings/index.html @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Forward Sweeping is the concept of having the wings bent in the forward direction towards the fuselage (as seen in the picture of the X-29). +Forward swept wings were first developed in the 1980s as an experiment to overcome many of the disadvantages of the rear sweep but little did we know what complications it would bring with it. +To understand and evaluate the forward sweep we need to first understand why wings are swept back.

    + +

    X-29:

    + +

    X-29

    + +

    A wing typically works on bernoulli’s principle where the air above the aerofoil has higher speed and lower pressure as compared to the air below it .This causes a net upward force on the wing known as lift. Consider an aircraft travelling at a mach number lower than one the air above the aerofoil can cross the speed of sound due to the curvature of the aerofoil and this can result in flow separation and generation of shock waves. This will result in the generation of immense drag and can also cause the aircraft to pitch downwards due to the increase in lift generation from the wings behind. As the wing has a rear sweep angle the chordwise (perpendicular to the wing span) component of the velocity does not cross mach one and flow separation along with shock wave is delayed.

    + +

    One of the problems with rear sweep is the roll control by ailerons during high speed flight, as the air flows from the root to the wing tips stalling begins from the tips till the root and ailerons are located near the wing wing tips and if that part of the wing stalls then we can lose control of the aircraft at very nascent stages of velocity.They also generate a lot of drag due to generation of vortices on the wing tips where the low pressure and high pressure air meet. These types of problems lead to the development of forward sweep.

    + +

    Air Flow Comparison:

    + +

    Air FLow Comparison

    + +

    Pitching down of the aircraft due to flow separation:

    + +

    Pitching down of the aircraft due to flow separation

    + +

    Both of these problems are solved by forward swept wings. As the air flow is now from the tips to the root we have better control of the aircraft because stalling begins at the roots where there are minimum control surfaces. Vortices are eliminated and also the center of pressure shifts behind the COG and hence we need small wings in the front to balance out the moment. Because of this shift the aircraft brings about lot of unstable characteristics, the aircraft is impossible to be in practice without a computer because it has to be adjusted for stable flight upto 40 times a second which is not possible manually, the testing by NASA on the X-29 had 3 computers on board incase one would fail. Flying in extreme weather will be a huge problem for this type of aircraft , these are the major reasons why this innovation was not taken into practical applications. +The wing loads were also tremendously high,due to which special materials were needed during manufacturing of the wing. +Although forward sweep did solve a lot of problems and increase efficiency but they were not incorporated into modern fighter jets because the advantages simply did not outweigh the cons. +Also this design is useless for stealth purpose,so the rear sweep delta wing dominated.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/from-1g-to-5g/index.html b/blog/from-1g-to-5g/index.html new file mode 100644 index 0000000..b165efd --- /dev/null +++ b/blog/from-1g-to-5g/index.html @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    First mobile phones had to be packed in a briefcase! Mobile technology has come a long way. It will play a crucial role in technologies of the future like IoT and autonomous vehicles! Let us look at the evolution from 1G to 5G

    + +

    WHAT ARE CELLULAR NETWORKS AND WHY ARE THEY IMPORTANT?

    + +

    Cells

    + +

    Networks are a group of connected devices. A common network architecture has all devices connected by ‘links’. When the devices can move from one place to another these ‘links’ are wireless. The networks where the end devices are connected to the network wirelessly are called cellular networks. Mobile phones are classic examples of cellular networks. In the future, IoT devices and autonomous vehicles shall form a cellular network.

    + +

    Cellular - Network

    + +

    To provide service over a land area, the total land area is divided into ‘cells’. Cells are conventionally chosen as hexagons. Each cell contains at least one base station (aka mobile tower). All the base stations are connected to the core network. The core network is like the brain of the network. It controls the information flow

    + +

    WHAT HAPPENS WHEN YOU TALK TO SOMEONE ON YOUR PHONE?

    + +

    Your voice is converted into digital data by your handset. This digital data is replicated in a radio wave by changing the wave’s particular characteristics such as phase, frequency, or amplitude. These waves are radiated by the handset. A very small part reaches the antenna of the nearest base station. From here the signal is sent to your mobile operator’s (Idea, Jio, etc.) core network via the transmission link. It transfers the call to your friend’s mobile operator’s core network, which directs the call to the nearest base station to your friend. This base station radiates radiowaves which reach your friend’s handset. The earpiece inside converts signal to audio and finally, your friend can hear you!

    + +

    Mobile data works similarly. Instead of transferring a call to the friend’s mobile operator’s core network, the core network would access the internet and send information back to you.

    + +

    Roughly every 10 years, the industry decides to make this process faster, more reliable, more secure and, increase the capacity of networks to serve more devices. These standards of performance are better known as ‘generations’ or simply ‘G’. 5G is the latest set of standards.

    + +

    IMPORTANT TERMINOLOGY

    + +

    CHANNEL

    + +

    The space between a mobile phone and the base station. It carries the radiowaves. The channel is very unpredictable. It is continuously changing and consists of everything around us including us! Communication through the channel is possible in a specific frequency range called the spectrum.

    + +

    BANDWIDTH OF NETWORK

    + +

    The range of frequencies with which mobile phones and base stations have agreed to communicate is called the bandwidth of the network. Since the channel is capable of carrying a certain range of frequencies without distortion, the bandwidth has a limit. The number of devices using the network is increasing. Hence each generation uses available bandwidth more efficiently and finds ways of increasing bandwidth.

    + +

    PEAK DATA RATE

    + +

    The theoretical maximum rate at which mobile phones can send information on the network, or receive information from the network. Each generation increases the peak data rate.

    + +

    THROUGHPUT

    + +

    The actual rate at which mobile phones send and receive information from the network is called the throughput. It is generally much less than the peak data rate and, depends on several factors.

    + +

    1G

    + +

    The first mobile network, now called 1G, started in Japan in 1979. Unlike today’s cell phones which use digital methods to store and transmit information, devices of this generation used analog signals to store and transmit information. The peak data rate was only 2.4 Kbps.

    + +

    Motorola Dyna TAC1-G phone

    + +

    ​Motorola DynaTAC weighed a little less than a kilo and took 10 hours to charge!

    + +

    2G

    + +

    2G mobile networks began in Finland in 1991. They were based on the GSM (Global System for Mobile Communications) standards. The major change in this generation was the use of digital methods to store and send information. This allowed calls and text encryption, SMS (Short Messaging Service), picture messaging and, MMS (Multimedia Messaging Service). Equipment all around the world was manufactured according to the GSM standard. This introduced uniformity in network technology across regions. Hence roaming became possible. The peak data rate was 50 Kbps.

    + +

    Nokia3210(2-G phone)

    + +

    Nokia 3210 sold about 160 million units

    + +

    3G

    + +

    The first pre-commercial 3G network was launched by NTT DoCoMo in Japan in 1998. It was based on WCDMA (Wideband Code Division Multiple Access) which uses the spectrum more efficiently. This was a natural evolution from GSM. It gives a peak data rate of 2Mbps for stationery users and 384Kbps for moving users. The biggest success of 3G was the introduction of mobile data. The arrival of smartphones in the early part of this generation increased the usage of 3G mobile data. New applications of 3G were mobile TV, GPS location tracking and, video calls.

    + +

    4G

    + +

    The growth in mobile data was so fast that the industry started planning a major new network upgrade based on Internet Protocol(IP). The new technology, Long Term Evolution (LTE) became known as 4G. The first network was launched at the end of 2009. Within 4 years there were more than 250 others, making it the fastest-growing generation. It uses OFDM(Orthogonal Frequency Division Multiplexing) technology which is far more spectrum efficient. It has a peak data rate of 400Mbps and a typical throughput of a good 4G network will be 10s of Mbps for moving users and 100s of Mbps for stationary users. High Definition online TV, High Definition online gaming, videoconferencing became possible with 4G.

    + +

    image-1_sized_50

    + +

    As more people get access to smartphones and the IoT network expands, billions of devices shall need access to a mobile network. That is where 5G comes in.

    + +

    5G

    + +

    5G differs from 4G in three important aspects, bandwidth, latency, and peak data rate.

    + +

    Bandwidth

    + +

    4G uses frequencies less than 3GHz. 5G uses each bit of spectrum. Low bands below 1GHz, mid bands with frequency in 1GHz to 6GHz and, high bands beyond 30GHz. Waves in high bands have wavelengths of the order of a millimeter. Hence 5G uses mm-wave technology. There is a problem with using frequencies beyond 30GHz. The high-frequency radio waves lose significant energy on encountering an obstacle like a wall or tree. These waves are short range. One possible solution is to use more base stations.

    + +

    Latency

    + +

    Latency means ‘delay’. Time taken by your phone to show results of a google search is one kind of latency in a network. The core network controls the flow of information. It is the ‘intelligence’ of the network. For faster decisions, this intelligence is distributed. Information relevant to a device is stored close to the device. This is called edge cloud and edge computing. Edge cloud can be used when low latency is necessary and for latency tolerant applications core network will be accessed. Unfortunately, latency is a very unpredictable parameter. Even with 5G, there shall be wide variations in the latency depending on the quality of the network.

    + +

    qc_onq_lowlatency_gif_final

    + +

    Peak data rate

    + +

    The peak data rate of 5G will be 20Gbps. This is about 50 times the peak data rate of 4G. For typical 5G network throughput could be in Gbps.

    + +

    Currently, 5G has been deployed at a few places in South Korea, the USA and, other countries. Although several organizations are working towards realizing the full potential of 5G, the success of 5G also depends upon government regulations. There is no doubt that 5G holds a lot of promise for the future. From virtual reality and autonomous vehicles to industrial internet and smart cities 5G will be at the heart of the future of communications!

    + +

    REFERENCES

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/future-of-computing-quantum-computing/index.html b/blog/future-of-computing-quantum-computing/index.html new file mode 100644 index 0000000..4f3fa64 --- /dev/null +++ b/blog/future-of-computing-quantum-computing/index.html @@ -0,0 +1,582 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Lately, you must been hearing a lot about quantum computing. There are loads of news stories about how it “could change the world” and “open new dimensions”. Universities are hyping up their quantum microchip prototypes, demonstrations of quantum mechanical ideas in silicon, and other devices and theories. But how does it work? What does it do? Who’s doing it? Read this article to find out!

    + +

    Even though they may be fragile today as well as they need to be kept at temperatures close to absolute zero, Quantum computers aren’t much like the desktop PCs we’re all so familiar with—they’re a whole new kind of machine, capable of calculations so complex, it’s like upgrading from black-and-white to a full color spectrum.

    + +

    Currently we’re in the midst of entering a new era of quantum computing called the NISQ era, for Noisy, Intermediate-Scale quantum computer as John Preskill, a CalTech theoretical physicist calls it. Quantum computing is more or less in the era that classical computing was in the ‘50s, when room-sized hulks ran on vacuum tubes. But it could potentially revolutionize computing.

    + +

    Let’s first understand the mathematical theory of quantum mechanics.

    + +

    When one thing is two things at the same time

    +

    In our universe, we are used to a thing being one thing. A coin, for example, can be heads, or it can be tails. But if the coin followed the rules of quantum mechanics, the coin would be flipping midair.(Amazing right?) So until it lands and we look at it, we don’t know if it’s heads or tails. Effectively, it’s both heads and tails at the same time.

    + +

    We do know one thing about this coin. There is a probability for the flipping coin to be either heads or tails. So the coin isn’t heads, it’s not tails, it’s—for example—the probability of 20% heads and 80% tails. Scientifically speaking, how can a physical thing be like this? How do we even begin describe it?

    + +

    The most mind-boggling part of quantum mechanics is that for some reason, particles like electrons seem to act like waves, and light waves like particles. Particles have a wavelength. The most basic experiment demonstrating this fact is the double slit experiment:

    + +

    Double Slit experiment

    + +

    If you put a pair of parallel slits in a partition between a beam of particles and a wall, and put a detector on the wall to see what happens, a strange pattern of stripes appear. It’s called an interference pattern.

    + +

    Like waves, the particles-waves that travel through one slit interfere with those that travel through the other slit. If the peak of the wave aligns with a trough, the particles cancel out and nothing shows up. If the peak aligns with another peak, the signal in the detector would be even brighter. (This interference pattern still exists even if you only send one electron at a time.) If we were to describe one of these wave-like particles (before they hit the wall) as a mathematical equation, it would look like the mathematical equation describing our coin (before it hits the ground and lands on heads or tails).

    + +

    These equations can look kind of scary, like this: +Equation

    + +

    But all you need to know is that this equation lists the particle’s definite properties but doesn’t say which one you’ll get. You can use this equation to find the probabilities of some of the particle’s properties. +And because this math involves complex numbers—those containing the square root of i —it doesn’t just describe the probability of a coin being heads or tails, it describes an advanced probability, which could include the way the face of the coin will be rotated.

    + +

    From all this crazy math, we get a couple of crazy things:

    + +

    1. There is superposition—the midair coin being heads and tails at the same time.

    + +

    2. There is interference—probability waves overlapping and canceling each other out.

    + +

    3. There is entanglement, which is like if we tied a bunch of coins together, changing the probability of certain outcomes because they’re, well, entangled now.

    + +

    These three phenomenon are exploited by quantum computers to make whole new kinds of algorithms.

    + +
    +

    “Quantum computers turn the rules of computers on their heads.”

    +
    + +

    How a quantum computer works

    + +

    As Martin Laforest, Senior Manager of Scientific Outreach at the Institute for Quantum Computing at the University of Waterloo has said,“In some sense we’ve been doing the same thing for 60 years. The rules we use to compute have not changed—we’re stuck with bits and bytes and logic operations,. But that is all about to change. Quantum computers turn the rules of computers on their heads.”

    + +

    The traditional common digital computing requires that the data be encoded into binary digits(bits), each of which is always in one of two definite states (0 or 1), whereas quantum computation use quantum bits or qubits, which can be in superpositions of states.

    + +

    Bits

    + +

    The qubit is like a regular bit, but it’s both a zero and a one at the same time (before you look at it). It’s that coin flipping in midair. A quantum computer is like flipping multiple coins at the same time—except while these coins are flipping, they obey the rules of superposition, interference and entanglement.

    + +

    The quantum computer first bestows the qubits with this quantum mechanical version of probability of what will happen once you actually peep the qubit. (Once you peep the qubit it becomes a defined bit.) Quantum mechanical computations are made by preparing the qubits (or adding weights to a coin before you flip it to manipulate the probability of the outcome), then interacting them together (or flipping a bunch of entangled coins at once) and then measuring them (which causes the coins to stop flipping and produces the final value). If done properly, all of this mid-air interaction should result in a best answer (the value) to whatever question you’ve asked the computer.

    + +

    Quantum computing algorithms perform calculations by manipulating these qubits via the mathematics of quantum mechanics. At its core, that math is just probability combined with complex numbers and the linear algebra. Quantum computers computes a special version of probabilities—not just heads vs. tails but also the orientation of the coin. So as you throw these coins up in the air, they collide with each other with their different sides and orientations, and this changes the probability of the side revealed by the outcome. Sometimes they bump into each other and cancel each other out, making certain outcomes less likely. Sometimes they push each other along, making certain outcomes more likely. All this is interference behavior and the idea in modeling a quantum computer is to choreograph a pattern of interference so that everything cancels out except for the required answer. To the observer, the answer just looks like the output of regular bits. The quantum mechanics happens in the background.

    + +

    Quantum Vs Classical:

    + +
      +
    • Information processing—In a classical computer, bits are processed sequentially, which is similar to the way a person would solve a math problem by hand. In quantum computation, qubits are entangled together, so changing the state of one qubit influences the state of others regardless of their physical distance. This allows quantum computers to intrinsically converge on the right answer to a problem very quickly.
    • +
    • Interpreting results—In classical computing, only specifically defined results are available, inherently limited by algorithm design. Quantum answers are probabilistic, meaning that because of superposition and entanglement, multiple possible answers are considered in a given computation. Problems are run multiple times, giving a sample of possible answers and increasing confidence in the best answer provided.
    • +
    • Information representation—In classical computing, a computer runs on bits that have a value of either 0 or 1. Quantum bits, or “qubits,” are similar, in that for practical purposes, we read them as a value of 0 or 1, but they can also hold much more complex information, or even be negative values.
    • +
    + +

    A Physical Orbit:

    +

    Regular computers were made by scientists using transistors and electrical switches which stores the bits. Similarly, they need hardware that can store a quantum bit. The key to producing a quantum computer is finding a way to model a quantum system that people can actually control—actually set the probabilities and orientations of those flipping coins. This can be done with atoms trapped by lasers, photons, and other systems. But right now, almost everyone in the industry who’s presented a quantum computer has done so with superconductors—ultra-cold pieces of specially-fabricated electronics. +They look like really small microchips. Except these microchips get placed into room-sized refrigerators cooled to temperatures just above absolute zero. These superconducting qubits stay quantum for a long time while performing quantum computing operations. +4 Qubit

    + +

    Actually performing calculations with these qubits can be a challenge. Regular computers have error correction, places where multiple bits perform the same function in case one of them fail. For quantum computers to do this, they need to have extra qubits built into their system specifically to check errors. But the nature of quantum mechanics makes actually doing this error correction more difficult than it does in classical computers. It could take around two thousand physical qubits working in tandem, in fact, to create one reliable “error-corrected” qubit resistant to messing up.

    + +

    Better qubits and further research continue to bring us closer to the threshold where we can construct few-qubit processors. Now we’re at the junction where the theoretical demand versus the reality of experiments are converging together.

    + +

    Who’s working on it?

    +

    Universities, national labs, and companies like IBM, Google, Microsoft and Intel are pursuing qubits set-ups in logic circuits similar to regular bits, all with less than 20 qubits so far. Companies are simultaneously simulating quantum computers with classical computers, but around 50 qubits is seen as the limit—IBM recently simulated 56 qubits, which took 4.5 terabytes of memory in a classical computer.

    + +

    A quick look at the progress of the mentioned companies:

    + +
      +
    1. +

      IBM is taking a long-term approach, hoping to one day release a general-purpose quantum computer that classical computers rely on, when needed, through the cloud. +Intel has just entered the race with their 17-qubit processor released in October.

      +
    2. +
    3. +

      Microsoft is working on a different kind of “topological” qubit based on the behaviors of many electrons, and described a similar long-term goal for quantum computing involving scalable hardware.

      +
    4. +
    5. +

      Google has been rumored to unleash a quantum computer that will achieve “quantum supremacy” with 49 or 50 qubits. Quantum supremacy simply means finding one single algorithm for which a quantum computer always win, and for which a classical workaround can’t be found to solve the same problem. In Google’s case, the team will set up a quantum circuit with their qubits by entangling them (essentially, setting up a quantum link between them) and then allowing the system to evolve over time. At the end, how the qubits evolve is set by the rules of quantum mechanics, but the final measurement could take on different values with different probabilities. Figuring out the possible outcomes of the qubits, alongside the probability of measuring the outcomes, is so complex that the classical computer needs to simulate the quantum computer in order to do so, and might take weeks to do what the quantum computer can do in minutes.

      +
    6. +
    7. +

      IonQ,a startup will use atoms trapped by lasers.

      +
    8. +
    9. +

      D-Wave, a longtime quantum computing business uses a specialized system called quantum annealing to perform optimization problems. Rather than just a dozen to a few dozen qubits, D-Wave has announced a computer with 2,000 qubits and rather than rely on quantum logic circuits like the rest of the pack, their computer solves one type of problem—optimization problems, like finding the best solution from a range of okay solutions, or finding the best taxi route from point A to point B staying as far as possible from other taxis. These kind of problems are potentially useful in finance.

      +
    10. +
    + +

    The outlook

    +

    Everyone agrees that we’re far from seeing quantum computers used in everyday life—there’s a lot of excitement but we’re still in the early days. There are still loads of challenges to overcome, like error correction. Then comes the related problem of transmitting quantum information between distant computers or storing quantum information long term in memory.

    + +

    While 2017 seems to be a year amidst a sort-of quantum boom, having a consumer-facing quantum computing product is still far off milestone. So no, you cannot own a quantum computer now. You hear about some benefits of quantum computing in the next few years, like biochemical advances, but other advantages could be 20 years down the line but it will definitely be worth the wait!

    + + + +

    Try Your Hand at Quantum Computing

    + +

    IBM’s 5 qubit quantum computer

    + +

    Want a quantum experience?

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/future-of-drones/index.html b/blog/future-of-drones/index.html new file mode 100644 index 0000000..634ee71 --- /dev/null +++ b/blog/future-of-drones/index.html @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The word Drone is used pretty often in today’s world. Today the term has broadened to include +anything from highly sophisticated $100M Global Hawk to $30 teeny-tiny UDI 839 Quadcopter. Even flightless vehicle such as Drone ship are occasionally referred to as drones.

    + +

    img

    + +

    Global Hawk

    + +

    img

    + +

    Quadcopter

    + +

    So what exactly is a drone?

    + +

    It is called as an unmanned aerial vehicle essentially if it flies in a controlled way and their isn’t anybody on board. Whether it is controlled by computers or entirely controlled by a remote makes little difference. But most often when you see a vehicle described as a drone today, it is a little bit of both: piloted by humans, but capable of some degree of navigation on its own if necessary.

    + +

    THE MONOSPINNER DRONE

    + +

    img

    + +

    What do you think is the minimum number of moving parts required for a controlled flight?

    + +

    For example, helicopters have two moving parts, a propeller and tail rudder and multicopter drones hover in a place through a number of rotors which create an upward thrust to cancel out their weight, whereas mono spinner relies on just one propeller.

    + +

    This works without hinges, ailerons, flaps and servos. Because of single thrust force created by propeller it can’t just lift off from the ground, it flips over. In order to get it to flight it has to be thrown like a frisbee. For a certain constant angular speed and propeller force the torques are cancelled out by cross coupling terms, an unconventional equilibrium is found and the mono spinner is able to stay in one position.

    + +

    Feedback control keeps the mono spinner in its stable position, without active feedback control it will crash. However it produces only one thrust it can still be controllable using some advanced algorithms. This drone is robust and can recover and stabilize even after heavy disturbances.

    + +

    img

    + +

    What if a propeller or motor, of a quadcopter or any other with more than one propeller experiences a failure. Simple enough, remaining propellers take over or at least they try. With this single propeller idea we can make a drone fly even when there is only one working +propeller on drone.

    + +

    Similar to this drone, another single propeller drone is UNI -Copter. This drone has only one propeller, but the only difference here is it uses control surfaces to have stable flight. This has two layers of control surfaces, upper control surface and lower control surface. Upper control surface compensate the anti-torque and controls flight directions and lower control surface controls flight +directions. Servo motors are used to control these control surfaces. The main advantage of this drone is its sphere shaped frame protects the core elements for flying and control and enables landing and take-off without constrains of terrain.

    + +

    POLLINATION DRONES

    + +

    Bees play a crucial role in pollination. These days bee colonies are decreasing due to increase in use of pesticides. So scientist in japan used a drone, horse hair and a sticky ionic gel which mimic the action of a bee. The pollinator drone is attached with a strip of horse hair at the bottom and it is coated with a gluey substance called ionic gel which has peculiar lift and stick ability. Pollen normally sticks to the hair of bee. Similarly pollen sticks to the drone and it can be transferred to another flower.

    + +

    At present these drones are controlled manually. Future models of this might use Artificial Intelligence or GPS to control and plan the best paths to pollination.

    + +

    Similar to this, in 2017 Poli-X pollination Drone project was launched and it was tested in 2018. The main intention of this project is to design a drone which is capable of recognize flowering plant species and autonomously pollinate only those species. The concept prototypes, Poli-X1 and Poli-X2 are under development by OpenRobotix Labs. The drones are capable of recognizing plant species for pollination, self-charging and remain in the fields throughout the flowering season.

    + +

    img

    + +

    Pollination drone

    + +

    img

    + +

    Poli-X1 drone

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/future-of-power-generation/index.html b/blog/future-of-power-generation/index.html new file mode 100644 index 0000000..5085a43 --- /dev/null +++ b/blog/future-of-power-generation/index.html @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The following statements are something we all have been reading and learning as the truth:

    + +
      +
    • Fossil fuels, such as coal and oil, are dangerous pollutants, and anyway we are running out of them.
    • +
    • Nuclear power is so dangerous that it cannot safely be used; indeed, the nuclear facilities already in existence represent such a mortal danger that they should be shut down.
    • +
    • But there is one hope: power derived from the sun and winds. These are infinite in quantity, or at least indefinitely great; and they are also safe and clean. All we need is a few years in which to develop this kind of power, and our energy needs will be taken care of.
    • +
    + +

    Only the first of these three statements is true, with some qualifications. The second and third statements are false, although it is popular to believe that they are true.

    + +

    Discussing sources of energy and what would be the future power generation method?

    + +

    1) Fossil fuels

    + +

    The fuels that caused the great industrial revolution, the fuels which accelerated the scientific progress of mankind, making our lives better, have also been the cause of polluting the environment. CO2, nitrous oxide, etc that are released during burning of fossil fuels are the major contributors to global warming while also leading to air pollution. Electricity and Heat Production occupy a major chunk of fossil fuel usage. Since they are non renewable and the pace at which we are already using it up they are likely to be over in the coming years. With such problems that pose from fossil fuels there’s a need to find better alternatives for energy production.

    + +

    2) Renewable Energy

    + +

    Are renewable energy green and clean as believed?

    + +

    a) Solar energy

    + +

    Direct Energy from the fusion reactor of the solar system, solar energy might look promising with new technology being developed, but is it true?

    + +

    The major problem with solar power (in fact every renewable power plant) is that the energy generated isn’t constant and varies based on the amount of sunlight that reaches the earth’s surface i.e. based on night, clouds, heavy rains etc. These will cause hindrances in power generation and the effects of these are already being displayed in places like California and Germany which rely mostly on renewable energy generation, increase in price rise has been seen after the implementation since California pays the neighbouring states to use electricity when in excess and has to again buy electricity when electricity generation is low just to maintain the grid. As a result maintaining the grid is pretty difficult and hence large storage batteries are required which also raise the price. Another problem is the land occupied by the solar farms, the amount of land occupied by solar farms are huge compared to that of nuclear or fossil fuel power plants. On an estimate Solar and wind farms require between 400 and 750 times more land than nuclear and natural gas plants. Batteries also require space and hence the area needed might increase significantly.

    + +

    Another major problem is the environmental concerns, the materials used in solar panels especially the toxic heavy metals can’t be recycled much, as a result they are being dumped in 3rd world countries once their lifetime is completed. As per reports by Chinese and Japanese experts, recycling and manufacturing solar panels from used ones is much costlier than making it all new. Wild-Life Conservationists argue that animals are losing their habitats from solar farms which is also a concerning issue (desert tortoises number has reduced over the years in California’s desert solar farms as of today many experiments are being done to allow the tortoises to dwell in the solar farms and make it their habitat). +Solar energy for low energy demanding works or a few household purposes are better but for large scale energy generation, as of now they are inefficient and economically inviable.

    + +

    b) Wind Energy

    + +

    This, as explained, has problems similar to solar energy, apart from fluctuating and needing large scale place they also have materials that are not viable for recycling and are being dumped in 3rd world countries, they are also causing death of endangered bird species.

    + +

    c) Hydro-electric power plants

    + +

    Among the 3 major renewable sources this has higher efficiency in energy generation, can be used to prevent floods and also used to direct water for irrigation and drinking water purposes. But they too have serious environment concerns since they are generally built in active earthquake centres, loss of habitat of animals and people during construction etc., but the advantages outweigh the problems since they can generate higher amount electricity, protection from floods, water for drinking and irrigation etc. which lead to greater economic development while also causing lesser pollution, hence among renewable energy Hydro-electric power plants are more preferable for centralised distribution of power. But the major drawback is that they can be implemented in regions having rivers with high water flow and valleys.

    + +

    Thus among renewable energy for centralised power distribution hydro electric power generation is better while for decentralised power roof top solar panels might be better off.

    + +

    3) Nuclear energy

    + +

    The most dreaded form of energy production, with nuclear bombings in Japan and the cold war’s race to develop more nuclear weapons, Chernobyl and Fukushima disasters and a lot of misinformation floating around, this might look like a taboo that mankind should never venture into and would be better if we shift our focus from the method, but is that true?

    + +

    Nuclear fission power plants’ mortality rate per thousand terawatt hour is the least among all forms of energy production, produces the highest amount of energy per space occupied, the amount of waste produced per energy produced is also less. It has also cut down the cost of electricity production while the generation itself is mostly constant. The radioactive materials are handled with much more care and since the quantity produced per energy generation is less, with many new technologies being developed to reduce the life of toxic radioactive materials, it can be easily contained since the quantity generated itself is less in the process.

    + +
    + +image1 +image2 +image3 +
    + +

    The 3 images represent the amount of clean energy used vs the cost that households pay, we see that Germany which is leading in usage of renewable energy still has a lot of coal power plants due to the variable nature of solar and wind power generation while also the price for household usage is rising.

    + +

    There are a few problems such as using technology used in Nuclear Energy development for nuclear weapon production but new technology transfer ensures it’s intrinsically proliferation resistant. Thorium which is abundant in many nations can be used to reduce monopoly, strict procedures in every part of a nuclear power plant from building to maintenance to shut down have to be discussed and framed out such that events such as Chernobyl and Fukushima don’t occur again. But still comparing the data from the table below a nuclear power plant has a lesser mortality rate than other means. The initial investment required to build the power plant is high and the time taken to do is also more.

    + +

    result

    + +

    Conclusion

    + +

    Comparing all the data we can say that nuclear power plants are the way for a green environment and cleaner energy. But does that mean every form of energy has to be discarded and only nuclear energy has to be developed and used, the answer would be no. There are several cases where fast deployment and generation of energy is needed where solar and wind energy can be used, Space exploration is one such example. Houses and other buildings can install solar panels to generate excess energy (if they can economically do so). Developing better analysis models we can predict the structural stability of dams and also build dams or hydro electric projects in a way to reduce disasters due to earthquakes. Research on fossil fuels is needed too so that as long as we are using them we create less amount of pollution.

    + +

    But for a centralised distribution of energy, a less polluting, environment friendly and cheaper source of energy which can lead to greater economic development, nuclear energy is the best choice that Earth has as of now.

    + +

    Sources

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/generate-text-with-gpt2/index.html b/blog/generate-text-with-gpt2/index.html new file mode 100644 index 0000000..307e7a7 --- /dev/null +++ b/blog/generate-text-with-gpt2/index.html @@ -0,0 +1,633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    GPT-2 refers to a set of Language Models released recently by OpenAI. My objective is to find weird ways that GPT-2 can fail, and also some smart things it is capable of. I’ll be using talktotransformer for this task. It’s a convenient tool that asks for a short text prompt, and then generates several lines of text to continue the prompt (no coding required!).

    + +

    First, let’s see if you’re paying attention. Check out the following two samples:

    + +
    +

    Department of applied mechanics and hydraulics of National Institute of Technology - Karnataka (NIT-K), Suratkal will host a 3-day workshop on coastal reservoirs as a sustainable strategy for water security on its Srinivasnagar premises from July 22. T G Seetharam, director, IIT Guwahati, will be the chief guest and inaugurate the seminar. K Uma Maheshwar Rao, director, NITK will preside over the inaugural function.

    +The seminar will offer a comprehensive overview of the coastal water management sector including hydrometeorology, hydrodynamic, hydrometeorology and hydrography.

    +It will be addressed by experts in the various fields including engineering, hydraulics, hydrology, hydrography and marine ecology/oceanography, besides coastal water managers and engineers.

    +Seetharam said while it was an emerging sector with great potential, no clear strategies were being pursued for conservation and recovery of flood prone areas.

    +
    + +

    Makes sense? What about this one:

    + +
    +

    Department of applied mechanics and hydraulics of National Institute of Technology - Karnataka (NIT-K), Suratkal will host a 3-day workshop on coastal reservoirs as a sustainable strategy for water security on its Srinivasnagar premises from July 22. T G Seetharam, director, IIT Guwahati, will be the chief guest and inaugurate the seminar. K Uma Maheshwar Rao, director, NITK will preside over the inaugural function.

    +“We will address the problem of coastal development in a holistic way and in many ways, the sea cannot be separated from the land. We have to look at the whole development area and take the sea into account,” M S Rathore, head of the Centre for Research in Development and Environment (CRED), said.

    +This is the second such seminar under CRED. The first seminar was held on August 6.

    +
    + +

    Which one do you think is real, and which one was generated?

    + +

    I’m dead serious: which one do you think is fake?

    + +

    You can re-read them carefully to make your choice.

    + +







    +Okay ready? +





    + +

    Hah, Trick question! Turns out, both were generated by GPT-2. The real article is this one from the Times Of India

    + +

    I took the first paragraph from that article (bold in the generated samples), fed it into the transformer, and after a few trials, out came the above two examples.

    + +

    Notice, in the second fake sample, the thing was talking about a certain Centre for Research in Development and Environment, which does sound like a typical government-style name for an organization. Also, it gave an acronym as well, and the initials match up! CRED isn’t even a real organization as far as I know, and the model somehow birthed it out of thin air.

    + +

    Now the obvious question is - can it generate poetry?

    + +

    Let’s see what the transformer spews out when prompted with Dylan Thomas’ famous piece:

    + +
    +

    Do not go gentle into that good night,
    +Old age should burn and rave at close of day;
    +Rage, rage against the dying of the light. +

    +When the night is past and the moon is down,
    +I shall sit and watch it, till I have heard the dawn,
    +Which I shall know to be a new life. +

    +Old age ought not to be fathomed,
    +Forthwith shall we know it to be a night;
    +Rage is, and a good song shall be sung. +

    +And in the hour of my death I shall not sleep;
    +I shall sing and tell of the night long;
    +I shall hear your song and say: How sweet the evening

    +
    + +

    Much deep, so poetry.

    + +

    Somehow the model knows how poems like these are structured, where the lines should break, and what kind of deep and wise sounding words a romantic poet writes.

    + +

    And now for some pure mischief:

    + +
    +

    Kejriwal announces: “I’m a vampire. I’m actually from outer space”
    +-On his alleged visit in 2013, to the Indian Space Research Organisation (ISRO) to observe the launch of a satellite of its foreign rivals
    +-Claims to have created the world’s second most powerful economy with “nearly double” of the GDP.
    +But that’s not all. Mr Kejriwal, who is the chief minister of Delhi, claims to have been abducted last year by the security forces, tortured and forced to drink demon urine.
    +And he has also said that he is a vampire, which is a type of supernatural creature that feeds on blood.
    +He said: “So that’s how I was born. It’s not my fault. I got stolen by the forces during a traffic raid. It took my arm off.”
    +Mr Kejriwal, the former Delhi chief minister, says he is a “vampire” because he believes God has cursed him.
    +A video obtained by Daily News India of Mr Kejriwal during his first public address was shown in front of the National Conference’s main square in Delhi.

    +
    + +

    Among other things:

    + +
      +
    1. It knows what a vampire does (supernatural creature that feeds on blood.)
    2. +
    3. It associates Kejriwal with the position of CM of Delhi, which is great! But it first says he is the CM, then says he’s the former CM. So it has problems with consistency.
    4. +
    5. The article seems to match the general flow of a news piece, albeit confused by the mention of vampires.
    6. +
    + +

    How exactly does this thing work?

    + +
    + +

    Birds eye view of GPT-2

    + +

    GPT-2 stands for Generative Pretrained Transformer 2. Generative because it is, well, generating text. Pretrained because the guys who made it trained it on a HUGE corpus of outgoing links from Reddit. Pretraining is useful because this let’s us fine-tune the model to our particular use case with a lot fewer examples. Transformer because that’s what the building blocks of this thing are called.

    + +

    Stack of Decoders +

    Source

    + +

    GPT-2 is a Language Model, which is a fancy way of saying that, when given a prompt, it gives a distribution of which word should come next.

    + +

    (It’s not exactly words that it gives probabilities for, more like pieces of words. For simplicity, let’s just assume that it has a vocabulary of words among which it decides.)

    + +

    But neural networks deal with numbers, not strings. So we convert each word into a fixed-length vector of numbers, so that the input sentences are converted into an array of vectors (all of the same length). This is what’s called an Embedding. GPT-2 also considers the context in which each word is used, and gives a slightly different set of numbers for different contexts.

    + +

    As an example of why context matters, notice that the word ‘break’ has different meanings in ‘break the glass’ vs ‘summer break’.

    + +

    So now have converted the input string into a list of vectors. Now we feed it into the Decoder block, which essentially looks like this::

    + +

    Transformer Block +

    Source

    + +

    Attention is an operation which converts an input sequence to an output sequence of the same length. The output is also a list of vectors of fixed length, just like the input sequence.

    + +

    MLP is just your garden variety vanilla feedforward net, although it can be a convolutional block as well.

    + +

    Layer norm is a method of speeding up the training (by allowing gradients to flow more easily), and adding regularization to the network.

    + +

    Also, we use skip connections (those arrows that go around blocks) because this let’s us directly propagate information from earlier layers to later layers.

    + +

    (For more in-depth and hands-on explanations, check out the resources at the end.)

    + +
    + +

    Closing thoughts

    + +

    You can make GPT-2 do all kinds of fun stuff: generate Lord of the Rings fanfiction, brew up some recipes, fake popular science news and generate some sweet, sweet political propaganda.

    + +

    When it works, it’s language use can be wicked good at fooling people who are just skimming (including me, of course). It can hold onto a topic over several sentences, and flow of words is also quite natural on the surface.

    + +

    It’s when you read beyond just the words themselves and try to grasp the big picture, it feels more like it took a big pile of what makes up the internet, mixed the sentences around thoroughly, and spit out a barely coherent soup.

    + +

    So does this thing have actual language understanding?

    + +
    + +

    Resources

    + +

    If you wanna play around with GPT-2 yourself:

    + + +

    If you want to dive deep and get your hands dirty with real code, here are some resources:

    + + +

    For introduction to more fundamental concepts:

    + + +

    For more fun stuff that Neural Nets do:

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/generative-adversarial-networks/index.html b/blog/generative-adversarial-networks/index.html new file mode 100644 index 0000000..bcc170b --- /dev/null +++ b/blog/generative-adversarial-networks/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    In the last 2 years, Generative Models have been one of the most active areas of research in the field of Deep Learning. The paper on Generative Adversarial Networks (a.k.a GANs) published by Ian Goodfellow in 2014 triggered a new wave of research in the field of Generative Models. Today we’ll explore what makes GANs so different and interesting.

    + +

    Introduction

    + +

    Ideal Generative Model

    + +

    The main objective of a Generative Model is to learn the probability distribution from which the training data is sampled. Once the model learns the probability distribution, it can sample new data from it. For eg. If the model is trained on a sufficiently large dataset consisting of images of handwritten digits, we expect the trained model to then generate images of handwritten digits, which are not a part of the training data. Now, in reality, it is very hard to build models which can learn the exact probability distribution. So we usually try to build models that can just estimate the distribution or generate samples from the distribution without explicitly learning the distribution itself.

    + +

    Generative Adversarial Networks

    +

    Even before the introduction of GANs, there existed several Generative Models such as Variational Autoencoders, Boltzmann Machines and Deep Belief Networks among others. But GANs provide a totally new way of building Generative Models.

    + +

    So, what is a GAN?

    +

    The key feature of a GAN is that the generative model is pitted against an adversary; a discriminator model which learns to determine whether a sample is generated from the model or belongs to the actual data distrubution. The generator works like a currency counterfeiter, who generates notes that are as close as possible to the original. The discriminator works as a bank that determines whether a given currency sample is fake or real. In other words, the generator tries to fool the discriminator, while the discriminator tries to prevent this from happening.

    + +

    Generative Adeversarial Network

    + +

    More concretely, the discriminator and generator can be represented by two separate neural networks, G and D. G takes random noise as input and outputs a sample from the learned probability distribution. D takes in a sample and outputs the probability that the given sample is real. So we would train the discriminator to maximise the probability of correctly determining whether the given sample is real or fake. Whereas for the generator we would like to minimise the probability that the discriminator correctly guesses the sample being fake. We can then determine losses for both G and D, and train them using backpropagation.

    + +

    This is equivalent to G and D playing a two-player minimax game. In the ideal scenario, the generator would generate samples that are indistinguishable from the real data and the output of D would be 1/2, that is the sample is equally likely to be either real or fake.

    + +

    Value function V(G, D) for the minimax game

    + +

    G and Minimax Game

    + +

    Advantages and Disadvantages

    + +

    This adversarial approach is very effective in building generative models. GANs have a number of computational as well as statistical advantages such as using only simple backpropogation to obtain gradients, no need of inferences during training among others. It also comes with its own set of drawbacks. One of them is the difficulty in training the model. The Helvetica Scenario occurs quite often during training, where the generator finds one sample which fools the discriminator, and then keeps on generating simple variations of the same sample without learning to generate other distinct samples.

    + +

    Fantastic GANs And Where To Find Them

    +

    As mentioned earlier, GANs are one of the most active areas of research in Deep Learning. Hundreds of papers have been published since the original paper 2014, detailing various modifications and applications for the GAN framework. The applications range from Image to Image Translation to Image Style Transfer. Here are a few examples:

    + +

    > DCGAN +DCGAN

    + +

    > acGAN +acGAN

    + +

    > DiscoGAN +DiscoGAN

    + +

    You can find a complete list of various GANs at the GAN Zoo

    + +

    References

    +
      +
    1. Generative Adversarial Networks, Ian Goodfellow et al., 2014
    2. +
    3. Deep Generative Models
    4. +
    5. GAN Tutorial, NIPS 2016
    6. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/gesture-controlled-robot/index.html b/blog/gesture-controlled-robot/index.html new file mode 100644 index 0000000..2a70ccd --- /dev/null +++ b/blog/gesture-controlled-robot/index.html @@ -0,0 +1,623 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “JARVIS, Suit me Up!”, Clang! Spoof! Phew!, +Tony Stark becomes IRON MAN!

    +
    + +

    Have You Ever Wondered, what if, just like that, with one cool move you too could control and move objects around you; OR Maybe develop a gesture-controlled game like in the movie Ra. One? Well, here I have tried to design and build a mini version of it; a Robot controlled by hand gestures.

    + +

    But first up, what exactly is a Gesture Controlled Robot?

    + +

    A Robot which detects any movement(gesture) and functions depending upon these signals is a Gesture Controlled Robot. They can use different technologies viz. accelerometer-based sensing (wired or wireless) or image processing.

    + +

    Here we will implement an accelerometer-based, wireless gesture-controlled robot.

    + +

    What you need to have.

    + +

    The bot has two sections- transmitter and receiver. You will need Ht12e (encoder ic), Ht12d (decoder ic), L293D (motor driver shield), Arduino uno,7805(voltage regulator ic), capacitor, PBT connector, single pole antenna, resistor, LED, accelerometer and battery.

    + +

    How does it work and recognize the gestures?

    + +

    The brain of this robot is the Arduino Uno (Atmega32) which is fed with a set of code. The gestures/motion made by hand are detected by an acceleration measuring device, called accelerometer (ADXL335).

    + +

    img1

    + +

    The accelerometer reads the X Y Z coordinates when we make gestures by hand and sends them to the Arduino. The Arduino checks the values of coordinates and sends a 4-bit code to the Encoder IC. The Encoder passes the data to an RF transmitter and the transmitted data is received by an RF receiver. The receiver sends the 4-bit code to the Decoder IC which then passes it to a Motor Driver IC. It later takes the decision to turn the two motors in the required direction.

    + +

    What is an Accelerometer?

    + +

    An accelerometer is a type of sensor which gives data in Analog form while moving in the directions of X, Y and Z(these directions depend on the type of sensor). It consists of direction arrows; if we tilt the sensor in one direction, then the data at that particular pin will change in analog format. The accelerometer consists of six pins. The function of each pin is discussed here.

    + +
      +
    • +

      Pin-1: VDD pin is used to give +5V supply.

      +
    • +
    • +

      Pin-2: GND pin is connected to the ground to ensure biasing.

      +
    • +
    • +

      Pin-3: X pin will receive the data from the X direction.

      +
    • +
    • +

      Pin-4: Y pin will receive the data from the Y direction.

      +
    • +
    + +

    img2

    + +
      +
    • +

      Pin-5: Z pin will receive the data from the Z direction.

      +
    • +
    • +

      Pin-6: ST pin is used to adjust the sensitivity of the accelerometer i.e. 1.5g or 2g or 3g or 4g.

      +
    • +
    + +

    Making the power supply.

    + +

    You will need:

    + +
      +
    • +

      An IC 7805 which regulates the 12V supply to 5V (if you can’t get a 12V supply you can use a 9V supply)

      +
    • +
    • +

      0.1uf and 470uf capacitors

      +
    • +
    • +

      1k resistor for status LED

      +
    • +
    + +

    Let’s start with the power supply circuit. You will need two such circuits: one for the transmitter and one for the receiver. The receiver circuit needs to be powered using a 12V supply (since we are using a 12V motor), and the transmitter circuit can be powered using a 9V battery.

    + +

    img3

    + +

    You can see the circuit diagram for the receiver power supply on the right. Using this diagram, rig up the supply circuit. You can also add an LED via a 1K resistor to indicate the state of power supply.

    + +

    img4

    + +

    Let’s Move Ahead to make the Transmitter (Remote)

    + +

    img5

    + +

    The transmitter section consists of an accelerometer which detects the hand gestures and sends the data to the Arduino. This then sends the data to an Encoder IC which is subsequently transmitted to a receiver.

    + +

    The RF TX module works with 433MHz frequency and is easily available in the market at low cost.

    + +

    Wire it up as per the below circuit diagram:

    + +

    img6

    + +

    Code the Arduino to make it function like how you want it to.

    + +

    Motor Driver

    + +

    The motor driver is a device which gives the movement to do a task like a motor. So, we require motor driver to run them through the controller. The interface between motor & microcontroller can be done using an L293D motor driver IC in this circuit.

    + +

    img7

    + +

    Receiver circuit

    + +

    The receiver circuit consists of 2 IC’s (HT12D decoder, L293D motor driver) and an RF receiver module.

    + +

    Wire the circuit as per the above receiver schematic. There are 2 LED’s in the receiver board; one lights up when the power supply is given to the receiver and the other when power supply is given to the transmitter. The LED near the IC HT12D should light up when power is given at the transmitter, thus ensuring a valid transmission (VT). If it doesn’t, then there is something wrong with your connections or your RF-TX-RX module.

    + +

    img8

    + +

    The Final Working

    + +

    Accelerometer based gesture-controlled robot moves according to the movement of the hand, since the accelerometer is on your hand. When you tilt your hand forward (with the accelerometer on your hand), the robot moves straight ahead. When you tilt backwards, it changes direction and starts moving in reverse. When you tilt to the right, it starts moving rightwards and similarly to the left. (This is in accordance with what code I have written for the motion of my bot. You can modify accordingly!)

    + +

    Enjoy driving your robot!!!

    + +

    Note

    + +
    +

    -You can refer to the previous blog - How to get started with bots by -Tarun Mittal (dated June 1st ,2017) to get more insight into working of bots.

    +
    + +

    Some basic arduino tutorials :

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/getting-started-with-gui/index.html b/blog/getting-started-with-gui/index.html new file mode 100644 index 0000000..38b318b --- /dev/null +++ b/blog/getting-started-with-gui/index.html @@ -0,0 +1,578 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    While learning a programming language, there’s often a question of how simple problem solving using code is going to help us create software we see around us. The fact is that software engineering requires a lot more skills as a programmer. And a good first step to creating software is to learn how to create graphical user interfaces, commonly referred to as GUIs. In this article, we’ll learn how to get started with creating GUIs in C using a toolkit known as GTK+.

    + +

    What are GUIs?

    + +

    According to Wikipedia, the graphical user interface, is a type of user interface that allows users to interact with electronic devices through graphical icons and visual indicators such as secondary notation, instead of text-based user interfaces, typed command labels or text navigation. GUIs are one way to make programs interactive. Almost every program we use has a GUI. Having one makes a program easier to understand for users.

    + +

    Graphical User Interface (GUI) vs Command Line Interface (CLI)

    + +

    What are GUIs? : Graphical User Interface (GUI) vs Command Line Interface (CLI)

    + +

    Introduction to GTK+

    + +

    GTK+ or GIMP Toolkit is a toolkit for creating GUIs using widgets. Initially, development of GTK+ was started for use with the GIMP image manipulation program. Later, the toolkit was expanded for use with other software as well. It’s currently one of the best toolkits for creating GUIs in C. And since it’s free software, it can be freely used and softwares created using GTK+ can be freely distributed. GTK+ is based upon four libraries - GLib, Pango, Cairo and ATK. Each user interface created using GTK+ consists of widgets, since GTK+ is essentially a set of widgets.

    + +

    Getting Started with GTK+

    +

    Installing GTK+

    +

    Open up terminal and type the following command in. Enter your password when asked for.

    + +
    archit@archit-len-510s ~ $ sudo apt-get install build-essential libgtk-3-dev
    +
    + +

    Once you have these packages installed, it’s time to start coding and creating our first GTK+ application.

    + +

    Hello, world

    +

    We wish to create a simple program which opens up in a window, displays a button which says “Hello, world” and closes the window when clicked. +This we shall achieve using the given code.

    + +

    Open up a text-editor and copy the following code into it, and save it as helloworld.c.

    + +
    #include <gtk/gtk.h>
    +
    +static void print_hello (GtkWidget *widget, gpointer data)
    +{
    +  g_print ("Hello World\n");
    +}
    +
    +static void activate (GtkApplication *app, gpointer user_data)
    +{
    +  GtkWidget *window;
    +  GtkWidget *button;
    +  GtkWidget *button_box;
    +
    +  window = gtk_application_window_new (app);
    +  gtk_window_set_title (GTK_WINDOW (window), "Window");
    +  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    +
    +  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
    +  gtk_container_add (GTK_CONTAINER (window), button_box);
    +
    +  button = gtk_button_new_with_label ("Hello World");
    +  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
    +  g_signal_connect_swapped (button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
    +  gtk_container_add (GTK_CONTAINER (button_box), button);
    +
    +  gtk_widget_show_all (window);
    +}
    +
    +int main (int argc, char **argv)
    +{
    +  GtkApplication *app;
    +  int status;
    +
    +  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    +  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    +  status = g_application_run (G_APPLICATION (app), argc, argv);
    +  g_object_unref (app);
    +
    +  return status;
    +}
    +
    +

    Now, in order to compile the code, we need to tell the compiler where to find the GTK+ header files and libraries. This is done with the pkg-config utility.

    + +

    The following code demonstrates how pkg-config is used.

    + +
    archit@archit-len-510s ~ $ pkg-config --cflags gtk+-3.0 -pthread
    +-I/usr/include/gtk-3.0 -I/usr/lib64/gtk-3.0/include -I/usr/include/atk-1.0
    +-I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0
    +-I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2
    +-I/usr/include/libpng12
    +
    +archit@archit-len-510s ~ $ pkg-config --libs gtk+-3.0 -pthread -lgtk-3 -lgdk-3
    +-latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0
    +-lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0
    +-lgthread-2.0 -lrt -lglib-2.0     
    +
    +

    Now we are ready to compile our first program.

    +
    archit@archit-len-510s ~ $ gcc `pkg-config --cflags gtk+-3.0` -o
    +helloworld helloworld.c `pkg-config --libs gtk+-3.0`
    +
    + +

    Now the program can be run using the command,

    +
    archit@archit-lev-510s ~ $ ./helloworld
    +
    + +

    Understanding the program

    + +

    GTK+ uses layouts to store the UI elements. First we create a widget for window using gtk_application_window_new(app). Then in order to store the button, a button_box is used. GtkButtonBox is created for this purpose. This newly created button box is then added to the window widget. The button itself is then inialized using gtk_button_new_with_label() which returns a GtkButton to be stored inside button. Later button is added to button_box. Next we need to add functionality to close the app once the button is clicked. This is achieved using g_signal_connect() which is connected to button. After connecting print_hello(), another signal is connected to “clicked” state of the button. This calls the gtk_widget_destroy() and takes window as parameter. This destroys the window when the button is clicked. This completes the functionality we require for our simple applcation.

    + +

    GIMP

    + +

    Going Forward : GIMP - a popular Linux program made using GTK+

    + +

    Going Forward

    +

    We just created a simple program using GTK+. This has taught us how to respond to clicks and perform a function. And also that the basis for all UIs is a simple widget based structure. Understanding these two things can help us create usable programs. GTK+ is the toolkit used to code all of Ubuntu’s GUI and most programs used on Linux and Windows. Hence it’s capabilities shouldn’t be underestimated. Learning the toolkit, can equip us to create complex UIs such as those seen on popular applications.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/getting-to-love-the-terminal/index.html b/blog/getting-to-love-the-terminal/index.html new file mode 100644 index 0000000..4d4a5cd --- /dev/null +++ b/blog/getting-to-love-the-terminal/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    I Just Got Ubuntu!

    +

    But I’m not so sure about this command line

    + +

    Early days with the Unix command line interface, or the terminal (bash shell by default) can be pretty annoying and intimidating.

    + +

    But it doesn’t have to be. Getting to know the shell and writing shell scripts is exciting as well as extremely useful and something everyone should get familiar with. Once you get a hang of it you’ll start loving the flexibility Unix provides in no time. But I wont go into too much details about shell scripting here, I’ll leave resources at the end so you start learning on your own.

    + +

    In this post I’ll focus a bit more about making your life easier with a few tricks on the command line. +We’ll mainly talk about bash aliases and the .bashrc file.

    + +

    If you’re completely new to Unix then it might be a good idea to have a look at this book to get familiar with some basic commands and then come back here.

    + +

    Aliases

    + +

    Bash aliases are placeholders. You can think of them as shortcut commands for a longer command. They are extremely useful when you want to perform some operation that requires you to type a long command with a whole lot of options frequently.

    + +

    For e.g this line prints out all the hidden files and folders in the current directory.

    + +

    $ ls -A|grep '^\..*'

    + +

    Note: Whenever you see a $ in a line of code online, it is an indicator that it is a shell command and should not be typed in while you write the command in your terminal, i.e, you will only copy paste ls -A|grep '^\..*' into your terminal from above.

    + +

    The above command lists out all the files in the current directory, pipes the output to the grep command which then filters out only those files which have a . in the beginning. (Hidden files in begin with a . in Unix).

    + +

    Now what if you want to go to all your favourite folders and check all the hidden files there? You’ll have to navigate there and type out the whole command again. Of course, you can press the Up Arrow Key to access your command history and keep pressing it until you reach this command, but that can get pretty boring.

    + +

    There’s a better way.

    + +

    $ alias lhid='ls -A|grep '^\..*''

    + +

    Make sure there no whitespace around the ‘=’ sign. The shell is very particular about that.

    + +

    Now type lhid in your terminal and it should perform the same operation as the command we aliased it to.

    + +

    You can remove the alias by typing unalias lhid. We’ll not do that for now.

    + +

    Some other common aliases you would like to use can be

    + +
    alias ..="cd .."
    +alias ...="cd ../.."
    +alias myfolder="cd path/to/my/folder"
    +
    + +

    You can now just use the placeholders instead of the entire command. I use a lot of aliases to cd into my frequent folders and it really saves a lot of time and a lot of typing.

    + +

    But there’s a catch. These placeholders we created are available only inside the current shell. Open up a new terminal and type lhid and it will tell you that the command was not found. This is because the variables you create in a shell are local to that shell only.

    + +

    .bashrc

    + +

    Thankfully there’s the .bashrc file. This is the file that is run every time you fire up a new terminal. So all we need to do is add our aliases at the end of our .bashrc file and they’ll be loaded every time we open a new terminal.

    + +

    The .bashrc file exists in your home directory. Open it with any editor. I’ll use nano here, you can use vi or gedit or any editor you wish.

    + +

    $ nano ~/.bashrc

    + +

    Note: The ~ is a placeholder for the user’s home directory.

    + +

    Now move all the way down to the bottom of the file and add the following lines there.

    + +
    alias lhid='ls -A|grep '^\..*''
    +alias ..="cd .."
    +alias ...="cd ../.."
    +alias myfolder="cd path/to/my/folder"
    +
    +
    + +

    Save the file and exit (Ctrl X + Y in nano).

    + +

    Now open up a new terminal and try using those aliases and you’ll see that it works like a charm! This is because those commands in the .bashrc file are run every time you open a new terminal.

    + +

    You can notice that the terminal opens up in your home directory by default. Changing this is simple.

    + +

    Open the .bashrc file and at the end add the line cd path/to/my/directory. For e.g if you want every new terminal to open up the Downloads folder just add the line cd ~/Downloads at the end and that’s it!

    + +

    And with just a few simple commands you’ve already made your life so much more easier on the terminal!

    + +

    Resources:

    + +

    Basic Unix commands

    + +

    Bash Scripting Guide

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/google-image-search-grid/index.html b/blog/google-image-search-grid/index.html new file mode 100644 index 0000000..844c14b --- /dev/null +++ b/blog/google-image-search-grid/index.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Implementing Google Image Search Style Grid

    + +

    I love design principles of Google. The way they present things is really awesome. One such presentation is Google Image Search.

    + +

    Google Image Search

    + +

    Look at the way they arrange images. Each row has a fixed width, but their are no columns. The images have arranges themselves, intelligently, just enough to fit the row. I always wondered, what algorithm they must have used to achieve this.

    + +

    What I thought

    + +

    So my search began. Initially I thought they might have used some kind of knapsack algorithm to fit images to the row width. It means rearragning the positions of images, shifting them from one row to another. But if you inspect, the images don’t change their positions, yet they can fit in the row, amazing!

    + +

    I searched the internet to find whats behind the amazing grid. It turns out that, the technique which is used is far simpler than knapsack and yet brilliant. So, here I present you a really simple technique to achive the Google Image Search style grid

    + +

    NOTE: This post does not provide any ‘ready to copy+paste’ code. I will only provide pseudo code, you are free to implement it in any language you prefer.

    + +

    Initial intuition

    + +

    If we look closely, we can see that the images in a row have equal height. Also, the heights of rows are not same. So the first intuition is to make the heights of images equal. Lets say we have list of images which stores height and width of each image.

    + +
    Set CONST_HEIGHT := 160
    +For each image in images:
    +	Resize image to height CONST_HEIGHT, constraint ratio
    +
    + +

    Building a Row

    + +

    So now that we have normalized the image heights, let’s build a row. First we’ll have a look at the pseudo code, explanation is on the way…

    + +
    /**
    + * Procedure to build a single row
    + * parameter: images - list of images
    + * returns: row - list of images in the built row
    + */
    +BUILD_ROW(images):
    +	SET row_width := 0
    +	Initialize row_list
    +	While row_width < MAX_WIDTH AND images.size > 0:
    +		Dequeue an image from images
    +		Append image to row_list
    +		row_width := row_width + image.width
    +	If row_width > MAX_WIDTH:
    +		Create new image row_image, with height = CONST_HEIGHT and width = row_width
    +		Resize row_image to width MAX_WIDTH, constraint ratio
    +		For each image in row_list:
    +			Resize image to height row_image.height, constraint ratio
    +	return row_list
    +
    + +

    So let’s see whats happening here. First we intialized row_list which stores the images in that particular row, and a variable row_width which will store the total width of the row. +Now we keep adding images to row from original list until the row_width exceeds the MAX_WIDTH, which is maximum width of the screen. Now we have a row which looks something like this.

    + +

    Row

    + +

    Now comes the trick. We won’t try to fit the images in row, instead we will try to fit our created row in the maximum width of the screen. So we create an dummy row_image, which represents the entire row, with height equal to CONST_HEIGHT and width equal to row_width. Now we resize the row_image to width equal to MAX_WIDTH and then we resize all the images in row_list to height equal to the new height of row_image. +Here’s a depiction of the process…

    + +

    Resized Row

    + +

    Building the Grid

    + +

    Now that we know how to build a row, building the grid is easy.

    + +
    /**
    + * Procedure to build the grid
    + * parameter: images - list of images
    + * returns: grid - list of rows
    + */
    +BUILD_GRID(images):
    +	Initialize grid
    +	While images.size > 0:
    +		SET row := BUILD_ROW(images)
    +		Append row to grid
    +	return grid
    +
    + +

    Nice, we just made a Google Image Search style grid, where images fit in a row, intelligently.

    + +

    There’s more

    + +

    Hold on, there’s little more. While resizing the images, due to floating point divisions and floor operations, we lose some units in the row. If we neglect them, the rows won’t have equal widths. To overcome this, we just need to know the units we have lost and divide them equally among the images.

    + +
    BUILD_ROW(images):
    +	...
    +	// After resizing the images
    +	// Calculate width of resized row
    +	SET row_width := 0
    +	For each image in row_list:
    +		row_width := row_widt-h + image.width
    +	// Calculate the lost units
    +	SET delta := MAX_WIDTH - row_width
    +	// Divide the lost units among the images
    +	While delta > 0:
    +		For each image in row_list:
    +			image.width := image.width + 1
    +			delta := delta - 1
    +	return row_list
    +
    + +

    You might be thinking that, aren’t we changing image aspect ratio here? Yes, but one can lose a single unit in a single division. So the maximum number of lost units is equal to number of images in row. So width of each image will be increased by atmost one, which isn’t a big deal. Also you can center crop the images, so that there isn’t any empty space left out.

    + +

    Go ahead, try implementing it in your next web or mobile app. If you find any issues, you can always mail me…

    + +

    That’s it guys, until then, +This is hrily signing of…

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/gramophone-gaana/index.html b/blog/gramophone-gaana/index.html new file mode 100644 index 0000000..22cf5b4 --- /dev/null +++ b/blog/gramophone-gaana/index.html @@ -0,0 +1,542 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    image-3

    + +

    Music. Who doesn’t love music? Hanging around with headphones on, +earphones hooked to the ears and people travelling with volume up is +common these days, but these audio devices weren’t a fashion before 20 +years. You might have heard your parents instinctively say “Hey, change +the plate” when they don’t seem to like the song you are playing only to +realize in a moment that it can be done with a single touch. Yes, they +were referring to a gramophone when they said ‘plate’ which you might +have seen in old movies. The sensation it created in the 20th century +and its resurgence in recent times after being replaced by digital +techniques makes the study of these outdated audio devices interesting.

    + +

    The Basic Idea

    + +

    image-1 +image-2

    + +

    Sound is nothing but disturbance they create in the +travelling medium. The basic idea of the early record players is to +store these disturbances mechanically and use them to reproduce the +sound on a later date. First ever gramophone invented by Thomas Edison +stored these disturbances in a wooden cylinder wrapped with metal foil +by the means of tiny grooves whose depth varied in accordance with the +loudness of sound. While reproducing the sound a lightweight mechanical +bar like structure traverses over the grooves to produce small +vibrations which was amplified by a horn.

    + +

    Parts of a Gramophone

    + +

    Later these cylinders were replaced with flat +vinyl discs, also called as ‘plates’ to make it compact and the +gramophone evolved to take the name of record player. A turnable, stylus +and a tonearm make up the skeleton of a typical record player. As its +name gives out the clue, turnable is responsible for rotating the vinyl +discs at a desired speed and the tonearm is the bar which terminates +with stylus and picks up the microscopic vibrations. Stylus is a needle +like structure, made with hard substance like diamond which is in +contact with the grooves of vinyl disc.

    + +

    Working

    + +

    While recording the sound, stylus is placed on the inner end of +the vinyl disc. Sound waves are directed to the tonearm and +simultaneously disk is rotated. The radius of the position of the stylus +is gradually increased so as to fill the entire disc with grooves +representing the sound. While reproducing the recorded sound, the stylus +is placed on the disc at the position corresponding to our desired start +of the sound and rotated with the same speed. The tonearm vibrates due +to varying depth of grooves and the vibration of the tonearm is +amplified by the horn to produce desired loudness. The original disc is +pressed against an empty disc to create a master copy (negative) making +it favorable for mass production.

    + +

    Conclusion

    + +

    Though these devices are bulky and have many limitations of +their own over digital, the reason they are making a sudden revival in +recent times is due to their openness of sound allowing more features of +music to be heard. The regaining popularity of the device among the +musical community is reflected by the drastic increase in the sales of +vinyl.

    + +

    Sources

    + +

    How Do Gramophones Work? : Techwalla

    + +

    How record players and gramophones work - Explain that Stuff

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/graphene/index.html b/blog/graphene/index.html new file mode 100644 index 0000000..69b3638 --- /dev/null +++ b/blog/graphene/index.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    GRAPHENE – A WONDER MATERIAL

    + +

    “I have never even heard of this term graphene before”, might be your thought process presently. Read further to understand why I call it a wonder material. +What’s running in your mind at this point of time due to similarity in what you have studied is Graphite, an allotrope of Carbon which is very commonly found. But, what’s Graphene then? +Yes, graphite and graphene are in fact the same except for a few structural differences which brings in unexpected properties. +Graphite consists of various layers of Carbon atoms where each layer is arranged in a honeycomb lattice and the layers are held together by weak force, van der Waals’ forces. We all know that Graphite is the most stable form of carbon. (Diamond is not the most stable even though it very hard). So graphene is mono-layered graphite. If you have ever drawn with a sharp pencil, you have probably manufactured grapheme in a very crude way. This is the world’s thinnest material and what made researchers work in this area is due to the extra ordinary properties graphene possesses.

    + +

    1

    + +

    History:

    +

    Graphene revolution was started in October 2004, when condensed-matter physicists reported that they had prepared graphene—two-dimensional sheets of carbon atoms—and observed the electric field effect in their samples1. It was not long before this new material attracted the attention of the electron-device community, and today a growing number of groups around the globe are successfully fabricating graphene transistors.

    + +

    General Properties

    + +

    Excellent mobility +Many methods to open up a band-gap as graphene in its large-area form has zero band gap and behaves as a semi-metal. By constraining large-area graphene in one dimension or biasing bilayer graphene or even by applying strain. +Possibility to make large-area transistors and fabricating nano-ribbons with well-defined widths and clean edges

    + +

    Mechanical Properties

    + +

    Graphene’s stand-out properties is its inherent strength. Due to the strength of its 0.142 Nm-long carbon bonds, graphene is the strongest material ever discovered, with an ultimate tensile strength of 130,000,000,000 Pascals (or 130 gigapascals), compared to 400,000,000 for A36 structural steel, or 375,700,000 for Aramid (Kevlar). Not only is graphene extraordinarily strong, it is also very light at 0.77milligrams per square metre (for comparison purposes, 1 square metre of paper is roughly 1000 times heavier). It is often said that a single sheet of graphene (being only 1 atom thick), sufficient in size enough to cover a whole football field, would weigh under 1 single gram. What makes this particularly special is that graphene also contains elastic properties, being able to retain its initial size after strain.

    + +

    APPLICATIONS

    +

    Graphene in Transistors:

    + +

    2

    + +

    Various configurations of Transistors using Graphene to increase mobility of charge carriers in channel since graphene has offers higher mobility compared to just Si. (Red region represents Graphene material in all the above structures)

    + +

    3

    + +

    Scaling down in transistor size and increase in number of transistors per chip over time. + Source: Review Article on Graphene Transistors by Nature Nano Technology

    + +

    Graphene for desalination purposes:

    +

    Research in this direction will aid in solving the water crises in places where people are suffering from water shortage. Researchers have invented a graphene sieve capable of desalinating sea water where the graphene sheath acts as a semi permeable membrane. This in turn aids in separating water from the dissolved salts. But, we do not want all the salts in water to be separated, so regulation of the size of pores in the graphene material is very necessary and a critical step in this process. Passing through multiple layers of graphene may also be considered an alternative for effective desalination.

    + +

    4

    + +

    Graphene has so many interesting properties and applications. If you are interested, go through them from any online source. I don’t want to make this article boring by including every possible detail. :P

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/gulpfile.js b/blog/gulpfile.js new file mode 100644 index 0000000..82af557 --- /dev/null +++ b/blog/gulpfile.js @@ -0,0 +1,98 @@ +var gulp = require('gulp'), + plumber = require('gulp-plumber'), + browserSync = require('browser-sync'), + stylus = require('gulp-stylus'), + uglify = require('gulp-uglify'), + concat = require('gulp-concat'), + jeet = require('jeet'), + rupture = require('rupture'), + koutoSwiss = require('kouto-swiss'), + prefixer = require('autoprefixer-stylus'), + imagemin = require('gulp-imagemin'), + cp = require('child_process'); + +var messages = { + jekyllBuild: 'Running: $ jekyll build' +}; + +var jekyllCommand = (/^win/.test(process.platform)) ? 'jekyll.bat' : 'jekyll'; + +/** + * Build the Jekyll Site + */ +gulp.task('jekyll-build', function (done) { + browserSync.notify(messages.jekyllBuild); + return cp.spawn(jekyllCommand, ['build'], {stdio: 'inherit'}) + .on('close', done); +}); + +/** + * Rebuild Jekyll & do page reload + */ +gulp.task('jekyll-rebuild', ['jekyll-build'], function () { + browserSync.reload(); +}); + +/** + * Wait for jekyll-build, then launch the Server + */ +gulp.task('browser-sync', ['jekyll-build'], function() { + browserSync({ + server: { + baseDir: '_site' + } + }); +}); + +/** + * Stylus task + */ +gulp.task('stylus', function(){ + gulp.src('src/styl/main.styl') + .pipe(plumber()) + .pipe(stylus({ + use:[koutoSwiss(), prefixer(), jeet(),rupture()], + compress: true + })) + .pipe(gulp.dest('_site/assets/css/')) + .pipe(browserSync.reload({stream:true})) + .pipe(gulp.dest('assets/css')) +}); + +/** + * Javascript Task + */ +gulp.task('js', function(){ + return gulp.src('src/js/**/*.js') + .pipe(plumber()) + .pipe(concat('main.js')) + .pipe(uglify()) + .pipe(gulp.dest('assets/js/')) +}); + +/** + * Imagemin Task + */ +gulp.task('imagemin', function() { + return gulp.src('src/img/**/*.{jpg,png,gif}') + .pipe(plumber()) + .pipe(imagemin({ optimizationLevel: 3, progressive: true, interlaced: true })) + .pipe(gulp.dest('assets/img/')); +}); + +/** + * Watch stylus files for changes & recompile + * Watch html/md files, run jekyll & reload BrowserSync + */ +gulp.task('watch', function () { + gulp.watch('src/styl/**/*.styl', ['stylus']); + gulp.watch('src/js/**/*.js', ['js']); + gulp.watch('src/img/**/*.{jpg,png,gif}', ['imagemin']); + gulp.watch(['*.html', '_includes/*.html', '_layouts/*.html', '_posts/*'], ['jekyll-rebuild']); +}); + +/** + * Default task, running just `gulp` will compile the sass, + * compile the jekyll site, launch BrowserSync & watch files. + */ +gulp.task('default', ['js', 'stylus', 'browser-sync', 'watch']); diff --git a/blog/hashing-in-competitive-programming/index.html b/blog/hashing-in-competitive-programming/index.html new file mode 100644 index 0000000..5b56350 --- /dev/null +++ b/blog/hashing-in-competitive-programming/index.html @@ -0,0 +1,538 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    +

    At it’s most basic hashing is a technique to identify a particular value of a certain type among other values of the same type. To achieve this we typically make use of a hash function: a function that takes a value of the required type as input and generates a “key” that (hopefully) can uniquely identify this value. In this article we’ll look at how this function works, how it’s implemented in C++, and how to apply hashing to solve a Competitive Programming problem.

    + +

    Hashing in C++

    +

    C++ offers 2 containers in C++ that are often useful for hashing problems: map and unordered map. Both containers store elements in a “mapped fashion”: we associate a key value to a mapped value, typically (but not necessarily) of a different data type. Out of these two the unordered map is the one that is typically implemented using a traditional hash function whereas the map represents a balanced binary search tree.

    + +

    $std::map$

    +
    1. Implemented with red-black tree.
    +2. Elements are sorted.
    +3. Small memory usage.
    +4. O(log N) lookup time.
    +
    + +

    $std::unordered$_$map$

    +
    1. Implemented with a hash function
    +2. Elements are not sorted.
    +3. Requires additional memory to keep the hash-table.
    +4. Lookup is usually O(1), dependent on hash function.
    +
    + +

    Why use $std::map$ over $std::unordered$_$map$?

    +

    A quick look at the comparison between the two containers gives us the impression that we should use $std::unordered$_$map$ in most cases (except those where we require a sorted traversal through all keys), and we would be right to do so normally. After all, $O(1)$ lookup and insertion is a lot more appealing than the $O(log N)$ operations of $std::map$. However, there are a few things to keep in mind. Namely that the worst-case runtime of unordered_map is $O(N)$ not $O(1)$. This is because of how it is implemented. As we’ll see later, hash functions have a chance of “colliding”; that is, two distinct inputs to the hash function give the same output. This causes the unordered_map to store the associated values corresponding to these colliding keys in a list. In the worst case, when all keys collide, the lookup time for each key is $O(N)$.

    + +

    For more:Reference 1 +Reference 2

    + +

    A hash function

    +

    Let’s look at the case where we need to map a string to an integer: we need to take care of the distinct characters present in the string as well as their position in the string. A common strategy is to take the ASCII value of each character and multiply it by a prime p to the power of the index of the character. In order to ensure it fits in a C++ variable we typically take the hash mod a large prime M.

    + +

    \begin{equation} +F(R) = hash(S[0,R]) = (\sum_{i=0}^{R}S_i * p^i)\% MOD +\end{equation}

    + +

    Looking at a problem

    +

    Let’s try and apply the hashing technique to a competitive programming problem +here. +We are given a graph with a list of edges from $1 … M$. +The queries are of the form $[L, R]$. +For each query we look at the graph containing all the edges numbered from L to R. +We need to determine whether all the connected components of such a graph have Euler cycles. +The answer will then be “YES” if all vertex degrees are even, and “NO” otherwise. +A naïve solution would be to store the parity of each vertex of the graph for all edges from $1 … X$, for all $X$ from $1$ to $M$. +Using these prefix parity values we can say the answer for a range L to R is “YES” when $pref[R] = pref[L-1]$ and “NO” otherwise. +Memory use here is $O(N^2)$ and query time is $O(N)$. +This can be improved by storing each prefix parity value as a hash. +In the above expression $S_i = 0$ if degree of $i^{th}$ vertex is even and 1 otherwise. +This reduces memory use to $O(N)$ and query time to $O(1)$.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/heap_exploitation/index.html b/blog/heap_exploitation/index.html new file mode 100644 index 0000000..ad2212e --- /dev/null +++ b/blog/heap_exploitation/index.html @@ -0,0 +1,609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    At the physical level, computer memory consists of a large number of flip flops. Each flip flop consists of a few transistors, and is capable of storing one bit. Individual flip flops are addressable by a unique identifier, so we can read and overwrite them. Thus, conceptually, we can think of all of our computer’s memory as just one giant array of bits that we can read and write.

    + +

    Since as humans, we are not that good at doing all of our thinking and arithmetic in bits, we group them into larger groups, which together can be used to represent numbers. 8 bits are called 1 byte; beyond bytes, there are words (which are sometimes 16, sometimes 32 bits). Thus, more often, we conceptually regard our computer’s memory as one large (size 232 or so) array of bytes.

    + +

    What is the Heap and How Big is it?

    +

    When you compile a program, you’re generating an executable called a program. A program is said to be ‘executing’ when it has been loaded into main memory and has different resources allocated to it. When a process is under execution, it has its own address space that looks something like this: +haha +A heap is a part of this address space.

    + +

    The heap is part of the process memory and it does not have a fixed size. Heap memory allocation is performed by the C library when you call malloc (calloc, realloc) and free. This means that the program can ‘request’ and ‘release’ memory from the heap segment whenever it requires. Also, this memory is global, i.e. it can be accessed and modified from anywhere within a program and is not localized to the function where it is allocated. This is accomplished using ‘pointers’ to reference dynamically allocated memory which in turn leads to a small degradation in performance as compared to using local variables (on the stack).

    + +

    Memory in the heap is allocated in ‘chunks’. The structure of a chunk is something like this:

    + +
    Allocated chunk:
    +
    +chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Size of previous chunk, if unallocated (P clear)  |
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Size of chunk, in bytes                     |A|M|P|
    +      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             User data starts here...                          .
    +            .                                                               .
    +            .             (malloc_usable_size() bytes)                      .
    +            .                                                               |
    +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             (size of chunk, but used for application data)    |
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Size of next chunk, in bytes                |A|0|1|
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +
    +
    +
    +Free chunk:
    +
    +
    +chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Size of previous chunk, if unallocated (P clear)  |
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +    'head:' |             Size of chunk, in bytes                     |A|0|P|
    +      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Forward pointer to next chunk in list             |
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Back pointer to previous chunk in list            |
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Unused space (may be 0 bytes long)                .
    +            .                                                               .
    +            .                                                               |
    +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +    'foot:' |             Size of chunk, in bytes                           |
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +            |             Size of next chunk, in bytes                |A|0|0|
    +            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +
    +
    + +

    A bin is list (singly or doubly linked list) of free chunks. They’re categorized based on the size of chunks they can hold.

    + +

    Exploiting the Heap

    + +

    Double Free ()

    +

    Freeing a resource more than once can lead to a memory leak. The data structure implemented by the allocator gets corrupter and can be exploited by the attacker. Since glibc has a protective measure against the double free() exploitation, we will free another chunk it between. By doing so, we can return the same chunk by two different malloc()s. If the attacker is in control of one of the pointers, they can modify the memory leading to different attacks, including injecting the address of a malicious program which could be executed.

    + +

    Consider the following code:

    + +
    a = malloc(10); //0xb16010
    +
    +b = malloc(10); //0xb16030
    +
    +c = malloc(10); //0xb16060
    +
    +free(a);
    +free(b); //To circumvent glibc's check
    +free(a); // DOUBLE FREE!
    +
    +x = malloc(10); //0xb16010
    +
    +e = malloc(10); //0xb16030
    +
    +z = malloc(10); //0xb16010 - Same address as 'x' !
    +
    + +

    How did that happen?

    + +

    The state of the bin through the code:

    +
      +
    1. ‘a’ freed: +
      +

      head -> a -> tail

      +
      +
    2. +
    3. ‘b’ freed: +
      +

      head -> b -> a -> tail

      +
      +
    4. +
    5. ‘a’ freed: +
      +

      head -> a -> b -> a -> tail

      +
      +
    6. +
    7. malloc() request for ‘x’ +
      +

      head -> b -> a -> tail

      +
      +
    8. +
    9. malloc() request for ‘y’ +
      +

      head -> a -> tail

      +
      +
    10. +
    11. malloc() request for ‘z’ +
      +

      head -> tail

      +
      +
    12. +
    + +

    Now that ‘x’ and ‘y’ point to the same memory location, any change in one will reflect in the other. +Note: This exploitation only works when the size of the chunks allocated are in the fastbin list.

    + +

    This was an extremely simple exploitation of the heap but you can read up on some of the more sophisticated ones:

    +
      +
    1. House of Spirit
    2. +
    3. House of Einherjar
    4. +
    + +

    Resources

    + +
      +
    1. Understanding the heap by breaking it
    2. +
    3. Heap exploitation
    4. +
    5. Systems Programming
    6. +
    7. A Step Ahead in Reverse Engineering!
    8. +
    9. Your first heap exploit by GaTech
    10. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/hello-world/index.html b/blog/hello-world/index.html new file mode 100644 index 0000000..48bf518 --- /dev/null +++ b/blog/hello-world/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A dissection of the hello world C program

    + +

    DISCLAMER: The contents on this page are strictly R rated. With R standing for Rigorous material. This is not a beginner’s guide to C. This is more of an article for intermediate/advanced users to explore C, in depth. I am not responsible for any earthquakes, alien invasions or epidemics caused, directly/indirectly from this material.

    + +

    Given below is a typical C program taught in most of the textbooks.

    + +
    #include <stdio.h> // An include statement: Preprocessor Directive
    +
    +void main() // An entry function
    +{
    +    printf("Hello world\n"); 
    +}
    +
    + +

    The entire post does not even begin to comprehend the amount of work put in ,just to run a simple hello world program. To compile and run this program, a lot of juggling is done by gcc and the operating system. Of course, the standard books and online resources will tell you about how the program works, what each line is, and the technical jargon associated with them, but that is not why we are here today. Let us explore the bland hello world program and work out it’s internals. I am pretty sure this will be a worthwhile trip. So hold on tight!

    + +

    (Trivia: The first Hello world was written in the BCPL language and was used during the development of the C compiler, by Dennis Ritchie. Since then, the hello world program was deified by all the computer enthusiasts.)

    + +

    Just to recap, here are the fundamental elements of the program:

    + +
      +
    1. ` #include ` is a preprocessor directive.
    2. +
    3. void is a data type.
    4. +
    5. main() is the entry point of the program.
    6. +
    7. printf() is a C function that is used to print formatted (printf - print format) strings.
    8. +
    + +

    Introduction

    + +

    Let us start unravelling some of the complexities of the example program.

    + +

    Preprocessor directives

    + +

    The first step performed by the gcc compiler is to preprocess the source file. The compilation begins after the preprocessing is complete and there are no errors. The preprocessor directives are commands that gcc understands, and start with the symbol #. #include is a preprocessor directive that tells the compiler to include the contents of a file and paste it in place of the directive.

    + +

    For example: +#include <stdio.h>

    + +

    is replaced by

    + +
    # 1 "temp.c"
    +# 1 "<built-in>"
    +# 1 "<command-line>"
    +# 31 "<command-line>"
    +# 1 "/usr/include/stdc-predef.h" 1 3 4
    +# 32 "<command-line>" 2
    +# 1 "temp.c"
    +# 1 "/usr/include/stdio.h" 1 3 4
    +# 28 "/usr/include/stdio.h" 3 4
    +# 1 "/usr/include/bits/libc-header-start.h" 1 3 4
    +# 33 "/usr/include/bits/libc-header-start.h" 3 4
    +# 1 "/usr/include/features.h" 1 3 4
    +# 410 "/usr/include/features.h" 3 4
    +# 1 "/usr/include/sys/cdefs.h" 1 3 4
    +# 441 "/usr/include/sys/cdefs.h" 3 4
    +# 1 "/usr/include/bits/wordsize.h" 1 3 4
    +# 442 "/usr/include/sys/cdefs.h" 2 3 4
    +...
    +
    +extern int fprintf (FILE *__restrict __stream,
    +      const char *__restrict __format, ...);
    +
    +extern int printf (const char *__restrict __format, ...);
    +
    +extern int sprintf (char *__restrict __s,
    +      const char *__restrict __format, ...) __attribute__ ((__nothrow__));
    +
    +...
    +
    +
    +
    +

    Pro Tip: Save a C file with just “#include <stdio.h>” in it. Then run `gcc -c -i <file.c> -o <file.i> to see the actual preprocessing in action. GCC’s -E flag, outputs the file after performing the preprocessing. Internally, during compilation, it stores it as .i file which is later used as the input for the compiler.

    +
    + +

    The preprocessing and compilation, both of them are done by the same program: cc1. The cc1 executable is a part of the gcc suite of programs. But, hang on! What is this <stdio.h>? Angle brackets(yeah, that is what <> are actually called. Not less/greater than symbols) tells the preprocessor that the file inside is present in the standard library path. It is usually defined in an environment variable called C_INCLUDE_PATH. You can also add directories to search for headers with the -I flag in gcc. (Example: gcc -I foo/bar <file>.c will make gcc search for .h files in foo/bar/ directory first, and then the remaining directories in C_INCLUDE_PATH). For shorthand purposes, you can write #include "foo.h" if you want gcc to add foo.h from the current directory.

    + +

    We also see that printf is actually defined here. Which is why, folks! you get warnings if you use printf without including the library. But, hold on. Where is the implementation of the printf? To answer the question, please buy the full version here.

    + +

    Compilation

    + +

    The preprocessed file is then parsed and compiled by the cc1 executable. The source code is then transformed from the C code to assembly code. All the basic data types like the void, int, char *, etc are validated by the compiler. Also, syntax checking happens here. If you enable all warnings (with gcc -Wall: Warnings-all), any compile time errors are detected here and thrown out to the user. It also checks variable usage, references and loop invariant checks too. The entire compilation consists of generating an Abstract Syntax Tree (AST), and then converting it into a GENERIC format(literally). GENERIC trees are then gimplified by a gimplifier also called gimplication into GIMPLE format (Gimply, mind blowing). Then a tree SSA pass is performed. This pass performs several optimizations like:

    + +
      +
    1. Remove useless statements
    2. +
    3. Building the control flow graph
    4. +
    5. Find all referenced variables
    6. +
    7. Warn for unintialized variables
    8. +
    9. Dead code elimination
    10. +
    11. Dominator optimizations
    12. +
    13. Forward propogation of single variables
    14. +
    15. Loop optimizations
    16. +
    + +


    + and many more optimizations, each of which deserve a 15 hour course in it’s entirety. (Nope, I am not going to explain them here)

    + +
    	.file	"temp.c"
    +	.section	.rodata
    +.LC0:
    +	.string	"Hello World"
    +	.text
    +	.globl	main
    +	.type	main, @function
    +main:
    +.LFB0:
    +	.cfi_startproc
    +	pushq	%rbp
    +	.cfi_def_cfa_offset 16
    +	.cfi_offset 6, -16
    +	movq	%rsp, %rbp
    +	.cfi_def_cfa_register 6
    +	movl	$.LC0, %edi
    +	call	puts
    +	nop
    +	popq	%rbp
    +	.cfi_def_cfa 7, 8
    +	ret
    +	.cfi_endproc
    +.LFE0:
    +	.size	main, .-main
    +	.ident	"GCC: (GNU) 6.3.1 20170306"
    +	.section	.note.GNU-stack,"",@progbits
    +
    +
    +

    Pro Tip: Use the source code shown above. Compile it with gcc -S <file>.c. This makes gcc to output the file after preprocessing and compiling and stops further processing of the file.

    +
    + +

    Don’t worry, compilation is almost over. A step called RTL pass is performed at the end of this phase, which does some cleanup and the final assembly code is ready.

    + +

    Assembling

    + +

    The assembling is done by the executable called as which is a part of the binutils package. This program is responsible for converting the generic assembly code into a code that is understood by the local machine. Also, ever wondered why all the C programs always start with main?

    + +

    As a reward for reading the article so much, here is a nice way to write a C program without main. (WHAT?? Yes, it is possible)

    + +
    #include <stdio.h> // for our beloved printf()
    +#include <stdlib.h> // for our beloved exit()
    +
    +
    +void _start()
    +{
    +    printf("Hello world\n");
    +    exit(0);
    +}
    +
    + +
    +

    Compile it with gcc -nostartfiles <file>.c and run ./a.out

    +
    + +

    The _start program calls main internally and that my dear friend, is why C programs always begin with main.

    + +

    The assembly code generated has extra elements that take care of the arguments passed to the program, the environment is setup and hard-wired to start main (or whatever entry function, if you read the article in the right order) after performing some checks. Exception handling is also done by this program. Ever wondered why only C compiled programs give segmentation fault (core dumped) errors? Wait a minute, I did not write any exception handling code. That’s right. GCC adds boilerplate code that automatically terminates the program when wrong addresses are accessed and immediately packs it’s stuff up, prepares a dump of the core and terminates the program.

    + +

    The assembler creates an object file (.o). You can make gcc stop at this stage, by running gcc -c <file>.c. This is usually done in large projects. Multiple .c object files are created. Then they are linked together by the linker into one giant executable by the linker.

    + +

    Linking

    + +

    One more question, that has not been answered by our dissection so far is: Where is the implementation of printf? How come I can’t see the implementation of printf?

    + +

    This is done in the final phase. A basic set of shared libraries called libc, linux-vdso and ld-linux-x86-64 are attached to any basic C program. During assembly, dangling references are made to functions. Kind of like,

    + +
    +

    User: hey computer, use printf here and here

    +
    + +
    +

    Computer: But I don’t know what printf is. ERR..

    +
    + +
    +

    User: wait, don’t throw an error. I will tell you where it is, later. Just assume it is defined for now.

    +
    + +
    +

    Computer: RRMM, oh. Okay.

    +
    + +

    The linker now points to all the dangling functions from these shared libraries. The linker fixes all references to functions. The linker is actually a program called ld, another member of the gcc core team.

    + +

    NOTE:

    +

    Shared libraries are C programs, that are compiled before hand and can be attached to any program. There are two kinds of libraries:

    + +

    1.Static libraries
    +2.Dynamic libraries

    + +

    Nothing to be worried about. You have used both of these kinds of libraries. You just don’t recognize them. Remember compiling C programs with the -lm option to enable math operations (Other examples are -lpthread, -fopenmp,etc), these are shared objects attached to the program. Shared libraries are .so files which are compiled in advance. This is usually done, in order to save memory. For example, if 20 processes are using the math library, then it is a wiser choice to seperate all the math code and leave references to it. During runtime, the process finds the required shared library in memory and resolves all the addresses.

    + +

    The naming convention for shared libraries is somewhat peculiar. If the file is called libxyz.so, it has to be linked with -lxyz and vice versa.

    + +

    Static libraries are just, well static. They are code, that linked during compile time. They are usually .a (archive) files. One can make dynamic libraries be attached statically into the executable by using gcc -static <file>.c -lm. [Notice the drastic increase in size of the executable output]. You can find out what are the libraries dependent on the executable by running ldd <executable>. You can also make the linker look for addition object files in other directories by using the -L flag in gcc. (Example: gcc -Lsome_dir/ foo.o bar.o where bar.o is in some_dir/)

    + +

    I hope by now, you are clear on why using printf throws a compiler warning but works anyhow.

    + +

    Conclusion

    + +

    That’s it folks. The C program is now ready to do your bidding. I am sure, next time someone says a “Hello world” program is easy, you can blow their brains out. Also, the programming languages evolve in a very fascinating way. For example, the token parsing program of the C code is written in C++. But C++ was written in C. This continues backwards until Dennis Ritchie first wrote C using assembly. Later C was rewritten using C. This is sometimes referred to as bootstrapping. Loading oneself using oneself. On a similar note, I hope this article stimulates the readers to read more :)

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/high-lift-devices/index.html b/blog/high-lift-devices/index.html new file mode 100644 index 0000000..acfc96b --- /dev/null +++ b/blog/high-lift-devices/index.html @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Ever wondered why exactly are high lift devices needed? Let me tell you…

    + +

    Lift generated by wings of an aircraft is estimated by the following relationship,

    + +

    \begin{equation} +L = \frac{1}{2}\rho v^2 A C_L +\end{equation}

    + +

    Where:

    + +

    $L$ = lift force generated

    + +

    $\rho$ = air density

    + +

    $v$ = true air speed

    + +

    $A$ = lifting area of the wing

    + +

    $C_L$ = coefficient of lift

    + +

    Clearly, same amount of lift can be generated by various permutations and combinations of $\rho$, $v$, $A$ and $C_L$.

    + +

    Now, let us think about situations when $v$ is quite less, take-off or landing for instance, that the lift generated cannot balance the total weight of the flight. +At such situations, we need to alter the other three factors in order to make the aircraft fly. +$\rho$ is something that is quite out of our control. +Hence, we need to do something which increases the other two factors. Here is where high lift devices come into the play.

    + +

    Knowing CL

    + +

    One should know how $C_L$ behaves, before one can commend the work done by the high lift devices. +Airfoils are of various types. +One of the basic types of differentiating them is into symmetrical and cambered airfoils.

    + +

    Types of Airfoils

    + +

    The above figure represents the difference between symmetrical and cambered airfoils schematically. +Let us look what effect cambering has on the lift of an airfoil.

    + +

    Effects of cambering on Lift

    + +

    It can be seen that having a camber in the airfoil increases the highest attainable lift coefficient. +However, there is a decrease in the critical angle of attack, which is the highest angle of attack that can be deployed without letting the airfoil to stall.

    + +

    What is this stall then?

    + +

    Air does have certain viscosity and it does develop a boundary layer. +Thus, the molecules in the boundary layer experience viscous forces against each other. +In addition to this, they might also have to face adverse pressure gradients along their way ahead along the boundary layer. +Hence, the molecules which become devoid of energy while they try to overcome both viscous forces and adverse pressure gradients, cease to continue in the boundary layer and get separated from the skin of the airfoil. +This is what is called as a stall.

    + +

    Tired Man +Dhoni Boost

    + +

    When M. S. Dhoni, or Sachin Tendulkar if you think of him, faces a similar situation, he takes a cup of Boost in order to continue playing. +On similar lines, if one can, somehow, provide energy to the flow, the stall will be delayed thus making it possible to increase the critical angle of attack.

    + +

    So, in order to increase the lift supporting area of the wing and to increase the lift coefficient either by increasing camber or by delaying stall or both, some special devices are used known as High Lift Devices.

    + +

    High Lift Devices

    + +

    There are various ways in which the aforesaid objectives can be met. +Following are some of those.

    + +

    Flaps

    + +

    These are the high lift devices (HLDs) that are generally deployed at the trailing edge of the wings. +These devices, change the effective camber of the wing cross sections. +Flaps are again of different types. +The following figure illustrates some.

    + +

    Flaps

    + +

    Slats and Slots

    + +

    These are the HLDs usually placed at the leading edge of the wings. +Slats are small, retractable airfoils attached to the wing leading edges, generally just before the ailerons so that the latter remain operable even when rest of the wing enters stall. +When slats are made open, they create slots (gaps) between them and the main airfoil and high pressure air on the lower surface of the airfoil is directed to the upper surface, making the flow over the upper surface smoother and delaying the stall to higher angles of attack. +The effect of flaps and slats is shown below.

    + +

    Chords

    + +

    Slats +Slats

    + +

    Boundary layer control and Blown Flaps

    + +

    These come under the powered high lift systems. +Generally, these systems involve blowing of air from some powered source, like compressor of an engine or exhaust of the engine, using ducts and other mechanisms to achieve the desired lift characteristics. +Here is a small description of such devices.

    + +

    Engine Air

    + +

    Leading Edge Root Extensions

    + +

    A LERX typically consist of a small triangular fillet attached to the wing leading edge root and to the fuselage. +In normal flight the LERX generates little lift. +At higher angles of attack, however, it generates a vortex that is positioned to lie on the upper surface of the main wing. +The swirling action of the vortex increases the speed of airflow over the wing, so reducing the pressure and providing greater lift. +LERX systems are notable for the potentially large angles in which they are effective.

    + +

    LERX Systems +Graphical Lerx

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/holographic-memory/index.html b/blog/holographic-memory/index.html new file mode 100644 index 0000000..07090fe --- /dev/null +++ b/blog/holographic-memory/index.html @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Holographic Memory

    +

    The word holography might fill your mind with 3-D images, but what the +term essentially means is to record a unique photographic image of +something that can be stored and later retrieved. The definition of +holography hints at the storage of data. Instead of using the surface to +store data (like C.D.s), holographic data storage aims to use the entire +volume of a medium to store data (three-dimensional data storage). +Although holographic data storage technology is as old as that of the +internet, it hasn’t proved indispensable for data storage. That might +seem concerning to someone aware of its technological advantages, but +the internet took its own sweet time (nearly 30 years) before it gained +widespread popularity. It’s all about the timing of a particular +technology, as in the case of the internet, and for now, it seems that +holographic data storage hasn’t yet found its purpose. But, given the +advancements in other technology fields, such as big data and +biotechnology, it seems inevitable that holographic data storage will be +the standard to aid these advancements.

    + +

    Henry Caulfield (the principal scientist at the Sperry Rand Research +Center in the U.S.A.) and electrical engineers Richard A. Soref and +Donald H. McMahon filed the first patent (U.S. patent #3,635,538) for +holographic data storage are credited with pioneering holographic +memory. The beauty of holographic memory is its ability to store large +amounts of data in a tiny amount of volume. If the cost of data storage +per volume in holographic memory does come down, as it did in the case +of hard disks, it would be revolutionary given how businesses and +governments alike will have access to large amounts of data at a low +price. More importantly, it could benefit most users as computing is +becoming more ubiquitous and an integral part of their lives. It’s hard +to predict the future, but it seems clear that humanity aims to merge +with computers to enhance itself, which demands a lot of processing and +data about the human body (an incredibly large data source).

    + +
    image1A holographic storage device developed by InPhaseTechnologies (one of the companies leading in holographic storage device manufacture)
    + +

    At the core of holographic memory creation is the interference of light, +which is used to store an object’s properties. Here is how it works:

    + +

    As is the case with any data storage device, two processes are +considered:

    +
      +
    • how data is written to storage
    • +
    • how data is read.
    • +
    + +

    Data Write:

    + +

    In the data writing process, a laser beam is generated and split into +two beams called the data beam and the reference beam done using a beam +splitter (basically a half-silvered mirror). The data beam is then +incident on the object to be encoded. You might ask, how can binary data +be represented as an object? This is done by representing 1s and 0s as +light and dark patterns on an LCD. The reference beam follows a path +different from that of the data beam. It travels without interacting +with anything in its path. The two resultant beams are then incident on +the recording medium, typically a lithium niobate crystal, where they +interfere and create an interference pattern stored in the crystal as +data. By changing the reference beam’s angle, multiple data pages are +stored in the same volume of the recording medium, which gives rise to +the enormous data storage capacity of holographic memory. U.V. light can +be used to erase the data stored in a crystal.

    + +
    image2The image above shows the data read process. The beam on the right is the reference beam, and that on the left is the data beam. The cuboid is the recording medium (usually lithium niobate crystals)
    + +

    Data Read:

    + +

    The data read process involves the use of just the reference beam. An +appropriate angle of the reference beam is selected depending on the +data page required to be chosen. The reference beam is then fired on the +selected page, which recreates the data stored at that particular +location, which is then converted into binary data, which can then be +processed.

    + +
    image3The image above shows the data read process. Only the reference beam is used
    + +

    Although in its early stages of development to enable mass usage, +holographic memory has a vast potential to affect a wide variety of +users. It has several advantages:

    + +
      +
    1. On examining the data read process and comparing it with that of a CD +or other contemporary storage devices, it can be observed that +holographic data read process can read a huge amount of data at a time +compared to other storage devices. This is beneficial to both store and +access high-quality digital multimedia, which will provide a smooth +experience to the user.
    2. +
    3. The high capacity and long durability of holographic memory +(typically 50 years) make it highly desirable for medical archiving. +D.N.A. has enormous amounts of data. Scientists working on genetic +engineering desire high-density storage media and for long periods, +which are then processed by computers. It also favors corporations and +governments, which usually store and process tremendous amounts of data.
    4. +
    5. Holographic memory has an added advantage of low power consumption, +which improves the portability of these devices.
    6. +
    + +

    Considering all these advantages, it might seem evident that holographic +memory might be in widespread use with a few years. But there are +several barriers to be overcome to achieve this. This also explains +their non-availability for commercial use in today’s world, considering +they were invented nearly half-a-century ago. These include the high +cost and high sensitivity of these machines. They will not be adopted as +long as the price of holographic data storage drops. The project undertaken by the tech giant Microsoft is worth mentioning in this regard. Microsoft’s project HSD aims at harnessing the power of massive data storage capacities that Holographic Memory can provide. This project seems to be a result of the enormous rise in cloud storage requirements. Microsoft Azure and Microsoft Research Cambridge are working to make Holographic Data Storage a reality. Microsoft is just one of the many companies and +researchers working to overcome the issues faced with Holographic Data Storage and bring them into the +market. It is thus unclear if holographic memory will render current data storage devices +obsolete. But, as history speaks for itself in the case of great +technologies, patience and timing might result in holographic memory +having a significant impact on the future of technology.

    + +

    References:

    + +
      +
    1. Lasers, Technology, and Teleportation with Prof. Magnes
    2. +
    3. Processes used in holographic memory and images
    4. +
    5. Holographic storage dynamics in lithium niobate: theory and experiment
    6. +
    7. Holographic Data Storage
    8. +
    9. Project HSD: Holographic Storage Device for the Cloud
    10. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/how-computers-learn-to-play-games/index.html b/blog/how-computers-learn-to-play-games/index.html new file mode 100644 index 0000000..3b9020b --- /dev/null +++ b/blog/how-computers-learn-to-play-games/index.html @@ -0,0 +1,566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Have you ever wondered how computers learn to play games like Chess or Go? Or how do they replace human players in Ludo or Card games? +How Google’s Alpha-Go defeated the World Champion of Go? +Let us dive in the field of Computer Games and find out how Computers learn to play Games!

    + +

    Chess

    + +

    There are various algorithms that are used to make a computer learn to play games. I will be discussing some of them to give you some intuition on how these algorithms work.

    + + + +

    Let’s start with a simple and naive approach by which the computer can take decisions. It is by looking at all possible states and choosing the best action to take. That is, make a tree with all possible states and next states and go to the leaves to find out if a move will lead to winning state or not and select an action accordingly.

    + +

    Game Tree

    + +

    But, this technique cannot be used for games where there is a huge number of states, that it is practically impossible for a computer to examine all the states before taking a decision. For example, there are more than 5000 states in the game of Tic-Tac-Toe, which is a 3 X 3 board game. Whereas Chess is an 8 X 8 board game and Go can have a 19 X 19 board. Therefore these games with billions of states cannot be solved by any such brute force approach where examining each state is required.

    + + + +

    Monte-Carlo Tree Search can be only used for games where we have perfect information about the game that is we know about all the actions that were previously taken and can be taken in future. It is applicable to games like Go, Chess or Tic-Tac-Toe. So, what the computer does in Monte Carlo Tree Search is it repeats these 4 steps

    + +

    Monte-Carlo Tree search

    + +

    1)Select -

    +

    In this step the computer starts with a root node(state) and selects the next node based on the current policy. A policy is a function that dictates what actions to take given a state.

    + +

    2)Expand -

    +

    When the policy can no longer choose an action with confidence to find the successor node, it expands the game tree by appending all possible states from that node or a few let’s say 10 or 100 states chosen by randomly trying out certain number of actions, this is done when the number of next possible states is huge.

    + +

    3)Simulate -

    +

    Then from the appended nodes, it simulates a random game to find out how good it is to go to that state.

    + +

    4)Backpropagation -

    +

    Then it traverses upwards back to the root and updates the score for all visited nodes.

    + +

    These four steps are repeated again and again until the computer has learned enough to actually play the game.

    + +

    Learning to play games using Reinforcement Learning

    + +

    There are various algorithms that come under Reinforcement Learning Algorithms. Each suitable for a different purpose. The basic idea behind Reinforcement Learning is, as the name suggests, making the computer play the game again and again and learn from its own experience. +In order to give you intuition on how Reinforcement Learning can be used for games with a huge state space let me define two new terms.

    + +

    1. State Value Function - Given a state this function tells how good it is to be in that state.

    + +

    2. Action Value Function - Given an action and a state, this function tells how good it is to take that action from the given state.

    + +

    The basic idea is to learn the value functions and use it to choose the best action. +Consider the following diagram-

    + +

    Backup diagram for value function

    + +

    What the computer does is from a given state it chooses the best action based on the action value function and proceeds, and depending upon what reward it gets, the computer modifies the action value function accordingly (This Reinforcement Learning Technique is called Q-learning, have a look at the following blog post to get a better understanding of how this algorithm works.).

    + +

    But how is it dealing with the problem of a huge number of states?

    + +

    The answer is the computer is not really going through all the possible states but still learning an approximate way to figure out the best actions to take. There are many states in the state-space which occur very rarely or is too poor to begin with, that there is no point going all the way down from that state and calculating everything when there are very fewer chances of encountering that state or there is no way it can get you a better reward. +But as our computer plays multiple games it will surely go through most of the frequently occurring and promising states and will know how to behave in those situations.

    + +

    Alpha-Go

    + +

    Recently Google’s Alpha-Go zero defeated Go’s World Champion Lee Sedol. Alpha Go Zero learned to play Go from scratch by playing multiple games against itself. In Alpha-Go deep learning and Monte Carlo Tree Search were combined to produce a powerful reinforcement learning algorithm.

    + +

    Lee Sedol playing with Alpha-Go

    + +

    If you are wondering why it is so much of a big deal because AI has already defeated Chess Grandmaster Garry Kasparov in the game of chess then why not Lee Sedol in Go! +There are various differences between Chess and Go, and that is why it took another 20 years after Garry Kasparov’s defeat to build an AI which can master Go. One of the major differences is the number of choices available at each step, which is about 35 in Chess compared to 250 in Go. +Also, the number of moves per game, Go might last for 150 moves vs. 80 in chess. Therefore the total number of possible games of Go has been estimated at 10^761, compared to 10^120 for chess which is a huge difference. That’s why it has been difficult for computers to master Go.

    + +

    Conclusion

    + +

    I hope you enjoyed this dive into the World of computer games and got to know some of the technical details too. You can go through the following links to know more about these topics.

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/how-is-technology-helping-the-differently-abled-people/index.html b/blog/how-is-technology-helping-the-differently-abled-people/index.html new file mode 100644 index 0000000..686db22 --- /dev/null +++ b/blog/how-is-technology-helping-the-differently-abled-people/index.html @@ -0,0 +1,530 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    This year, the government of India dedicated the National Science Day to the theme “Science and Technology for specially-abled people”. The main aim was to encourage innovation and also to ease the difficulties of differently abled people. So here are 10 assistive technologies to assist them.

    + +

    Devices for people with visual Impairment

    + +

    DOT

    + +

    It is the world’s first Braille smart watch which is affordable compared to the regular e-Braille devices. Technically this device consists of 6 dots on four cells on the screen of the watch which forms 4 letters in Braille at any time. This tool helps the visually impaired to get access to messages, tweets and books. +bionic

    + +

    FingerReader

    + +

    FingerReader is an index-finger wearable device which assists the visually impaired in reading as well as translating texts. The small camera on the FingerReader scans the text and gives real-time audio feedback of the word it detects. +bionic

    + +

    Smart Glasses:

    + +

    A pair of glasses has been developed by the Oxford University to aid the people with limited vision which enables them to walk around unfamiliar places. The smart glasses consist of a video camera mounted on the frame of the glasses, a computer processing unit that is small enough to fit in a pocket and software that provides images of objects close-by to the see-through displays in the eyepieces of the glasses.
    +bionic

    + +

    Devices for people with hearing Impairment

    + +

    UNI

    + +

    It is a two way communication tool that relies upon gestures and speech technology. It works by detecting hand and finger gestures with its specialised camera and then converting into text to provide meaning to given sign language. It also has an additional feature of voice recognition software that will convert speech into text. +bionic

    + +

    Transcense

    + +

    Transcense is a mobile app that accurately translates conversation in real time to text format. It works by catching conversations from the voices of different individuals and assigning them a colour bubble so the deaf person knows who said what. With the help of distributed microphone systems on each Smartphone the app catches the words of each individual and converts it into text.

    + +

    Devices for people with speech Impairment

    + +

    DynaVox EyeMax

    + +

    This device gives the ability to participate in spoken communication using only eyes. The device consists of a sophisticated eye tracking system so that the users can interact with the on-screen keyboard to enter words and phrases which are then converted to spoken text using text-to-speech mechanism of the device. +bionic

    + +

    Talkitt

    + +

    This application helps people by translating unintelligible pronunciation into understandable speech. It works by learning the user’s speech pattern first, creating a personal speech dictionary. Then it identifies and recognises the unintelligible pronunciations and translates it to speech which people can understand.

    + +

    Technologies for others

    + +

    HeadMouse Nano

    + +

    HeadMouse Nano replaces the standard computer mouse for people with limited hand movements. The HeadMouse has a wireless optical sensor mounted on top of the monitor screen which tracks and translates the natural movements of user’s head into directly proportional mouse pointer movements. +bionic

    + +

    Bionics

    + +

    Advances in 3D printing and bio-electronics are allowing replacement of lost limbs with prosthetics, giving specially-abled person an extra functionality. Though the technology with bionic is still in its initial stages but few bionic items already exist, the best known being the cochlear implant, a device for deaf people.

    + +

    dbGlove

    + +

    This device helps the deaf blind people to communicate using tactical alphabets - pressing or pinching different parts of the hand represents different letters .The device consists of a sensor that converts these alphabet tracings into computer text and also trace the letters back onto the hand.  This will enable deaf blind people to operate computers and smart phones. +bionic

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/how-qr-code-was-invented/index.html b/blog/how-qr-code-was-invented/index.html new file mode 100644 index 0000000..272d99f --- /dev/null +++ b/blog/how-qr-code-was-invented/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    How QR code was invented

    + +

    Denso Wave a subsidiary of the Toyota Group are attributed with the creation of the QR Code back in 1994. Originally it was used to track parts in the vehicle manufacturing industry, but its use and scope has since grown tremendously. One of the main objectives when creating the QR Code was to come up with a new barcode that allowed more data to be encoded without increasing the size (dimensions / surface area) of existing barcodes. This was achieved by including a second dimension.

    + +

    The QR Code was born.

    + +

    Working of QR code

    + +

    The conventional one dimensional barcodes used on virtually every consumer product are mechanically scanned. That is, they’re read by physically bouncing a narrow beam of light onto the code, which can be interpreted using the pattern of light reflected off the white gaps between the lines.

    + +

    QR

    + +

    QR codes, on the other hand, can not only hold 100 times more data than 1D barcodes—they can also be digitally scanned. The block of smaller black and white squares is read by a smart phone’s image sensor, then interpreted by the system processor. The three large squares act as alignment targets, while the smaller square in the remaining corner acts to normalize the size and angle of the shot. The blue strips near the alignment squares contain formatting information, and the remaining yellow area is the actual data that’s converted into binary code and checked for errors before being displayed. The encoded data can be interpreted as one of four primary modes—numeric, alphanumeric, byte/binary, and Kanji. Other forms of data can also be displayed with the appropriate extensions.

    + +

    The most common QR Code type is broken down in the following information identifiers:

    + +

    QR

    + +

    Version and format information are important for the scanning device to know what kind of data to expect. Meanwhile, the data can be slightly smeared or missing and still be readable. This depends on the error correction level being used when writing the code.

    + +

    And did you know that you can rotate QR Codes however you like? Upside down will still work! This is a courtesy of the position patterns (squares with dots in the middle) that allow the code to be read from any direction in 360 degrees.

    + +

    Meanwhile, the alignment patterns are used to assist in navigation of larger codes and the timing patterns are used to determine the size of modules. The quiet zone requires a margin of at least 4-module worth.

    + +

    How much can we store?

    + +

    We can store up to 4,296 alphanumeric characters. One alphanumeric character is either a character from A to Z or a number from 0 to 9. With the need of special characters like ,.!/$§% or öÖäÄüÄß, the capacity shrinks down to 2.956 Bytes. But that’s still plenty.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/how-to-get-started-with-bots/index.html b/blog/how-to-get-started-with-bots/index.html new file mode 100644 index 0000000..7fbc03c --- /dev/null +++ b/blog/how-to-get-started-with-bots/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    How to get Started with bots

    + +

    Have you ever been fascinated by robots - Awestrucking objects which are capable of performing some cool tasks without needing a human intervention (well, unless they decide to go mad! :P) ? And certainly the thought of how these genius creations work and can I make one too? must have crossed your mind. Being in a similar frame of mind couple of years back and having made some basic bots, I thought of writing this article to help the curious people.

    + +

    Getting Stuff together

    + +

    It’s surely hard to shell out a few bucks but it’s all worth here. First and foremost you will need a microcontroller. To the beginners out there with no previous experiences with one I will recommend to use Arduino Uno but if you already had enough of Arduino go with MSP430(you will certainly learn more here) from TI. Then comes the robot chassis: buy one which is not too small and strong enough. You will need two DC motors, two wheels, one castor wheel. Also L293d - a motor driver (It is an IC if you didn’t know) which is required to provide extra current to motors. Apart from this you will need a breadboard along with few LEDs and 330Ohm resistors(for testing), jumper wires (M2M, M2F, F2F), sensor components(I will come to these later) and also I highly recommend having a multimeter handy. Lastly a power source: a few 9V batteries ( they drain quickly, you can try rechargable ones) and if you don’t mind shelling out more, buy 12V lead acid battery which are much better than your 9V ones.

    + +

    Where do I buy these? If you are in Bangalore, head to SP road, Lamington road for Mumbaikars ( I am unaware of other cities). You can also buy it online on robocraze.com, robokits.co.in, amazon.in and many other sites.

    + +

    Try catching hold of your friend with similar interests and spilt the bill.

    + +

    Once done with testing on breadboard, people generally prefer to make it permanent by soldering it onto a board which will require a soldering iron.

    + +

    Start Building

    + +

    I believe you are well-versed with Basic C programming and that is enough to get started. Install Arduino IDE and learn basic GPIO functions of Arduino and test them out with LEDs ( use resistor in series to prevent your LED from burning) and breadboards. Go through the example codes in Arduino IDE ( Arduino’s website is the best place for answers to your doubts). +Next learn to use the motor driver (here you will have to use your batteries). This article will help you.

    + +

    Integrating the Sensor

    + +

    IR sensors are the most basic and versatile sensors. They can be used to tell black lines apart from white, measure the distance in analog and digital form, detect obstacle among many others. Refer this article which does a very good job of explaining it. You can build a line-following, wall-following,etc with IR sensor.

    + +

    There are many other interesting sensors like light-sensing, then accelerometers, gyro, etc which detect the movement of the robot which you can experiment with once you are done with your first one.

    + +

    And if you want your robot to have arms then servo/stepper motor is the answer.

    + +

    Raspberry Pi

    + +

    You are almost there

    + +

    Once you have tested your sensor and motor circuits individually, it’s time to bring them together. Write a code ( I leave this to you) which will process the sensor data and intruct the motors. You can improve the efficiency of your code using algorithms like PID. +Then fix your motors, castor wheel to the chassis. Attach your sensors at the required place.Finally rest your Arduino and sensors on top of the chassis along with the battery and you are ready to go.

    + +

    What’s next?

    + +

    After you build these basic robots, you should try and procure data in other forms like images of surroundings, noises,etc and process them using image/audio processing techniques. Send data to and fro using bluetooth, WiFi. You can perform certain tasks with your robot by including a robotic arm controlled by a stepper/servo motor. Further improvisation is endless and your imagination is the only limit.

    + +

    Useful Tips

    + +
      +
    • Make sure all your modules share a common ground.
    • +
    • Always have a switch for your robot.
    • +
    • Disconnect wires from pins 0 and 1 on Arduino while uploading code.
    • +
    • Have a provision to use variable speed for motors
    • +
    • Try making your circuit permanent by soldering to avoid lose connections.
    • +
    • Never lose hope and keep building!!
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/hyperloop/index.html b/blog/hyperloop/index.html new file mode 100644 index 0000000..4ba06ff --- /dev/null +++ b/blog/hyperloop/index.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Hyperloop

    +

      +1

    + +

    One of the most valued and important entity nowadays is time. To help the people around the world to save their   travelling time, Elon Musk came up with an innovative idea of hyperloop. Hyperloop is a proposed mode of passenger and freight transportation that would propel a pod-like vehicle through a reduced-pressure tube that could potentially exceed airliner speeds. The pods would accelerate to cruising speed gradually using a linear electric motor and glide above their track using passive magnetic levitation or air bearings. The tubes could also go above ground on columns or underground, eliminating the dangers of grade crossings. It is hoped that the system will be highly energy-efficient, quiet, and autonomous. The concept, created  in 2012, incorporates reduced-pressure tubes in which pressurized capsules ride on an air cushion driven by linear induction motors and air compressors. The Hyperloop concept has been explicitly open-sourced by Musk and SpaceX, and others have been encouraged to take the ideas and further develop them. Also  a few companies have been formed, and several interdisciplinary student-led teams are working to advance the technology.  Lots of efforts are put to create this innovative  concept but it does surely has a limitation which is that  hyperloop is too susceptible to disruption from a power outage or terror attacks to be considered safe. +The major reasons why it is difficult to operate high speed vehicles is due to presence of large amount of drag force or air resistance. This resistance becomes substantial when the vehicles reach high speeds. The vactrain (vacuum train)  concept theoretically eliminates these obstacles by employing magnetically levitating trains in evacuated (airless) or partly evacuated tubes, allowing for speeds of thousands of miles per hour. The hyperloop operates at a pressure of one millibar or 100Pa of pressure.

    + +

    2 +  +Some critics of Hyperloop focus on the experience—possibly unpleasant and frightening—of riding in a narrow, sealed, and windowless capsule inside a sealed steel tunnel, that is subjected to significant acceleration forces; high noise levels due to air being compressed and ducted around the capsule at near-sonic speeds; and the vibration and jostling. Even if the tube is initially smooth, ground may shift due to seismic activity. At high speeds, even minor deviations from a straight path may add considerable buffeting. This is in addition to the obvious practical and logistical questions regarding how to best deal with equipment malfunction, accidents, and emergency evacuations.   +  +Here are the four main features of the hyperloop

    +
      +
    1. The passenger capsules aren’t propelled by air pressure like in vacuum tubes, but by two electromagnetic motors. It is aimed to travel at a top speed of 760 miles per hour. +3
    2. +
    3. The tube tracks do have a vaccuum, but not completely free of air. Instead, they have low pressure air inside of them. Most things moving through air tubes will end up compressing the air in the front thus, providing a cushion of air that slows the object down. But the hyperloop will feature a compressor fan in the front of the capsule. The compressor fan can redirect air to the back of the capsule, but mostly air will be sent to the air bearings. +4
    4. +
    5.  Air bearings are ski like paddles that levitate the capsules above the surface of the tube to reduce friction. +5
    6. +
    7. The tube track is designed to be immune to weather and earthquakes. They are also designed to be self-powering and unobsrtuctive. The pillars that rise the tube abobe the ground have a small foot-print that can sway in the case of an earthquake. Each of the tube sections can move around flexibly of the train ships because there isn’t a constant track that capsules rely on. The solar panels present on the top of the track  provide the periodic motors with power. +  +6
    8. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/i2c/index.html b/blog/i2c/index.html new file mode 100644 index 0000000..6ddf635 --- /dev/null +++ b/blog/i2c/index.html @@ -0,0 +1,566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    The I2C bus was developed in the early 1980’s by Philips Semiconductors. Its original purpose was to provide an easy way to connect a CPU to peripheral chips in a TV-set. Its name, Inter-Integrated Circuit, literally explains its purpose: to provide a communication link between Integrated Circuits.

    + +

    alt_text

    + +

    How does it work

    + +

    I2C requires two digital lines: Serial Data line (SDA) to transfer data and Serial Clock Line (SCL) to keep the clock. Each slave has a unique 7bit (generally) address in a system so that up to 128 devices can communicate using only two wires. Since the system is synchronous, so data sent will depend on the clock signal.

    + +

    There is a specific condition(or “Start” condition), to initiate communication between master and slave, has to be engaged. After that master sends 8bit sequence which consists of 7bit address of slave from which it needs to communicate and 8th bit to indicate whether master will read from the slave (logic 1) or write to it (logic 0). For the next bit through data, line is sent by slave, which determine that it acknowledged it (logic 0) or not (logic 1). After that, the internal register address of slave memory’s is sent through the data line. This is necessary because of a slave which can be a multivariable storing sensor needs to send a particular value of data which is stored in that internal register. After that, again, there is a requirement for acknowledgement bit. After the whole addressing, data transfer sequence begins, which depends on Reading/Write bit sent just after the slave address. After successful completion of data transfer, stop bit will be sent through the data line and this communication between master and slave will be ceased.

    + +

    alt_text

    + +

    To appreciate the working of protocol here, let us consider a case of communication between multiple independent components. What if the slaves do not know who the master is? What if multiple masters are requesting from the same slave? What happens if a master requests data from a slave that for some reason, has become nonfunctional? In these scenarios, the whole system will collapse within a blink of an eye. It is the principle of I2C which prevents collapse and ensures smooth functioning of the system.

    + +

    Advantages

    + +
      +
    • Simple Hardware standard
    • +
    • Simple protocol standard
    • +
    • Easy to add/remove functions or devices (hardware and software)
    • +
    • Simpler PCB: Only two traces required to communicate between devices
    • +
    • Very convenient for monitoring applications
    • +
    • Fast enough for all “Human Interfaces” applications
    • +
    • Displays, Switches, Keyboards
    • +
    • Control, Alarm systems
    • +
    + +

    Application

    + +

    Ok, so that’s it for theory, now let’s see where we can implement it. Let us consider the case of a system which requires lots of pin connection with a microcontroller, which is typically Arduino Uno. So sometimes we need to cascade two Arduinos due to pin shortage or sensor working or whatever the reason. To ensure the working of cascading, I2C comes into the picture.

    + +

    A4 pin of Arduino Uno board is SDA and A5 is SCL, so we have to connect these pins of one Arduino to another. Also, as per I2C protocol, we need to define one Arduino as master and another one as a slave for which we can use Arduino IDE with ‘wire’ library for I2C.

    + +

    alt_text

    + +

    In the code of master Arduino Uno, there will be Wire.begin() function, which will work as start condition as mentioned earlier. Now for selecting a slave device, there is function Wire.beginTransmission(X), in which X is the address of slave, which will begin transmission with slave. Wire.write() is used for writing data to slave memory and Wire.read() is used for reading values from slave. Wire.endTransmission() will behave as stop condition to cease communication till next time.

    + +

    In the code of slave Arduino Uno, similarly, there will be Wire.begin(X) where X would be the address of it. read() and write() can be used whenever there is a need to read or write data through the data line. onReceive() and onRequest() functions are used by the slave to specify a new function that is called when whether master sent data or master requested data.

    + +
    //Demonstration of wire library
    +// Master arduino as reader
    +#include <Wire.h>
    +void setup()
    +{
    +  Wire.begin();        // join i2c bus
    +  Serial.begin(9600);
    +}
    +void loop()
    +{
    +  Wire.requestFrom(3, 8);    // request 8 bytes from slave device #3
    +  while(Wire.available())    
    +  { 
    +    char c = Wire.read(); // receive a byte as character
    +    Serial.print(c);         
    +  }
    +  delay(500);
    +}
    +
    + +
    // Slave arduino as receiver
    +#include <Wire.h>
    +void setup()
    +{
    +  Wire.begin(3);                // join i2c bus with address #3
    +  Wire.onReceive(receiveEvent); // register event
    +  Serial.begin(9600);           
    +}
    +void loop()
    +{
    +  delay(100);
    +}
    +void receiveEvent(int howMany)
    +{
    +  while(1 < Wire.available()) 
    +  {
    +    char c = Wire.read(); // receive byte as a character
    +    Serial.print(c);    
    +  }
    +  int x = Wire.read();    // receive byte as an integer
    +  Serial.println(x);       
    +}
    +
    + +

    Resources and Going Further

    + +
      +
    • Wikipedia Article on I2C - Not great, but not a terrible place to start.
    • +
    • Standards Doc - Phillips Semiconductor became NXP a few years back; this is the official standards doc for IC.
    • +
    • I2C primer - The official primer on I2C and related technologies.
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/image-steganography/index.html b/blog/image-steganography/index.html new file mode 100644 index 0000000..fd75113 --- /dev/null +++ b/blog/image-steganography/index.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Data or information is a very crucial resource to us, therefore it’s our responsibility to protect its confidentiality and integrity. While sending a message or information, unintended users might try to tamper with the message or might use its content for their good, or other unintended purposes, therefore we need some data hiding techniques to hide some confidential messages. The importance of data hiding techniques comes from the fact that there is no reliability over the medium through which the information is sent. In this blog, we will go through one of the data hiding techniques i.e., Image Steganography.

    + +

    Importance of Image steganography

    + +

    Steganography is a data hiding technique, which is used to hide information such as text, images, videos, etc. inside another image or video. Image Steganography is the technique of hiding text, images, audio inside an image.

    + +

    So why do we need steganography when we have various encryption techniques to do the same? Let’s take an example to understand that, suppose we want to encrypt a string “IEEE is an International Organization”, the encrypted message may look something like “351@sbttr_$ee#^erh@_re8rry$#” or something similar to this based on the encrypting algorithm. The encrypted message often looks like something that makes no sense to the reader without decrypting it. This draws unnecessary attention and prevents us from hiding the presence of a string in it. Sometimes it’s necessary to hide even the presence of encrypted information because no matter how strong an encrypting algorithm is, it can be cracked, or it might be necessary because of restrictions on encrypting a message in some countries. In such situations, steganography comes to our rescue. By using this data hiding technique, we can hide the presence of a message in it. We can see its example in the following two images, the first image is a host image, and the second image is the image obtained after encrypting the string “IEEE is an International Organization”. The difference between the host and encrypted message is not visible to naked eyes.

    + +

    img img

    + +

    Let’s take another example which shows the hiding of an image within an imageimg img img

    + +

    The first image is the host image which is used to hide the hiding image i.e., that is the second image in this scenario. The third image is the encrypted image which is the image obtained after hiding image2 in image1 using steganography techniques.

    + +

    Steganography can be combined with encryption techniques to make a better algorithm.

    + +

    Various Image Steganography Techniques:

    + +

    There are a lot of image steganography techniques, which are based on LSB implementation, FFT, and CNN. Common FFT-based transformations are Discrete Cosine Transformation (DCT), Quaternion Fourier Transformation (QFT), Discrete Fourier Transformation (DFT), Discrete Wavelet Transformation (DWT), and the Discrete Hadamard Transformation (DHT). In the LSB-based implementation, we make suitable changes in the LSB of each pixel value of the image to hide the data. In the FFT-based implementation, suitable changes are made in the magnitude of the host image’s DFT to hide the information. This is because it is well known that for many images, the phase of the Fourier transform is more important than the magnitude. In this blog, we will discuss the implementation of image steganography using the LSB technique.

    + +

    In computers, we represent every color as a combination of three fundamental colors i.e., red, green, blue. For instance, indigo color in computers is expressed as (75,0,130), where 75,0,130 represents the respective intensities of red, green, and blue channels.

    + +

    We know that a digital image can be expressed as a multidimensional matrix. Consider a color image of width m and height n. Then the order of the matrix will be (n×m×3). The third dimension of the matrix represents the number of channels in the image. The following images will help visualize an image as a three-dimensional matrix.

    + +

    img

    + +

    img

    + +

    In a 24-bit RGB image, each channel pixel has 8 bits (1byte). So, the pixel intensities vary between 0-255 if we consider the data type to be uint8. The last bit of the bit is called LSB. The binary value of each channel’s intensity for gray color is ( [01001011], [00000000], [10000010] ). If we change the LSB of each channel’s intensity and make it ( [01001011], [00000000], [10000010] ), this little change in the color won’t be visible to the naked eye. This idea forms the basis of image steganography. Suppose we want to hide a text message inside an image, then we first convert the message into binary and then take a single bit of the message, replace the LSB of the pixel value of the host image with the message bit. The following code is a simple way to do the same,

    + +

    img

    + +

    The code can be suitably modified to add an option of password for encoding as well as for decoding. For decoding the message from the encoded message, we take the LSB of the binary pixel intensities of the encoded image, stack them to make a binary message. This binary message is then converted into an 8-bit long byte, which represents a single decoded character. The following code is a simple way to do the same,

    + +

    img

    + +

    Similarly, we can write a code for hiding images within an image. One can consider, images as a 2-Dimensional array and text as a 1-dimensional array. This similarity can be used to expand the existing code to hide images.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/impact-of-f1/index.html b/blog/impact-of-f1/index.html new file mode 100644 index 0000000..15811f1 --- /dev/null +++ b/blog/impact-of-f1/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    In general, F1 and motorsport have a long history of inventing and implementing technologies that eventually trickles down into road cars. Active suspension, traction control, carbon fibre construction, advanced aerodynamics and semi-automatic paddle gearboxes all began in the technology race that is Formula 1, not to mention the endless tyre and safety technology that continues to shape and give knowledge to today’s motor industry.

    + +

    On The Road

    + +

    The 2014 F1 regulations that require teams to use a V6 Hybrid engine has directly resulted in pushing forward engine technology, with the power units reaching a thermal efficiency of over 50 percent, making it one of the most efficient internal combustion engines ever. F1 hybrid power units are not just extraordinarily efficient; they also have made considerable contributions to battery technology. The same learnings that delivered improved power for racing have been applied to improving fuel consumption in the road-going environment. This has also been directly applied into Mercedes-AMG’s Project One hypercar and Aston Martin’s Valkyrie. Hypercars aside, Mercedes uses hybrid technology derived from its F1 car in models such as the S-Class.

    + +

    img-1

    + +

    Even though F1 isn’t an Autonomous Racing series, its race cars are an ideal testbed for certain technologies vital to autonomous driving due to the sheer amount of data that is processed locally on the car and sent to the garage.

    + +

    Meanwhile, KERS introduced back in 2009 to harness braking energy and unleash it on the track, is now used not only in hybrid cars, but also in buses, helping make cities greener.

    + +

    img-2

    + +

    These were the more modern technologies applied to cars. Many such innovations, especially from the 1980s and 1990s, can be seen not only in high-end cars, but in everyday vehicles too. Suspension technology, traction control, Engine control units, Automotive Aerodynamic Devices, Paddle shifters and many more were perfected by F1 in and can be seen in nearly every modern-day car.

    + +

    img-3

    + +

    Changing Lives

    + +

    A Formula One car is probably one of the most connected cars in the world. A single car is embedded with hundreds of sensors that measure all kinds of things – from temperatures to forces. Engineers can extract the most out of this if that data is available in real-time; however, it’s limited by a control unit that’s common for all teams. This results in teams trying to transfer this data to the garages through the pit stops, while also making sure that they don’t have to sacrifice track time. In 2017, F1 teams began using 5G technology, which allowed them to transmit this data wirelessly at speeds that match the sport. When the car is within four meters of the garage, it can transmit a GB of data in less than five seconds.

    + +

    Similar to the garage, modern hospitals and medical research institutes too face the challenge of transferring large amounts of data from devices such as X-Ray machines and have implemented a similar solution through various F1 technology partners.

    + +

    This technology is not a standalone Formula One product, though. Qualcomm has developed it for the consumer market and used F1 as a high-speed R&D environment, putting its product to the ultimate test. In the future, it is very likely that this technology will be seen in various everyday devices.

    + +

    The same technology is already being implemented by McLaren Applied Technologies to connect roads, rails and underground transportation.

    + +

    img-4

    + +

    F1 Engineering is not all a world of high – tech -Williams Advanced Engineering has worked with its F1 partners as part of a total benefits package for sponsors. Working with Unilever, Williams F1 managed to incorporate its technology, believe it or not, into the washing powder sector! It worked with Unilever on management methods and teamwork but also on engineering specifics like a drying tower for soap suds. Williams has also adapted F1 front wing designs to help increase the efficiency of supermarket refrigerators.

    + +

    In 2020, when there was a dire need for respiratory devices such as ventilators, seven F1 teams answered the UK government’s call for assistance by setting up ‘Project Pitlane’. Under ‘Project Pitlane’, teams used their unique ability to respond rapidly to technological challenges and sped up the production of various medical devices. Mercedes and the University College of London had also developed a breathing device that could be mass-produced.

    + +

    img-5

    + +

    Environmental Impact

    + +

    F1 over the years, especially over the past few years, has piled up a bad rapport for not being or not doing enough to be environment friendly. In response to this, F1 brought in regulation changes in 2014 that required teams to use a V6 Hybrid engine instead of the fuel-guzzling V8 engines. But this isn’t enough, which is why they’ve unveiled ‘Countdown to Zero’. F1 is on a mission to have a net zero carbon footprint by 2030 by adapting the sport towards a more sustainable means.

    + +

    F1 is working closely with the FIA on advancing the development of sustainable fuels. In the short term, they plan on increasing the percentage of biological components in the fuel and to completely move to a sustainable fuel over time. F1 has now created a second-generation biofuel variety as part of its push, which has been exclusively refined from bio-waste that is not intended for human or animal consumption. F1’s engine manufacturers have been asked to test and validate the fuel to prove that the technology is feasible for racing. The racing contributes to only a small per cent of the total carbon emissions, while the main culprits are the team factories and transportation.

    + +

    In 2020, F1 accelerated plans to introduce a more sustainable way of broadcasting our races, known as remote production. This has resulted in a 34% reduction in technical cargo and a 36% reduction in travelling staff sent to every race. They’re also moving on to more fuel-efficient means of transport such as railways and sea freights. They’ve also transitioned into 100% renewable electricity for all of its UK offices. But this isn’t something new to them. Mclaren F1 has been carbon neutral since 2011!

    + +

    Despite all the measures taken, there will inevitably be emissions, which is why they’ll offset this through robust and verifiable biological and technical sequestration programmes.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..189f23a --- /dev/null +++ b/blog/index.html @@ -0,0 +1,1047 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Consensus Mechanism in Blockchain + +

    +

    + + by Tejas Sankpal +   + | +   + April 11, 2022 +

    +

    + CONSENSUS MECHANISM The Blockchain is an undeniably ingenious invention, By definition,_ Blockchain_ is a continuously growing list of records, called blocks, which are linked and secured using cryptography. Each block typically contains a cryptographic hash of the previous block, a... +

    + + +
    + + IEEE NITK + + CompSoc + + Blockchain + +
    +
    +
    + + + + +
    +
    + +

    + I2C + +

    +

    + + by Bhaskar Vyas +   + | +   + August 23, 2021 +

    +

    + Introduction The I2C bus was developed in the early 1980’s by Philips Semiconductors. Its original purpose was to provide an easy way to connect a CPU to peripheral chips in a TV-set. Its name, Inter-Integrated Circuit, literally explains its purpose:... +

    + + +
    + + IEEE NITK + + Diode + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Cloud Computing in Detail + +

    +

    + + by Rohan Rao H J +   + | +   + August 23, 2021 +

    +

    + Cloud computing is a computing paradigm, where a large pool of systems is connected in private or public networks, to provide dynamically scalable infrastructure for application, data, and file storage. In the simplest terms, cloud computing is storing data and... +

    + + +
    + + IEEE NITK + + Diode + +
    +
    +
    + + + + +
    +
    + +

    + A future called Quantum + +

    +

    + + by Manav Singhal +   + | +   + August 23, 2021 +

    +

    + Introduction Life is not just made of a good(1) or a bad(0) experience it is a superposition of such experiences. $\qquad \qquad \qquad \quad \quad$ –Manav Then why do we only think and hear of binary when it comes to... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + DP on Trees + +

    +

    + + by Vaibhav Puri +   + | +   + August 16, 2021 +

    +

    + Introduction DP on Trees is a very useful Technique in problem-solving, The prerequisite for learning this is a very basic understanding of Trees, vectors, and DP. Before directly diving into the topic, We will discuss some topics in brief, they... +

    + + +
    + + IEEE NITK + + CompSoc + +
    +
    +
    + + + + +
    +
    + +

    + From 1G to 5G + +

    +

    + + by Sujay Chuttar +   + | +   + August 16, 2021 +

    +

    + First mobile phones had to be packed in a briefcase! Mobile technology has come a long way. It will play a crucial role in technologies of the future like IoT and autonomous vehicles! Let us look at the evolution from... +

    + + +
    + + IEEE NITK + + Diode + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + + + + + +
    • 1
    • + + + +
    • 2
    • + + + +
    • 3
    • + + + +
    • 4
    • + + + +
    • 5
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/initpost.sh b/blog/initpost.sh new file mode 100644 index 0000000..613d77b --- /dev/null +++ b/blog/initpost.sh @@ -0,0 +1,218 @@ +#!/usr/bin/env bash + +# ------------------------------------------------------------------------------ +# +# Program: initpost.sh +# Author: Vitor Britto +# Modified by: James Bowling +# Author: Vitor Britto (edited by Will) +# Description: script to create an initial structure for my posts. +# +# Usage: ./initpost.sh [options] +# +# Options: +# -h, --help output instructions +# -c, --create create post +# -d, --draft create draft post +# +# Alias: alias ipost="bash ~/path/to/script/initpost.sh" +# +# Example: +# ./initpost.sh -c How to replace strings with sed +# +# Important Notes: +# - This script was created to generate new markdown files for my blog. +# +# ------------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------------ +# | VARIABLES | +# ------------------------------------------------------------------------------ + +# CORE: Do not change these lines +# ---------------------------------------------------------------- +POST_TITLE="${@:2:$(($#-1))}" +POST_NAME="$(echo ${@:2:$(($#-1))} | sed -e 's/ /-/g' | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/")" +CURRENT_DATE="$(date +'%Y-%m-%d')" +TIME=$(date +"%T") +# ---------------------------------------------------------------- + + +# SETTINGS: your configuration goes here +# ---------------------------------------------------------------- + +# Set your destination folder +BINPATH=$(cd `dirname $0`; pwd) +POSTPATH="${BINPATH}/_posts" +DRAFTPATH="${BINPATH}/_drafts" + +if [[ "${1}" == "-c" || "${1}" == "--create" ]]; then + DIST_FOLDER="$POSTPATH" + FILE_NAME="${CURRENT_DATE}-${POST_NAME}.md" +fi + +if [[ "${1}" == "-d" || "${1}" == "--draft" ]]; then + DIST_FOLDER="$DRAFTPATH" + FILE_NAME="${POST_NAME}.md" +fi + +if [[ "${1}" == "-p" || "${1}" == "--publish" ]]; then + DIST_FOLDER="$POSTPATH" + FILE_NAME="${CURRENT_DATE}-${POST_NAME}.md" +fi + +# Set your blog URL +BLOG_URL="your_site" + +# Set your assets URL +ASSETS_URL="assets/img/" +# ---------------------------------------------------------------- + + + +# ------------------------------------------------------------------------------ +# | UTILS | +# ------------------------------------------------------------------------------ + +# Header logging +e_header() { + printf "$(tput setaf 38)→ %s$(tput sgr0)\n" "$@" +} + +# Success logging +e_success() { + printf "$(tput setaf 76)✔ %s$(tput sgr0)\n" "$@" +} + +# Error logging +e_error() { + printf "$(tput setaf 1)✖ %s$(tput sgr0)\n" "$@" +} + +# Warning logging +e_warning() { + printf "$(tput setaf 3)! %s$(tput sgr0)\n" "$@" +} + + + +# ------------------------------------------------------------------------------ +# | MAIN FUNCTIONS | +# ------------------------------------------------------------------------------ + +# Everybody need some help +initpost_help() { + +cat < +Options: + -h, --help output instructions + -c, --create create post + -d, --draft create draft post + -p, --publish publish/promote a draft to a post + +Example: + ./initpost.sh -c How to replace strings with sed +Important Notes: + - This script was created to generate new text files to my blog. +Copyright (c) Vitor Britto +Licensed under the MIT license. +------------------------------------------------------------------------------ +EOT + +} + +# Initial Content +initpost_content() { + +echo "---" +echo "layout: post" +echo "title: \"${POST_TITLE}\"" +echo "date: ${CURRENT_DATE} ${TIME}" +echo "image: '/assets/img/'" +echo "description:" +echo "tags:" +echo "categories:" +echo "twitter_text:" +echo "---" + +} + +# Create post +initpost_file() { + if [ ! -f "$FILE_NAME" ]; then + e_header "Creating template..." + initpost_content > "${DIST_FOLDER}/${FILE_NAME}" + e_success "Initial post successfully created!" + else + e_warning "File already exist." + exit 1 + fi + +} + +# Create draft +initdraft_file() { + if [ ! -f "$FILE_NAME" ]; then + e_header "Creating draft template..." + initpost_content > "${DIST_FOLDER}/${FILE_NAME}" + e_success "Initial draft successfully created!" + else + e_warning "File already exist." + exit 1 + fi + +} + +# Promote draft +promote_draft() { + if [ ! -f "$FILE_NAME" ]; then + e_header "Promoting draft..." + if mv "${DRAFTPATH}/${POST_NAME}.md" "${POSTPATH}/${CURRENT_DATE}-${POST_NAME}.md"; then + sed -i -e "s/date: .*/date: ${CURRENT_DATE} ${TIME}/" ${POSTPATH}/${CURRENT_DATE}-${POST_NAME}.md + e_success "Draft promoted successfully!" + else + e_warning "File already exists or draft promotion failed." + exit 1 + fi + fi +} + +# ------------------------------------------------------------------------------ +# | INITIALIZE PROGRAM | +# ------------------------------------------------------------------------------ + +main() { + + # Show help + if [[ "${1}" == "-h" || "${1}" == "--help" ]]; then + initpost_help ${1} + exit + fi + + # Create + if [[ "${1}" == "-c" || "${1}" == "--create" ]]; then + initpost_file $* + exit + fi + + # Draft + if [[ "${1}" == "-d" || "${1}" == "--draft" ]]; then + initdraft_file $* + exit + fi + + # Promote + if [[ "${1}" == "-p" || "${1}" == "--promote" ]]; then + promote_draft $* + exit + fi + +} + +# Initialize +main $* \ No newline at end of file diff --git a/blog/innovations-in-drone-industry/index.html b/blog/innovations-in-drone-industry/index.html new file mode 100644 index 0000000..195740f --- /dev/null +++ b/blog/innovations-in-drone-industry/index.html @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “Do you think drones are just four rotor-legged flying machines?”
    +“Have you ever thought how we can modify these machines to get maximum out of it?”
    +Multiple innovations are happening currently in this very industry and here are some of them!

    +
    + +

    GOING BLADELESS : THE FUTURE OF DRONES ?

    + +

    As much crazy as it might sound , bladeless drone are becoming a reality . Bladeless ? You ask me , well , it might be a bit of misnomer . Bladeless isn’t actually bladeless in the fact the it still relies on a bladed propeller , to force the pressurised air generating thrust . So then what’s new here . The propeller here is ducted from the main body all the way to a nozzle to guide the air through . Something like this:

    + +

    img1

    + +

    And here is some takeaways from this awesome new technology

    +
      +
    • Reduces the risk of blade related injuries to the controller as well as other bystanders
    • +
    • Reduces blade damage to the drone by meshing the inlet of the duct
    • +
    • Increases the maneuverability of the drone by providing the nozzles to guide the air
    • +
    + +

    The Bladeless Drone

    + +

    THE FOLDABLE DRONE

    + +

    img2

    + +

    The foldable drones are now a reality !
    +These drone have the ability to fold the rotor arms to various configurations , enabling the drones to cross low opening passages and places which would have been inaccessible otherwise .The first foldable drone was developed by students from the University of Zurich (UTZ) and EPFL .
    +Each of its four arms has a servo motor at the base that can rotate one propeller independently.There are several morphologies that can be adopted by the drone, like completely unfolded (“X” morphology), completely folded (“O”), straight line (“H”), and partly folded (“T”).However the drone can also acquire highly asymmetric morphologies whilst maintaining excellent stability thanks to its to its adaptive on board computing system (OBCs).

    + +

    img3

    + +

    img4

    + +

    img5

    + +

    Key advantages of this technology

    + +
      +
    • Allows the drone to reach inaccessible places which could further its capabilities. (for eg: rubble from an earthquake , landslides , etc.)
    • +
    • Enhances the stability of the drone by making use of the adaptive algorithms in the OBC
    • +
    • Increases the compactness of the drone and hence portability
    • +
    • Allows physical inspection of structures
    • +
    • Easy transportation of items
    • +
    + +

    SHAPE CHANGING DRONE

    + +

    UNDERWATER DRONES

    + +

    If blades drones and shape changing drones weren’t enough , here’s the underwater drone. Underwater drones have the capability to dive mid flight into water , stay submerged , navigate , perform functions underwater , resurface and fly back . These type of drones require to be waterproof at high pressures and temperature , however have lesser payload carrying capacity than owing to a heavy watertight structures around the frame . However these drones can be very versatile since they can easily operate in heavy rains.

    + +

    Key advantages

    +
      +
    • Can operate in underwater missions like inspection of bridges , pipelines , knowing the extent of damage done by oil spills , etc.
    • +
    • Can operate in unforgiving weather conditions
    • +
    + +

    UNDERWATER DRONE

    + +

    img6

    + +

    img7

    + +

    References

    + +
      +
    • https://airdronecraze.com/quick-reference-guide-of-drone-terminology/
    • +
    • https://www.youtube.com/watch?v=FC9EJhs0pc0
    • +
    • https://www.red-dot.org/project/bladeless-drone-26825/
    • +
    • https://www.youtube.com/watch?v=5L6FSdUmEpg
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/installing-ubuntu/index.html b/blog/installing-ubuntu/index.html new file mode 100644 index 0000000..ee34660 --- /dev/null +++ b/blog/installing-ubuntu/index.html @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Installing Ubuntu For Windows Users

    + +

    Ubuntu

    + +

    Hie

    + +

    Installing Ubuntu on your machine is really helpfull in college days. It comes free and there are lots of open source softwares available for it. +Last year, a lot of people came to my room for installing ubuntu on their machine. I once thought of opening shop for installing ubuntu (Just Kidding :P)

    + +

    So, this brief blog gives instructions on installing Ubuntu alongside Windows as a dual boot OS.

    + +

    1. Creating a partition for Ubuntu

    + +

    First thing we need to do is create a partition to install ubuntu. If you already have a partition, empty it and format it. If you don’t have one, follow this page. +Remeber the size of the partition you desire, it will be usefull later.

    + +

    2. Create Bootable Live USB

    + +

    Download and create a live USB or DVD. In Windows, my favorite tool to create a live USB is Universal USB Installer.

    + +

    3. Boot up the Live USB

    + +

    Now insert the USB into machine, restart and boot into USB drive from the Boot Options Menu. Google for hotkey to get into Boot Menu Options of your machine model.

    + +

    4. Start Installation

    + +

    When prompted for options on booting, select Install Ubuntu

    + +

    Install Ubuntu

    + +

    Select Continue for first few screens

    + +

    First Few Screens

    + +

    5. Preparing Partition for Ubuntu

    + +

    After few screens, you will be prompted for Installation Type. Choose Something Else and continue.

    + +

    Installation Type

    + +

    Now select desired partition (match the size of partition with one you created in step one), and click on - to delete the partition

    + +

    Ubuntu

    + +

    6. Create root, swap and home partition

    + +

    Now selecting the same partition, click + to create root partition. +Enter size 14000 MB, select Logical Partition type, Begining of space, and select / as Mount Point. Create the partition.

    + +

    Create Root Partition

    + +

    Follow similar steps for swap and home

    + +

    swap

    +
      +
    • Size: 16000 (two times your RAM)
    • +
    • Logical Partition
    • +
    • Begining of Space
    • +
    • Use As: swap area
    • +
    + +

    Create Swap Partition

    + +

    home

    +
      +
    • size: (remaining space)
    • +
    • Logical Partition
    • +
    • Begining of Space
    • +
    • Mount Point: /home
    • +
    + +

    Create Home Partition

    + +

    Now select Install Now

    + +

    7. Follow next screens

    + +

    Your ubuntu installation should begin by now, follow the screens prompted for user name and password and general system setup. +After few minutes, the installation will complete

    + +

    8. Reboot and Enjoy!

    + +

    Your ubuntu installation is complete. Reboot the machine to get into Ubuntu. Don’t worry, you can still use Windows.

    + +

    If you ran into any issue during installation, try googling it or you can always ping me over mail.

    + +

    Untill then, +This is hrily signing off…

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/intro-to-cloud-computing/index.html b/blog/intro-to-cloud-computing/index.html new file mode 100644 index 0000000..db7936a --- /dev/null +++ b/blog/intro-to-cloud-computing/index.html @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What is Cloud?

    + +

    Simply put, cloud computing provides storage, computing resources, networking and other services without direct management by the user.

    + +

    The existence of such user-accessible cloud resources is possible because of the presence of data centers.

    + +

    A data center refers to the place where the servers/computers are located and the place of computation in the cloud. These servers communicate with each other using the local network.

    + +

    Every cloud provider manages several data centers across the world. This kind of distribution of servers allows for reduced latency by routing the client requests to the geographically closest data center by determining his region and zone. +Every region contains a certain number of zones. Users can use the cloud service through any of these regions.

    + +

    Data centers will be working 24 x 7 so that the users of the cloud don’t have to worry about managing their own servers, scaling or failures since the servers are distributed. So the website will keep running even if one of the server instances goes down. +Once the user buys a virtual machine by the cloud provider, he will be given an IP address of the virtual machine so that they can access it by SSHing into that virtual machine.

    + +

    How does it work?

    + +

    Virtual machines

    + +

    A virtual machine is an emulated computer system created using software(like virtual box). This is done by using hypervisors. Virtual machines use the resources of the physical system. They allow the user to run applications with various software dependencies in an isolated way so that developers don’t have to worry about managing dependencies. A single physical computer can run multiple VMs. They can be created using softwares like Virtual Box. +Virtualization is one of the core ideas for the working of cloud computing. +Each machine will have an hypervisor installed in them. Basically hypervisors are used to manage the virtualization in the machine. So to access a machine in the cloud, the user generally has to enter the hardware requirement they need and also the location of the machine they want (zone). Using this the cloud service provider will look up their data centers to find a suitable computer meeting the requirements of the request. This is done by an internal tool which is specific to the provider. The changes are continuously managed by the cloud providers. Once a particular machine is found, it will install the dependencies and the utilities user has specified and creates a connection for the user. Virtual space is allocated on the physical machine for the virtual machine and these user-specified applications.. This allows multiple users to access and utilize the resources of the same machine but have their activities completely isolated from each other on the hardware level. In this way, Virtual machines are really important for the functioning of the cloud. +Cloud client/UI is basically where users select some of their software requirements. Everything else once they enter is done by the cloud provider.

    + +

    Uses of cloud computing

    + +

    Easy scaling/elasticity: When a company gets heavy traffic at some time, in the traditional developer-owned data center they need to scale their service horizontally to keep up with the traffic. In the cloud this is done easily using auto scaling features provided by the cloud. This makes the developers work on new ideas instead of managing servers.

    + +

    Pay for what you use

    + +

    The cloud service is elastic. The number of servers running in the cloud depends on the traffic. When there is usual traffic, the company doesn’t need a lot of servers. So, it is auto scaled down as required. This helps the client by cutting down on unnecessary server maintenance costs.

    + +

    Performance

    + +

    The servers will be upgraded to the latest generation of computing hardware when required by the cloud service provider. This is another layer of convenience to the client, since they don’t need to worry about operating on outdated hardware. +Cloud has benefits over a single corporate datacenter, including reduced network latency for the applications.

    + +

    Easy and fast deployments

    + +

    With the cloud, you can expand your application to new regions and deploy globally in minutes. It’s easier to expand the business all over the world with cloud instead of building data centers in all the regions and hiring people to manage them.

    + +

    Cloud native apps

    + +

    Cloud computing is used for building cloud native technologies and approaches like kubernetes for auto-scaling, microservices architecture, devOps etc. +CI/CD : Whenever a developer commits and pushes changes to the repository, the CI system will rebuild the branch and run all related test cases to verify that new changes won’t break the existing application and functionalities. Cloud resources can automatically scale up and down based on CI/CD workloads.

    + +

    DevOps

    + +

    The set of practices that combines software development and operations. Sometimes the development team and operations team work together for the entire software development lifecycle from developing, deploying to operations. +CI/CD is one of the best practices devops teams implement.

    + +

    DevOps automation is becoming cloud-centric. Most cloud providers support DevOps systemically on their platform, including continuous integration and continuous development tools. +This tight integration lowers the cost associated with on-premises DevOps automation technology, and provides centralized governance and control for a sound DevOps process.

    + +

    Cloud Services

    + +

    Cloud services

    + +

    Infrastructure as a Service(IaaS)

    + +

    This is the least abstracted service out of all the three. In this the user rents the resources, servers and then does the task of connecting the servers by themselves. +IaaS users manage applications, runtime, OSes, middleware, and data. However, cloud providers manage the servers, networking, virtualization, and storage. +Example: Google Cloud Platform

    + +

    Platform as a Service(PaaS)

    + +

    This is usually used by developers to code, build and run their code. This is done by using containerization/virtualization technology in the cloud. The servers, storage, and networking are managed by the cloud provider while the developers can maintain management of the applications. Developers can also use some of the APIs provided by the cloud. +Example: Repl.it, Heroku

    + +

    Software as a Service(SaaS)

    + +

    SaaS eliminates the need of the IT staff to install applications and their dependencies on each individual computer. SaaS applications are hosted as web apps. Users of SaaS applications don’t have to install them in order to use it. +Example: Salesforce, Google workspace

    + +

    Conclusion

    + +

    Cloud is really useful for startups by giving virtual data centres and a lot of other benefits mentioned above. It marked the beginning of a new era in the field of IT. Users are gradually moving from conventional computing to cloud computing. Using this technology, people with great business ideas will no longer need to spend a lot of money to buy computers but rather focus on building the business. +Cloud computing is still at its beginning stage and there is still so much potential it can have owing to the ongoing research and development.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/intro-to-pytorch/index.html b/blog/intro-to-pytorch/index.html new file mode 100644 index 0000000..b6e8115 --- /dev/null +++ b/blog/intro-to-pytorch/index.html @@ -0,0 +1,1410 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Open In Colab

    +

    An Introduction to PyTorch

    + +

    PyTorch was released in early 2017 by Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan and has been making a pretty big impact in the deep learning community. It's is a Python-based scientific computing package targeted to be a: (1) A replacement for NumPy to use the power of GPUs and (2) A deep learning research platform that provides maximum flexibility and speed. It's developed as an open source project by the Facebook AI Research team, and is being adopted by teams everywhere in industry and academia and is very comfortable to learn and use. It is based on the Torch library and has both a Python and C++ frontend(though the Python frontend is more 'polished'). PyTorch is also very pythonic, meaning, it feels more natural to use it if you already are a Python developer.

    + +

    What we'll see

    +


    +In this post, we will first look at the basics of Tensors(which are the building blocks of anything you do using PyTorch), and operations on them. We will then have a look at gradients and how they are computed in PyTorch. Finally we shall build a simple Neural Network for the IRIS dataset using PyTorch

    + +

    Prerequisites

    +

    Knowledge of Python(3.x) is required. Knowledge of NumPy will be useful but is not necessary. For the last part (of building a Neural Network), a basic understanding of a simple neural network is assumed

    + +

    Installation

    +

    Details of installation may be found here. However, to start off with, I would recommend using Google Colab or Microsoft Azure

    + +

    We'll first have a look at the building blocks of PyTorch (most other deep learning libraries also) which are Tensors.

    + +

    Tensors

    +

    All computations in PyTorch generally consist of operations on Tensors. Tensors can be thought of as a generalisation of vectors or matrices in 1 or more dimensions, or more simply, are like arrays in a programming language like C. In some cases tensors are used as a replacement for NumPy to use the power of GPUs A 1D Tensor is like a 1D array, 2D Tensor like a 2D array and so on. Let’s see how we can use them.

    + +

    Importing torch

    + +
    import torch
    +torch.__version__
    +
    +
    '1.1.0'
    +
    + +

    Tensors are available in the torch library as torch.Tensor. It is like a multidimensional array which can have elements of a single datatype. Computations between tensors are allowed only if the tensors share the same data type(dtype).

    + +

    First lets create a tensor from a python list:

    +
    myTensor = torch.tensor([1, 2, 3])
    +myTensor
    +
    +
    tensor([1, 2, 3])
    +
    + +


    + +
    myTensor1 = torch.tensor([[1, 2, 3.0], [4, 5, 6]])
    +myTensor1
    +
    +
    tensor([[1., 2., 3.],
    +        [4., 5., 6.]])
    +
    + +

    Above, we see that the function determines the data type based on the inputs. We may use different constructors to specify the data type we need as:

    + +
    fltTensor = torch.FloatTensor([1, 2, 3])
    +fltTensor
    +
    +
    tensor([1., 2., 3.]) <br>
    +
    + +
    intTensor = torch.IntTensor([1.0, 2.0, 3])
    +intTensor
    +
    +
    tensor([1, 2, 3], dtype=torch.int32) <br>
    +
    + +
    longTensor = torch.LongTensor([1.0, 2, 3])
    +longTensor
    +
    +
    tensor([1, 2, 3])
    +
    + +

    We may also achieve the above using the dtype attribute in torch.tensor:

    + +
    intTensor1 = torch.tensor([1.0, 2.0, 3], dtype = torch.int)
    +intTensor1
    +
    +
    tensor([1, 2, 3], dtype=torch.int32)
    +
    + +

    Note: There is a subtle difference between the functions torch.tensor and torch.Tensor. torch.Tensor is an alias to torch.FloatTensor whereas torch.tensor determines the data type based on the input.

    + +

    For more information on datatypes, check here.

    + +

    To and From a NumPy array

    + +

    Converting a torch tensor to a numpy array and vice versa is very easy and hence makes it easy to access other libraries like Scikit-Learn and Matplotlib

    + +
    import numpy as np
    +
    +


    + +
    arr = np.array([1,2,3,4,5])
    +print(arr)
    +print(arr.dtype)
    +print(type(arr))
    +
    +
    [1 2 3 4 5]
    +int32
    +<class 'numpy.ndarray'>
    +
    + +

    We can use torch.from_numpy or torch.as_tensor:

    + +


    + +
    x = torch.from_numpy(arr)
    +x
    +
    +
    tensor([1, 2, 3, 4, 5], dtype=torch.int32)
    +
    + +


    + +
    print(type(x))
    +print(x.type())
    +
    +
    <class 'torch.Tensor'>
    +torch.IntTensor
    +
    + +

    Note that we can also use torch.tensor for this:

    + +
    x1 = torch.tensor(arr)
    +x1
    +
    +
    tensor([1, 2, 3, 4, 5], dtype=torch.int32)
    +
    + +

    The difference between torch.tensor and torch.from_numpy(or torch.as_tensor) is that when we use the former, a copy of the original tensor is made and stored in x1(above). Any changes made to x1 will not affect arr(the numpy array) and vice versa. However, when we use the latter function, the tensor created (x in the example above) points to the same location in memory as does arr. Hence any changes done to x will also affect arr(the numpy array) and vice versa.

    + +
    # Using torch.from_numpy()
    +arr = np.arange(0,5)
    +t = torch.from_numpy(arr)
    +arr[2]=100
    +print(t)
    +
    +
    tensor([  0,   1, 100,   3,   4], dtype=torch.int32)
    +
    + +


    + +
    # Using torch.tensor()
    +arr = np.arange(0,5)
    +t = torch.tensor(arr)
    +arr[2]=100
    +print(t)
    +
    +
    tensor([0, 1, 2, 3, 4], dtype=torch.int32)
    +
    + +

    Creating special types of tensors

    + +

    Uninitialized tensors using torch.empty()

    + +
    x = torch.empty(5, 4)
    +print(x)
    +
    +
    tensor([[0., 0., 0., 0.],
    +        [0., 0., 0., 0.],
    +        [0., 0., 0., 0.],
    +        [0., 0., 0., 0.],
    +        [0., 0., 0., 0.]])
    +
    + +

    Initialised with zeroes or ones using torch.zeros() and torch.ones()

    + +
    # Passing datatype is recommended but not compulsory
    +x = torch.zeros(4, 3, dtype=torch.int64)
    +print(x)
    +
    +
    tensor([[0, 0, 0],
    +        [0, 0, 0],
    +        [0, 0, 0],
    +        [0, 0, 0]])
    +
    + +

    Tensors in a range using torch.arange(start,end,step) and torch.linspace(start,end,number_of_elements)

    + +
    x = torch.arange(0,50,5).reshape(5,2) # 0 included, 50 excluded
    +print(x)
    +
    +
    tensor([[ 0,  5],
    +        [10, 15],
    +        [20, 25],
    +        [30, 35],
    +        [40, 45]])
    +
    + +

    Tensor to create 12 linearly spaced elements between 0 and 50 both included

    + +
    x = torch.linspace(0,50,12).reshape(3,4) 
    +print(x)
    +
    +
    tensor([[ 0.0000,  4.5455,  9.0909, 13.6364],
    +        [18.1818, 22.7273, 27.2727, 31.8182],
    +        [36.3636, 40.9091, 45.4545, 50.0000]])
    +
    + +

    A seed for random numbers can be set using torch.manual_seed().

    + +
    torch.manual_seed(10)
    +
    +
    <torch._C.Generator at 0x1bb6e171030>
    +
    + +

    Generating random tensors:

    + +

    A tensor of shape (3, 4) with random numbers from a uniform distribution over [0, 1)

    + +
    x = torch.rand(3, 4) 
    +x
    +
    +
    tensor([[0.9712, 0.0742, 0.5130, 0.7472],
    +        [0.4507, 0.9223, 0.9148, 0.1624],
    +        [0.7780, 0.1663, 0.6665, 0.4992]])
    +
    + +

    A tensor with shape (3, 4) with numbers from the normal distribution with mean 0 and standard deviation 1.

    + +
    x = torch.randn(3, 4) 
    +x
    +
    +
    tensor([[ 0.5252,  2.0810,  1.5700, -0.1474],
    +        [-0.2024,  0.4377,  1.1986,  0.7179],
    +        [-0.4969,  0.8618, -0.2603, -1.1157]])
    +
    + +

    A tensor of shape (3, 4) with random integers between 0 and 10

    + +
    x = torch.randint(0, 10, (3, 4)) 
    +x
    +
    +
    tensor([[7, 7, 1, 4],
    +        [7, 4, 9, 5],
    +        [1, 2, 5, 6]])
    +
    + +

    Instead of specifying the sizes of the tensors, we can use three other functions which serve the same purpose as above nute take in other tensors as inputs and return tensors of their shapes. Just suffix _like to the above functions as below:

    + +
    x = torch.rand(3, 4) 
    +y = torch.rand_like(x) 
    +y
    +
    +
    tensor([[0.3099, 0.0135, 0.2955, 0.8752],
    +        [0.7608, 0.7589, 0.2097, 0.4063],
    +        [0.6469, 0.3655, 0.3926, 0.6284]])
    +
    + +

    Similarly torch.randn_like(x), torch.randint_like(0,10,x), torch.zeros_like(x) and torch.ones_like(x) may also be used.

    + +

    Operations on Tensors

    + +

    Now we will look at a few basic operations on Tensors. Indexing and slicing tensors are very similar to those of python lists. We shall look at a few examples

    + +
    x = torch.arange(6).reshape(3,2)
    +print(x)
    +
    +
    tensor([[0, 1],
    +        [2, 3],
    +        [4, 5]])
    +
    + +

    To get the left column:

    + +
    x[:,0]
    +
    +
    tensor([0, 2, 4])
    +
    + +

    To get the left column as a (3,1) slice:

    + +
    x[:,:1]
    +
    +
    tensor([[0],
    +        [2],
    +        [4]])
    +
    + +

    Reshaping a Tensor

    + +

    Two functions are generally used for reshaping tensor which are .view() and .reshape(). Both functions return a reshaped tensor without affecting the original tensor.

    + +
    x = torch.arange(10)
    +x
    +
    +
    tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) <br>
    +
    + +
    x.view(5, 2)
    +
    +
    tensor([[0, 1],
    +        [2, 3],
    +        [4, 5],
    +        [6, 7],
    +        [8, 9]])
    +
    + +

    However, we see that x is unchanged

    + +
    x 
    +
    +
    tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    +
    + +


    + +
    x.reshape(5, 2)
    +
    +
    tensor([[0, 1],
    +        [2, 3],
    +        [4, 5],
    +        [6, 7],
    +        [8, 9]]) <br>
    +
    + +
    x # Unchanged
    +
    +
    tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    +
    + +

    To change the original tensor use x = x.reshape(2, 5)

    + +

    While .view() returns a tensor which shares storage with the original tensor, .reshape() may return a copy or a view of the original tensor. It (.reshape()) may or may not share the storage with the original tensor. Also .reshape() may act on contiguous or non contiguous tensors, while .view can act only on contiguous tensors.

    + +

    We can also infer the correct value for shape from the tensor by passing -1.

    + +
    x = x.view(2, -1)
    +x
    +
    +
    tensor([[0, 1, 2, 3, 4],
    +        [5, 6, 7, 8, 9]])
    +
    + +

    Also as seen before, we can suffix the function with ‘_as’ to pass in a tensor whose shape, we want to reshape the original tensor to.

    + +
    y = torch.arange(0, 20, 2)
    +y
    +
    +
    tensor([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
    +
    + +


    + +
    y = y.view_as(x)
    +y
    +
    +
    tensor([[ 0,  2,  4,  6,  8],
    +        [10, 12, 14, 16, 18]])
    +
    + +

    Other Basic Operations

    + +

    I will demonstrate the use of basic operations using the torch.add() function. This may be extended to other functions also.

    + +
    a = torch.tensor([1,2], dtype=torch.float)
    +b = torch.tensor([3,4], dtype=torch.float)
    +print(a + b)
    +
    +
    tensor([4., 6.])
    +
    + +


    + +
    torch.add(a, b)
    +
    +
    tensor([4., 6.])
    +
    + +


    + +
    c = torch.empty(2)
    +torch.add(a, b, out = c) #Equivalent to c = torch.add(a, b)
    +
    +
    tensor([4., 6.])
    +
    + +


    + +
    a.add_(b) #Equivalent tp a = torch.add(a,b)
    +a
    +
    +
    tensor([4., 6.])
    +
    + +

    The above can be extended to all basic arithmetic operations. Now we will look at a few more operations

    + +
    # Multiplication (element-wise)
    +a = torch.tensor([1,2], dtype=torch.float)
    +b = torch.tensor([3,4], dtype=torch.float)
    +torch.mul(a, b)
    +
    +
    tensor([3., 8.])
    +
    + +


    + +
    # Dot Product
    +torch.dot(a, b)
    +
    +
    tensor(11.)
    +
    + +

    Now let us see matrix multiplication. Normal matrix multiplication (that we know of) can be done using torch.mm()

    + +
    a = torch.tensor([[0,2,4],[1,3,5]], dtype=torch.float)
    +b = torch.tensor([[6,7],[8,9],[10,11]], dtype=torch.float)
    +
    +print('a: ',a.size())
    +print('b: ',b.size())
    +print('a x b: ',torch.mm(a,b).size())
    +
    +
    a:  torch.Size([2, 3])
    +b:  torch.Size([3, 2])
    +a x b:  torch.Size([2, 2])
    +
    + +


    + +
    torch.mm(a,b)
    +
    +
    tensor([[56., 62.],
    +        [80., 89.]])
    +
    + +


    + +
    a @ b
    +
    +
    tensor([[56., 62.],
    +        [80., 89.]])
    +
    + +

    Matrix multiplication can also be done with boradcasting using the torch.matmul() or @ operator. Click here for more details on broadcasting.

    + +
    a = torch.randn(2, 3, 4)
    +b = torch.randn(4, 5)
    +
    +print(torch.matmul(a, b).size())
    +print((a @ b).size())
    +
    +
    torch.Size([2, 3, 5])
    +torch.Size([2, 3, 5])
    +
    + +

    But we see that there matrices are invalid for normal matrix multiplication

    + +
    print(torch.mm(a,b)) 
    +
    +
    ---------------------------------------------------------------------------
    +
    +RuntimeError                              Traceback (most recent call last)
    +
    +<ipython-input-93-244d2942b50e> in <module>
    +----> 1 print(torch.mm(a,b))
    +
    +
    +RuntimeError: matrices expected, got 3D, 2D tensors at ..\aten\src\TH/generic/THTensorMath.cpp:956
    +
    + +

    Note that if the tensors satisfy the mathematical conditions of matric multiplication, then all the three above functions will be identical. It is however easier to detect errors using torch.mm() than the other two when the tensors are mathematically non-compatible and hence is recommended over the other two.

    + +

    Norm Function

    + +
    x = torch.tensor([2.,5.,8.,14.])
    +x.norm()
    +
    +
    tensor(17.)
    +
    + +

    Gradients in PyTorch

    + +

    PyTorch provides a module called ‘autograd’ to calculate the gradients of tensors automatically. It basically keeps track of all operations done on the tensor and backtracks along these operations to calculate gradients(or derivatives) along the way. To ensure that the operations are kept track of, we need to set the requires_grad attribute to True which can be done in two ways: (1) while creation, set the attribute to True as x = torch.arange(10, requires_grad = True) or (2) after creation, use x.requires_grad_(True). The gradients are computed with respect to some variable y as y.backward(). This goes though all operations which were used to create y and calculates the gradients. For example:

    + +
    x = torch.tensor(3.0, requires_grad = True)
    +
    +


    + +
    y = 2 * x ** 2 + 3
    +print(y) # Substitutes the value of x = 3 in the equation
    +
    +
    tensor(21., grad_fn=<AddBackward0>)
    +
    + +

    Explanation

    + +
    #Perform backpropagation on y to calculate gradients
    +y.backward()
    +
    +


    + +
    #Display the gradient wrt x
    +x.grad
    +
    +
    tensor(12.)
    +
    + +

    Explanation

    + +

    Calculating multi-level gradients

    + +
    x = torch.tensor([[1.,2,3],[3,2,1]], requires_grad=True)
    +print(x)
    +
    +
    tensor([[1., 2., 3.],
    +        [3., 2., 1.]], requires_grad=True)
    +
    + +


    + +
    y = 2*x + 3
    +print(y)
    +
    +
    tensor([[5., 7., 9.],
    +        [9., 7., 5.]], grad_fn=<AddBackward0>)
    +
    + +


    + +
    z = 2*y**2
    +print(z)
    +
    +
    tensor([[ 50.,  98., 162.],
    +        [162.,  98.,  50.]], grad_fn=<MulBackward0>)
    +
    + +


    + +
    out = z.sum()
    +print(out)
    +
    +
    tensor(620., grad_fn=<SumBackward0>)
    +
    + +


    + +
    out.backward()
    +
    +


    + +
    print(x.grad)
    +
    +
    tensor([[40., 56., 72.],
    +        [72., 56., 40.]])
    +
    + +

    Explanation

    + +

    Turning off tracking

    + +

    There may be times when we don’t want or need to track the computational history.

    + +

    You can reset a tensor’s requires_grad attribute in-place using .requires_grad_(True) (or False) as needed.

    + +

    When performing evaluations, it’s often helpful to wrap a set of operations in with torch.no_grad():

    + +

    A less-used method is to run .detach() on a tensor to prevent future computations from being tracked. This can be handy when cloning a tensor.

    + +

    Building a Simple Neural Network

    + +

    Note that the rest of the article will need some knowledge of Machine Learning or Neural Networks.
    +We will discover other features like Dataloaders, Criterions and Optimizers using an example on the IRIS Dataset

    + +
    import pandas as pd
    +import numpy as np
    +import torch
    +
    +df = pd.read_csv('iris.csv')
    +df.head()
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)target
    05.13.51.40.20.0
    14.93.01.40.20.0
    24.73.21.30.20.0
    34.63.11.50.20.0
    45.03.61.40.20.0
    +
    + +

    PyTorch has 2 really useful libraries for Neral Networks:

    +
      +
    1. torch.nn generally imported as nn
    2. +
    3. torch.nn.functional generally imported as F
    4. +
    + +
    import torch.nn as nn
    +import torch.nn.functional as F
    +from torch.utils.data import Dataset, DataLoader, TensorDataset
    +from sklearn.model_selection import train_test_split
    +
    + +
    X = df.drop('target',axis=1).values
    +y = df['target'].values
    +
    +X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=100)
    +
    +X_train = torch.FloatTensor(X_train)
    +X_test = torch.FloatTensor(X_test)
    +
    +# One Hot Encoding
    +y_train = torch.LongTensor(y_train)  
    +y_test = torch.LongTensor(y_test)
    +
    +

    To convert the training tensors into a dataset and to make things like batch gradient descent easier, we may use the TensorDataset and DataLoader classes.

    + +
    trainset = TensorDataset(X_train, y_train)
    +
    + +

    We will create batches of size 30. We will shuffle the training data so that the batches are not biased. However this is not necessary for the test data.

    + +
    trainloader = DataLoader(trainset, batch_size=30, shuffle=True)
    +testloader = DataLoader(X_test, batch_size=30, shuffle=False)
    +
    + +

    To access the batches:

    + +
    # 4 batches. Each batch is two-dimensional, one for the features(X) and other for the classes(y).
    +for batch in trainloader:
    +    print(len(batch))
    +
    +
    2
    +2
    +2
    +2
    +
    + +


    + +
    # To access the index, X data and Y data
    +for i, (x,y) in enumerate(trainloader):
    +    print(i, x, y)
    +    print()
    +
    + +
    0 tensor([[5.7000, 2.9000, 4.2000, 1.3000],
    +        [7.4000, 2.8000, 6.1000, 1.9000],
    +        [6.9000, 3.1000, 5.1000, 2.3000],
    +        [5.3000, 3.7000, 1.5000, 0.2000],
    +        [5.4000, 3.0000, 4.5000, 1.5000],
    +        [5.5000, 4.2000, 1.4000, 0.2000],
    +        [6.1000, 2.6000, 5.6000, 1.4000],
    +        [5.5000, 2.6000, 4.4000, 1.2000],
    +        [6.0000, 3.4000, 4.5000, 1.6000],
    +        [5.7000, 2.5000, 5.0000, 2.0000],
    +        [4.4000, 3.2000, 1.3000, 0.2000],
    +        [5.0000, 3.6000, 1.4000, 0.2000],
    +        [4.9000, 3.1000, 1.5000, 0.1000],
    +        [7.0000, 3.2000, 4.7000, 1.4000],
    +        [6.3000, 2.5000, 4.9000, 1.5000],
    +        [6.1000, 2.8000, 4.0000, 1.3000],
    +        [6.5000, 3.0000, 5.8000, 2.2000],
    +        [5.1000, 3.8000, 1.5000, 0.3000],
    +        [5.0000, 3.0000, 1.6000, 0.2000],
    +        [4.6000, 3.6000, 1.0000, 0.2000],
    +        [5.7000, 2.8000, 4.5000, 1.3000],
    +        [4.9000, 3.1000, 1.5000, 0.1000],
    +        [5.8000, 2.7000, 4.1000, 1.0000],
    +        [5.1000, 3.3000, 1.7000, 0.5000],
    +        [4.4000, 2.9000, 1.4000, 0.2000],
    +        [6.2000, 2.2000, 4.5000, 1.5000],
    +        [7.9000, 3.8000, 6.4000, 2.0000],
    +        [7.7000, 3.8000, 6.7000, 2.2000],
    +        [6.3000, 2.9000, 5.6000, 1.8000],
    +        [5.5000, 2.5000, 4.0000, 1.3000]]) tensor([1, 2, 2, 0, 1, 0, 2, 1, 1, 2, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 1, 0, 1, 0,
    +        0, 1, 2, 2, 2, 1])
    +
    +1 tensor([[5.0000, 3.2000, 1.2000, 0.2000],
    +        [4.9000, 3.1000, 1.5000, 0.1000],
    +        [6.7000, 3.3000, 5.7000, 2.1000],
    +        [5.5000, 3.5000, 1.3000, 0.2000],
    +        [5.4000, 3.9000, 1.7000, 0.4000],
    +        [6.0000, 3.0000, 4.8000, 1.8000],
    +        [5.1000, 2.5000, 3.0000, 1.1000],
    +        [5.9000, 3.0000, 4.2000, 1.5000],
    +        [7.6000, 3.0000, 6.6000, 2.1000],
    +        [6.4000, 2.7000, 5.3000, 1.9000],
    +        [5.1000, 3.8000, 1.6000, 0.2000],
    +        [6.9000, 3.1000, 5.4000, 2.1000],
    +        [7.2000, 3.6000, 6.1000, 2.5000],
    +        [5.1000, 3.5000, 1.4000, 0.2000],
    +        [6.5000, 3.2000, 5.1000, 2.0000],
    +        [5.5000, 2.4000, 3.7000, 1.0000],
    +        [5.6000, 2.8000, 4.9000, 2.0000],
    +        [6.3000, 3.4000, 5.6000, 2.4000],
    +        [7.3000, 2.9000, 6.3000, 1.8000],
    +        [5.9000, 3.2000, 4.8000, 1.8000],
    +        [6.8000, 2.8000, 4.8000, 1.4000],
    +        [4.9000, 2.5000, 4.5000, 1.7000],
    +        [5.1000, 3.5000, 1.4000, 0.3000],
    +        [6.2000, 3.4000, 5.4000, 2.3000],
    +        [5.7000, 2.8000, 4.1000, 1.3000],
    +        [6.1000, 3.0000, 4.9000, 1.8000],
    +        [5.5000, 2.4000, 3.8000, 1.1000],
    +        [5.7000, 2.6000, 3.5000, 1.0000],
    +        [5.0000, 3.5000, 1.6000, 0.6000],
    +        [5.6000, 2.7000, 4.2000, 1.3000]]) tensor([0, 0, 2, 0, 0, 2, 1, 1, 2, 2, 0, 2, 2, 0, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2,
    +        1, 2, 1, 1, 0, 1])
    +
    +2 tensor([[5.0000, 3.3000, 1.4000, 0.2000],
    +        [5.8000, 2.6000, 4.0000, 1.2000],
    +        [5.6000, 3.0000, 4.1000, 1.3000],
    +        [5.0000, 2.0000, 3.5000, 1.0000],
    +        [6.4000, 2.9000, 4.3000, 1.3000],
    +        [5.1000, 3.8000, 1.9000, 0.4000],
    +        [5.6000, 2.9000, 3.6000, 1.3000],
    +        [6.7000, 3.1000, 4.4000, 1.4000],
    +        [6.1000, 3.0000, 4.6000, 1.4000],
    +        [4.5000, 2.3000, 1.3000, 0.3000],
    +        [6.7000, 3.1000, 5.6000, 2.4000],
    +        [5.7000, 3.8000, 1.7000, 0.3000],
    +        [4.8000, 3.1000, 1.6000, 0.2000],
    +        [6.5000, 2.8000, 4.6000, 1.5000],
    +        [6.0000, 2.2000, 5.0000, 1.5000],
    +        [6.5000, 3.0000, 5.2000, 2.0000],
    +        [6.3000, 3.3000, 6.0000, 2.5000],
    +        [4.9000, 2.4000, 3.3000, 1.0000],
    +        [7.1000, 3.0000, 5.9000, 2.1000],
    +        [4.4000, 3.0000, 1.3000, 0.2000],
    +        [6.4000, 3.2000, 4.5000, 1.5000],
    +        [5.0000, 2.3000, 3.3000, 1.0000],
    +        [6.7000, 3.1000, 4.7000, 1.5000],
    +        [5.4000, 3.7000, 1.5000, 0.2000],
    +        [6.3000, 3.3000, 4.7000, 1.6000],
    +        [5.1000, 3.7000, 1.5000, 0.4000],
    +        [6.1000, 2.9000, 4.7000, 1.4000],
    +        [5.2000, 2.7000, 3.9000, 1.4000],
    +        [5.1000, 3.4000, 1.5000, 0.2000],
    +        [4.8000, 3.4000, 1.9000, 0.2000]]) tensor([0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 2, 0, 0, 1, 2, 2, 2, 1, 2, 0, 1, 1, 1, 0,
    +        1, 0, 1, 1, 0, 0])
    +
    +3 tensor([[4.3000, 3.0000, 1.1000, 0.1000],
    +        [6.4000, 3.1000, 5.5000, 1.8000],
    +        [6.9000, 3.1000, 4.9000, 1.5000],
    +        [5.6000, 3.0000, 4.5000, 1.5000],
    +        [6.0000, 2.9000, 4.5000, 1.5000],
    +        [7.2000, 3.0000, 5.8000, 1.6000],
    +        [6.6000, 2.9000, 4.6000, 1.3000],
    +        [5.8000, 2.7000, 5.1000, 1.9000],
    +        [5.0000, 3.4000, 1.5000, 0.2000],
    +        [6.3000, 2.8000, 5.1000, 1.5000],
    +        [6.2000, 2.8000, 4.8000, 1.8000],
    +        [4.7000, 3.2000, 1.3000, 0.2000],
    +        [5.7000, 3.0000, 4.2000, 1.2000],
    +        [4.6000, 3.1000, 1.5000, 0.2000],
    +        [4.6000, 3.2000, 1.4000, 0.2000],
    +        [6.7000, 2.5000, 5.8000, 1.8000],
    +        [5.8000, 2.7000, 3.9000, 1.2000],
    +        [4.6000, 3.4000, 1.4000, 0.3000],
    +        [6.3000, 2.3000, 4.4000, 1.3000],
    +        [6.0000, 2.7000, 5.1000, 1.6000],
    +        [5.2000, 3.5000, 1.5000, 0.2000],
    +        [5.5000, 2.3000, 4.0000, 1.3000],
    +        [5.8000, 2.8000, 5.1000, 2.4000],
    +        [5.8000, 4.0000, 1.2000, 0.2000],
    +        [4.8000, 3.0000, 1.4000, 0.1000],
    +        [6.4000, 2.8000, 5.6000, 2.2000],
    +        [6.8000, 3.2000, 5.9000, 2.3000],
    +        [5.8000, 2.7000, 5.1000, 1.9000],
    +        [6.7000, 3.3000, 5.7000, 2.5000],
    +        [5.4000, 3.9000, 1.3000, 0.4000]]) tensor([0, 2, 1, 1, 1, 2, 1, 2, 0, 2, 2, 0, 1, 0, 0, 2, 1, 0, 1, 1, 0, 1, 2, 0,
    +        0, 2, 2, 2, 2, 0])
    +
    + +

    Creating the Model Class
    +To define a Neural Network, we need to define a class which inherits from the nn.Module class. Here is where we can define all the layers, activation functions, embeddings etc. Here we will create a simple model with 2 hidden layers:

    + +
    class Model(nn.Module):
    +    def __init__(self, in_features=4, h1=10, h2=10, out_features=3):
    +        super().__init__()
    +        self.fc1 = nn.Linear(in_features,h1)    # input layer
    +        self.fc2 = nn.Linear(h1, h2)            # hidden layer
    +        self.out = nn.Linear(h2, out_features)  # output layer
    +        
    +    def forward(self, x):
    +        # Define the activation functions for the layers
    +        x = F.relu(self.fc1(x))
    +        x = F.relu(self.fc2(x))
    +        x = F.sigmoid(self.out(x))
    +        return x
    +
    + +


    + +
    # Instantiate the Model class using parameter defaults:
    +model = Model()
    +
    + +

    Defining the loss function and optimizer:
    +The loss function is conventionally defined as criterion. THe various loss functions are available in torch.nn library and the optimizers are available in the torch.optim library. Here we will use Cross Entropy Loss and the Adam Optimizer

    + +
    criterion = nn.CrossEntropyLoss()
    +optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # lr: Learning Rate
    +
    + +

    Training the model

    + +
    epochs = 100
    +losses = []
    +
    +for i in range(epochs):
    +    i+=1
    +    for j, (X, y) in enumerate(trainloader):
    +        y_pred = model.forward(X)
    +        loss = criterion(y_pred, y)
    +        losses.append(loss)
    +        optimizer.zero_grad()
    +        loss.backward()
    +        optimizer.step()
    +    
    +    
    +    if i%10 == 1:
    +        print(f'epoch: {i:2}  loss: {loss.item():10.8f}')
    +
    +
    +
    +
    epoch:  1  loss: 1.09409952
    +epoch: 11  loss: 0.96279073
    +epoch: 21  loss: 0.87627226
    +epoch: 31  loss: 0.72676194
    +epoch: 41  loss: 0.66376936
    +epoch: 51  loss: 0.68377405
    +epoch: 61  loss: 0.68355846
    +epoch: 71  loss: 0.64891487
    +epoch: 81  loss: 0.66468638
    +epoch: 91  loss: 0.66344351
    +
    + +

    Above, since the backward() function accumulates gradients, to avoid mixing up of gradients between minibatches, you have to zero them out beore backpropagating on the next batch. optimizer.zero_grad() is used for this. optimizer.step performs a parameter update based on the current gradient (stored in .grad attribute of a parameter) and the update rule

    + +
    import matplotlib.pyplot as plt
    +%matplotlib inline
    +plt.plot(range(epochs*4), losses) #epochs*4 because each epoch is made of 4 batches and for each of them a loss is calculated
    +plt.ylabel('Loss')
    +plt.xlabel('epoch');
    +
    +

    graph

    + +

    Saving the Model’s Parameters

    + +
    torch.save(model.state_dict(), 'IrisDatasetModel.pt')
    +
    + +

    Only the parameters of the model are saved and not the model itself. +For more information on saving and loading visit https://pytorch.org/tutorials/beginner/saving_loading_models.html

    + +

    Loading a Model

    + +

    We’ll load a new model object and test it as we had before to make sure it worked.

    + +
    new_model = Model()
    +new_model.load_state_dict(torch.load('IrisDatasetModel.pt'))
    +new_model.eval()
    +
    +
    Model(
    +  (fc1): Linear(in_features=4, out_features=10, bias=True)
    +  (fc2): Linear(in_features=10, out_features=10, bias=True)
    +  (out): Linear(in_features=10, out_features=3, bias=True)
    +)
    +
    + +
    with torch.no_grad():
    +    y_val = new_model.forward(X_test)
    +    loss = criterion(y_val, y_test)
    +print(f'{loss:.8f}')
    +
    +
    0.69291312
    +
    + +

    References:

    +
      +
    1. https://pytorch.org/docs/stable/index.html
    2. +
    3. https://www.udacity.com/course/deep-learning-pytorch–ud188
    4. +
    5. https://stackoverflow.com/questions/49643225/whats-the-difference-between-reshape-and-view-in-pytorch
    6. +
    7. https://en.wikipedia.org/wiki/PyTorch
    8. +
    9. https://www.analyticsvidhya.com/blog/2018/02/pytorch-tutorial/
    10. +
    11. https://www.analyticsvidhya.com/blog/2019/09/introduction-to-pytorch-from-scratch/
    12. +
    + +

    Open In Colab

    + +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/introduction-to-docker/index.html b/blog/introduction-to-docker/index.html new file mode 100644 index 0000000..82cc03a --- /dev/null +++ b/blog/introduction-to-docker/index.html @@ -0,0 +1,527 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Docker is probably the most talked-about infrastructure technology of the past few years. And why not? It makes managing and deploying applications so much easier without the overhead of a Virtual Machine. Here’s how:

    + +

    Docker is a tool designed to make it easier to create, deploy, and run applications by using containers. Containers allow a developer to package up an application with all of the parts it needs, such as libraries and other dependencies, and ship it all out as one package. By doing so, thanks to the container the developer can rest assured that the application will run on any other machine regardless of any customized settings that machine might have that could differ from the machine used for writing and testing the code.

    + +

    In a way, Docker is a bit like a virtual machine. But unlike a virtual machine, rather than creating a whole virtual operating system, Docker allows applications to use the same Linux kernel as the system that they’re running on and only requires applications be shipped with things not already running on the host computer. This gives a significant performance boost and reduces the size of the application.

    + +

    Containers

    + +

    An image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the code, a runtime, libraries, environment variables, and config files.

    + +

    A container is a runtime instance of an image—what the image becomes in memory when actually executed. It runs completely isolated from the host environment by default, only accessing host files and ports if configured to do so.

    + +

    Containers run apps natively on the host machine’s kernel. They have better performance characteristics than virtual machines that only get virtual access to host resources through a hypervisor. Containers can get native access, each one running in a discrete process, taking no more memory than any other executable.

    + +

    Containers vs. Virtual Machines

    + +

    Containers vs VM

    + +

    Virtual Machines run guest operating systems—note the OS layer in each box. This is resource intensive and the resulting disk image and application state is an entanglement of OS settings, system-installed dependencies, OS security patches, and other easy-to-lose, hard-to-replicate ephemera.

    + +

    Containers can share a single kernel, and the only information that needs to be in a container image is the executable and its package dependencies, which never need to be installed on the host system. These processes run like native processes, and you can manage them individually by running commands like docker ps—just like you would run ps on Linux to see active processes. Finally, because they contain all their dependencies, there is no configuration entanglement; a containerized app “runs anywhere”.

    + +

    Who is Docker for?

    + +

    Docker is a tool that is designed to benefit both developers and system administrators, making it a part of many DevOps (developers + operations) toolchains. For developers, it means that they can focus on writing code without worrying about the system that it will ultimately be running on. It also allows them to get a head start by using one of thousands of programs already designed to run in a Docker container as a part of their application. For operations, Docker gives flexibility and potentially reduces the number of systems needed because of its small footprint and lower overhead.

    + +

    In a nutshell, here’s what Docker can do for you:

    + +

    It can get more applications running on the same hardware than other technologies; it makes it easy for developers to quickly create ready-to-run containered applications; and it makes managing and deploying applications much easier. Put it all together and I can see why Docker is riding the hype cycle as fast as I can recall ever seeing an enterprise technology go.

    + +

    Setup

    + +

    Docker is available on multiple platforms, on cloud and on-premises. It can be downloaded and installed by following the instructions here

    + +
    +

    Installation on Windows and Mac OS have standalone install packages with some prerequisites for the OS. +If your system does not meet the requirements, you can install Docker Toolbox.

    +
    + +

    You should be able to run docker run hello-world and see a response like this:

    + +
    $ docker run hello-world
    +
    +Hello from Docker!
    +This message shows that your installation appears to be working correctly.
    +
    +To generate this message, Docker took the following steps:
    +...(snipped)...
    +
    + +
    +

    Note: version 1.13 or higher is required

    +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/introduction-to-gpu-computing/index.html b/blog/introduction-to-gpu-computing/index.html new file mode 100644 index 0000000..99cabe7 --- /dev/null +++ b/blog/introduction-to-gpu-computing/index.html @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A Gamer’s priced possession - Graphic Cards!

    + +

    Let’s say that you have bought a brand new computer with one of the latest i7 processors but without installing a separate graphics card. And your friend is still using his 5 year PC with an old i3 processor, but with a high end graphics card installed. Both of you play the same game simultaneously on your own computers. But you notice that the gaming performance is better on his PC even though your computer is brand new. You scratch your head not understanding what’s going on here. You have a much better CPU and everyone knows that the CPU is the “brain” or the mastermind of the computer.

    + +

    GPU

    + +

    So lets dive a bit deeper into the technical details. Most of you may already know - GPU stands for Graphics Processing Unit and CPU stands for Central Processing Unit. Both of them are basically microprocessor chips that reside on a PCB board (A CPU resides on a motherboard while a GPU resides on a graphics card board). From a high level point of view, both of them appear to be the same. After all, they are just crunching a lot of numbers in binary, your typical 0s and 1s, +’s and -‘s. So what is the need of a separate GPU when the CPU is capable of doing the same tasks?

    + +

    CPU vs GPU

    + +

    The difference between the two comes in the way they are designed. What tasks can both of them can handle, how fast or efficiently do they handle the same task, how well do they manage multiple tasks together. Things like that.

    + +

    CPU vs GPU

    + +

    CPUs are general purpose processors that are designed to handle a very wide range of tasks. Be it some simple addition, multiplication operations, browsing the internet, playing audio/videos, creating/deleting/searching files in your PC etc. But a CPU has a limited number of cores or processing units. A dual-core CPU has 2 cores, each of which can run only a single process or task simultaneously. (Of course, it is possible to execute multiple processes virtually on each core by the means of hyper-threading where a single core is split into various logical CPUs. Read more about multi core CPUs and hyper-threading over here).

    + +

    GPUs are processors that are designed to take a very specialist workload of rendering 2D/3D graphics and it does it much more efficiently. GPUs generally have around hundreds of cores as compared to a CPU. So given a task - lets say adding 2 matrices having a dimension of 1000 x 1000, the GPU can divide the work or region of data to compute among all the cores, which work in parallel and produce the result almost immediately.

    + +

    However, a single GPU core has a much lower performance as compared to a single CPU core due to following reasons:

    +
      +
    1. GPU cores have a lesser clock frequency (proportional to number of instructions executed per second) as compared to a typical CPU core.
    2. +
    3. GPUs have a smaller instruction set. They deal with mostly floating point arithmetic and instructions like branch predictors are absent. Hence, they struggle while dealing with a lot of conditional statements.
    4. +
    5. They have smaller cache sizes.
    6. +
    7. Hyper-threading is not present in a single GPU core.
    8. +
    + +

    GPUs rely mainly on their massively parallel structure. Lets say you give the GPU 2 numbers to add. Sure, you might say it calculates the result slower than a CPU. But if you give the same GPU a million numbers to add, it will return the result almost instantly as compared to a CPU. So what the GPU cares about is not the time taken to do an individual task, but rather what it does when bulk data is given to it.

    + +

    Why is the job of rendering graphics suitable for a GPU?

    + +

    Need For Speed

    + +

    Say you’re playing Need for speed. What exactly happens while rendering the game screen graphics? Usually, the data is given in the form of a 3D model. So basically there is a car of so and so height, width and depth situated at some position given by a set of 3D coordinates in the world. Similarly, there are buildings, trees, people etc. which are the objects of your world. So firstly, you get the coordinate data which says where exactly is something located. Then you get the information about the color of objects. This is also called the texture. Now, we divide the complex surfaces into smaller triangles or quadrilaterals as they are simple shapes that can be managed easily. Any complex shapes in this world can be broken into triangles. The more the number of triangles you have, the more detailed your objects are.

    + +

    Rabbit

    + +

    Next, you have a “camera” or the place and angle that you are viewing the entire scene from. Obviously, you can see only 2D images on a computer screen, so the 3D objects in your model have to be projected onto a 2D screen. Firstly, you discard or keep aside the objects that are not visible to your camera and then proceed towards projected all objects in what is called the camera’s view space onto a 2D screen. This is followed by rasterization which is to convert the image in vector graphics format to pixels for output on a display screen. After all this, you proceed towards moving your camera so that it gives an impression of moving in a 3D world.

    + +

    3D v/s 2D

    + +

    So as you can see, there are different types of calculations happening which involves mostly three dimensional matrix operations, representing the 3D coordinates, the RGB values for the colors, and transferring all the pixels of the image into a memory buffer. Floating point arithmetic operations need to be supported as the coordinates are all floating point numbers. A lot of three dimensional plane equations need to be solved. Most of these operations can be parallelized because the results do not depend on each other. If there is an operation which say has to be done for every vertex in our model, or every pixel in the image, since there are millions of such vertices and pixels, we can divide the data into batches, and compute all units in a batch independently and in parallel. This kind of work is exactly what a GPU is designed for.

    + +

    General Purpose GPU Computing

    + +

    GPU Acceleration

    + +

    Over the years, people realized that some types of computational work can be done better by a GPU as compared to a CPU. They realized this could be applied in situations where the data in motion moves much like images, and the required processing is well-suited for vector and matrix mathematical operations. Subsequently, the term “General Purpose GPUs” or GPGPUs was coined and GPU accelerating computing was used to accelerate applications such as deep learning, analytics, scientific computations etc. Frameworks such as OpenCL, CUDA etc. came into existence that abstracted away the underlying GPGPU architecture that made it easier for programmers to work with it. GPU-accelerated computing offloads compute-intensive portions of the application from the CPU to the GPU, while the remainder of the code still runs on the CPU. From a user’s perspective, applications simply run much faster.

    + +

    Interested to learn more about GPU Computing?

    + +

    Great! :) You could get started with learning how to code using one of the frameworks used for heterogeneous parallel computing such as OpenCL or CUDA C/C++ and maybe try out a few programs on your own. (Although, first check if your graphics card is compatible with these frameworks)

    + +

    Links:

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/introduction-to-ieee/index.html b/blog/introduction-to-ieee/index.html new file mode 100644 index 0000000..d95a8b0 --- /dev/null +++ b/blog/introduction-to-ieee/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    IEEE is the world’s largest professional association advancing innovation and technological excellence for the benefit of humanity. IEEE and its members inspire a global community to innovate for a better tomorrow through its highly-cited publications, conferences, technology standards, and professional and educational activities. IEEE is the trusted “voice” for engineering, computing and technology information around the globe.

    + +

    IEEE is incorporated under the Not-for-Profit Corporation Law of the state of New York. It was formed in 1963 by the merger of the Institute of Radio Engineers (IRE, founded 1912) and the American Institute of Electrical Engineers (AIEE, founded 1884).

    + +

    IEEE NITK Team

    + +

    Beginning of IEEE NITK

    + +

    Started in 1988, IEEE NITK has progressed exponentially and involved itself in various regional and global technical activities. Our effort has been fruitful in the form of various awards and laurels, the Best Student Branch Award (2007), GINI Student Branch Award (2010) and The Darrel Chong Student Activity Award (Silver Medal). Now one of the largest student branches worldwide, we are getting bigger and better.

    + +

    Mission

    +

    IEEE’s core purpose is to foster technological innovation and excellence for the benefit of humanity.

    + +

    Vision

    +

    IEEE will be essential to the global technical community and to technical professionals everywhere, and be universally recognized for the contributions of technology and of technical professionals in improving global conditions.

    + +

    IEEE as a professional club provides learning opportunities within the engineering sciences, research, and technology. The goal of the IEEE education programs is to ensure the growth of skill and knowledge in the electricity-related technical professions and to foster individual commitment to continuing education among IEEE members, the engineering and scientific communities, and the general public.

    + +

    IEEE NITK is recognized as a dynamic body of enthusiastic engineers with a passion to create change with innovation. With membership strength of 600, IEEE NITK strives towards excellence and justifies IEEE as a pioneer of technological innovations. IEEE NITK actively organizes intra-branch activities, institute level activities and actively participates in initiatives of its affinity groups such as WIE (Women in Engineering) and SIGHT (Special Interest Group for Humanitarian Technologies). IEEE NITK’s participation in GINI (Global Integrated Network of IEEE) has been of great importance to the growth of the student branch.

    + +

    IEEE NITK provides its student members with good platforms for sharing knowledge and implementing technology in practical projects through Special Interest Groups (SIGs).

    + +

    IEEE NITK Team

    + +

    The primary SIGs of IEEE NITK are: Diode, Piston and Python.

    + +

    Apart from that secondary SIGs include WIE(Women in Engineering) and SIGHT(Special Interest Group for Humanitarian Technologies).

    + +

    In broad terms the objectives of the club are:

    + +
      +
    • Add on to the student member benefits by involving student members in different innovative projects and research.
    • +
    • Improve global presence of the student chapter by taking part in international competitions, conferences and talks.
    • +
    • Act as an effective platform to share and build technical knowledge inside the college and support.
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/introduction-to-iot/index.html b/blog/introduction-to-iot/index.html new file mode 100644 index 0000000..288619f --- /dev/null +++ b/blog/introduction-to-iot/index.html @@ -0,0 +1,546 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A Look into The Internet of Things

    +

    Recently, there has been much buzz around the topic Internet of Things. +In this post, let us know what IoT is and why there is a certain buzz around it, its applications, advantages, and disadvantages.

    + +

    What is IoT

    + +

    IoT is an extensive network where any device with an Internet Protocol (IP) address is connected to the internet or to each other to automate tasks and reduce human intervention. Anything that has a sensor attached to it and can transmit data from one object to another object or people with the help of the internet is known as an IoT device. IoT devices include wireless sensors, software, actuators, and computer devices. All smart devices come under IoT. Smartwatches, health monitors, wireless trackers, smart home security systems, and speakers like Alexa are some of the devices that come under the Internet of Things.

    + +

    Reason for the speculation around IoT

    + +

    Many tasks can be improvised, monitored, performed remotely using IoT. From checking burnt calories to performing delicate surgeries, from equipping smart cars to smart homes to smart cities, from tracking poultry to running agricultural machinery, there is a wide range of applications for IoT making our lives more effortless than ever. Thus it creates a lot of promising opportunities in this field.

    + +

    iot

    + +

    Applications

    + +

    IoT has a wide range of applications in various domains such as medicine, engineering, governance, agriculture, etc. Some of the applications include

    + +

    Agriculture

    +

    Operating farm machinery, tracking livestock and produce, monitoring the crop field are some of the uses in this domain

    + +

    Healthcare

    +

    Wearable devices like fitness bands, heart rate monitors, blood pressure monitors can be used for personalized health monitoring. IoT can also be used to diagnose diseases by using various sensors.

    + +

    Engineering

    +

    IoT can be used in this domain to ease the process of governing the machines, improving field testing, etc.

    + +

    Governance

    +

    IoT can be helpful in tracking, monitoring traffic and activities and could send valuable data in improvising the governance.

    + +

    Hospitality

    +

    IoT can be helpful for monitoring information in the hospitality industry. It can also ease and automate processes like keeping track of guests and using keys by guests, etc., by integrating the guests’ devices. +These are few applications in the wide range of applications in the field of IoT.

    + +

    Advantages of the Internet of Things

    + +

    Automation

    +

    Automation is one of the main advantages of IoT. IoT enables machine-to-machine communication without human intervention, thus saving time and increasing efficiency.

    + +

    Information

    +

    Using IoT, we can gather and source much information that could be used to make better decisions.

    + +

    Convenience

    +

    Automation makes our tasks easier and more convenient

    + +

    Disadvantages

    + +

    Privacy

    +

    As everything is connected, by breaching into a part of the network, all the data belonging to an individual or an organization can be exposed.

    + +

    Security concerns

    +

    Several devices make use of unencrypted network services, making it easy for an interceptor to breach the network.

    + +

    Compatibility

    +

    There is no one standard for the devices because operation between components from two different manufacturers becomes a challenge.

    + +

    Complexity

    +

    Even though IoT seems simple on the outside, the complexity of operations performed inside is high. A faulty design in one of the components in a sub-system may cause the entire system to fail and, in some cases, damage the equipment.

    + +

    Dependence on the Internet

    +

    Everything on IoT depends on the internet. If the internet becomes unavailable for some reason, the devices are rendered useless to a large extent.

    + +

    Conclusion

    + +

    In conclusion, the Internet of Things makes our lives a lot easier, convenient, and automated. It has a wide range of applications, and thus field promises many career opportunities. However, limitations to IoT that are few but severe and, when overcome, would make the future reach the present faster.

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/introduction-to-kubernetes-architecture/index.html b/blog/introduction-to-kubernetes-architecture/index.html new file mode 100644 index 0000000..8afd02c --- /dev/null +++ b/blog/introduction-to-kubernetes-architecture/index.html @@ -0,0 +1,593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    This blog post will give you a basic idea of what Kubernetes is,its applications and infrastructure.

    + +

    Let’s take a look at how application development and deployment has changed over time.

    + +

    container_evolution

    + +

    Traditional deployment era

    + +

    Early on, organizations ran applications on physical servers. There was no way to define resource boundaries for applications in a physical server, and this caused resource allocation issues. For example, if multiple applications run on a physical server, there can be instances where one application would take up most of the resources, and as a result, the other applications would underperform. A solution for this would be to run each application on a different physical server. But this did not scale as resources were underutilized, and it was expensive for organizations to maintain many physical servers.

    + +

    Virtualized deployment era

    + +

    As a solution, virtualization was introduced. It allows you to run multiple Virtual Machines (VMs) on a single physical server’s CPU. Virtualization allows applications to be isolated between VMs and provides a level of security as the information of one application cannot be freely accessed by another application.

    + +

    Virtualization allows better utilization of resources in a physical server and allows better scalability because an application can be added or updated easily, reduces hardware costs, and much more. With virtualization you can present a set of physical resources as a cluster of disposable virtual machines.

    + +

    Each VM is a full machine running all the components, including its own operating system, on top of the virtualized hardware.

    + +

    Container deployment era

    + +

    Containers are similar to VMs, but they have relaxed isolation properties to share the Operating System (OS) among the applications. Therefore, containers are considered lightweight. Similar to a VM, a container has its own filesystem, share of CPU, memory, process space, and more. As they are decoupled from the underlying infrastructure, they are portable across clouds and OS distributions.

    + + + +
      +
    • Agile application creation and deployment: +Increased ease and efficiency of container image creation compared to VM image use.
    • +
    • Continuous development, integration, and deployment: +provides for reliable and frequent container image build and deployment with quick and easy rollbacks (due to image immutability).
    • +
    • Dev and Ops separation of concerns: +create application container images at build/release time rather than deployment time, thereby decoupling applications from infrastructure. +Observability not only surfaces OS-level information and metrics, but also application health and other signals.
    • +
    • Environmental consistency across development, testing, and production: Runs the same on a laptop as it does in the cloud.
    • +
    • Cloud and OS distribution portability: + Runs on Ubuntu, RHEL, CoreOS, on-premises, on major public clouds, and anywhere else.
    • +
    • Application-centric management: +Raises the level of abstraction from running an OS on virtual hardware to running an application on an OS using logical resources.
    • +
    • Loosely coupled, distributed, elastic, liberated micro-services: +applications are broken into smaller, independent pieces and can be deployed and managed dynamically – not a monolithic stack running on one big single-purpose machine.
    • +
    • Resource isolation: predictable application performance.
    • +
    + +

    Now that we have understood what container is and what VM is.

    + +

    Let’s understand why we use Kubernetes.

    + +

    Containers are a good way to bundle and run your applications. In a production environment, you need to manage the containers that run the applications and ensure that there is no downtime. For example, if a container goes down, another container needs to start. Wouldn’t it be easier if this behavior was handled by a system?

    + +

    That’s how Kubernetes comes to the rescue!. It takes care of scaling and failover for your application, provides deployment patterns, and more.

    + +

    The components on the master server work together to accept user requests, determine the best ways to schedule workload containers, authenticate clients and nodes, adjust cluster-wide networking, and manage scaling and health checking responsibilities. We will look at each of the individual components in the master node and try to understand their functionalities.

    + +

    architecture

    + +

    As you can see in the diagram, there are a lot of terms that you might not understand. I will explain it one by one.

    + +

    Master

    + +

    Master is the controlling element or brain of the cluster.Master has 3 main components in it:

    + +

    API Server

    + +

    The application that serves Kubernetes functionality through a RESTful interface and stores the state of the cluster.

    + +

    Scheduler

    + +

    Scheduler watches API server for new Pod requests. It communicates with Nodes to create new pods and to assign work to nodes while allocating resources or imposing constraints.

    + +

    Controller Manager

    + +

    Component on the master that runs controllers. Includes Node controller(basically checks if desired number of nodes are active), Endpoint Controller, Namespace Controller, etc.

    + +

    Worker Nodes

    + +

    These machines perform the requested, assigned tasks. The Kubernetes master controls them. There are 4 component inside Nodes:

    + +

    Pod

    + +

    All containers will run in a pod. Pods abstract the network and storage away from the underlying containers. Your app will run here. +This is how we deploy pods on the node.

    + +
    #pod.yaml file
    +apiVersion: v1
    +kind: Pod
    +metadata: 
    +   name: site
    +   labels:
    +      app: my-app
    +spec:
    +    containers:
    +    - name: front-end
    +      image: nginx
    +      ports:
    +      - containerPort: 80
    +    - name: reader
    +      image: 
    +      ports: sravani/php-ngnix:v1
    +      - containerPort: 88
    +
    + +

    Kubelet

    + +

    Kubectl registering the nodes with the cluster, watches for work assignments from the scheduler, instantiate new Pods, report back to the master.

    + +

    Container Engine

    + +

    Responsible for managing containers, image pulling, stopping the container, starting the container, destroying the container, etc.

    + +

    Kube Proxy

    + +

    Responsible for forwarding app user requests to the right pod. +I’m not going to describe the detailed concept here, cause it will lead to a boring situation. +You can read the official documentation for more details information.Click here

    + +

    References

    + +

    Introduction to Kubernetes

    + +

    Kubernetes Documentation

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/introduction-to-reverse-engineering/index.html b/blog/introduction-to-reverse-engineering/index.html new file mode 100644 index 0000000..c117798 --- /dev/null +++ b/blog/introduction-to-reverse-engineering/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    I am sure you would have fixed a bug if you have done programming. Going through your code, identifying places where it could have gone wrong, trying out different inputs to make it easier, each one with your own different methods! You also would have learnt to make your debugging process simpler with your experience for sure. Congratulations for your first step towards an important skill required for reverse engineering :)

    + +

    Lets begin with a simple intuitive understanding of reverse engineering. You have a toy gun in which you can load bullets and shoot. One fine day, it stops working! (Hmm, not a fine day maybe). Having “Jugaad” skills, you will surely not throw it :P You open it and understand how it works. You find that it works on spring mechanism. Being a little technical (:P), You provide potential energy when you compress the spring and at a stage, it gets locked. It is released by pressing the trigger (releasing the lock effectively) and give the bullet kinetic energy and BOOM! +You find the trigger was displaced and unable to release the lock and hence you fix it! Feels good isn’t it? :D Not a bad day after all :) Similar process takes place with a software product too. From the application, you extract the source code and understand the logic, flow of information and the loopholes.

    + +

    People who enjoy debugging will love this field. But don’t think it’s very easy. A complete understanding of the system is very important. Say in the case of your toy gun, an improper understanding could have worsened the situation of the gun. You can start by learning how your computer works, going deeper and deeper eventually. Slowly you will start identifying possible bugs and might end up finding out how it is taken care off also. This also is an important step because this is how you learn great ideas!

    + +

    I will share how I gained interest in this field with the same example I saw. Instead of explaining the whole assembly code obtained from the executable of a program, I will concentrate on attacking the loophole found.

    + +

    This a simple program which takes a password as input and grants access only if the password is “password1” or “password2”. You will soon find out this is not true! Let us go through the program.

    + +

    Image1

    + +

    The program intends to grant access only when auth_flag is 1, which happens when right password is submitted. But any positive value of auth_flag will also grant us access. See an example run of the program.

    + +

    Image2

    + +

    The program gave access with not only password1 and password2 but also a sequence of ‘a’s. Lets see what the flaw here is.

    + +

    Image3

    + +

    Image4

    + +

    We use gdb to find the addresses of password_buffer and auth_flag variables and find that there is 28 bytes gap between them. Hence any string of greater length will write in the address of auth_flag giving it a positive value and hence grant access. Hence we have broken into the password checking system!! In fact, this is a common method called buffer overflow. Well, that was fun. Fire in the loophole!(CS fans here? :P ). Unfortunately, most compilers do not allow overflow these days. We have allowed overflow in this program by using the command ‘-zexecstack -fno-stack-protector -g’ while compiling (Don’t worry, even I cannot read that xD).

    + +

    Lets see what you can do with the understanding you gained. You can:

    +
      +
    • replicate the product
    • +
    • fix bug issues
    • +
    • add extra features
    • +
    • acquire extra access
    • +
    • find loopholes to understand the flaws in your software
    • +
    • Or do it for fun :)
    • +
    + +

    All these things can result into ethical or unethical hacking, hackers and crackers respectively. An interesting question for everyone. Is it legal? If you have got the software legally, you are free to reverse engineer it but replicating it exactly will be a problem. Check this interesting solution to the problem! :P

    + +

    Image5

    + +

    How to start?

    +
      +
    1. “Hacking – The art of exploitation” is a good book
    2. +
    3. Learn how computers work at lower level
    4. +
    5. Programming in assembly language
    6. +
    7. Tools like gdb, radare2 will help you disassemble the executable
    8. +
    9. Play CTFs – They are fun and will help you improve your skills!!
    10. +
    + +

    So, That was about it! Have a great Summer! +Any doubts, feel free to ask :) !

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/javascript-console-better-debugging/index.html b/blog/javascript-console-better-debugging/index.html new file mode 100644 index 0000000..cf140fa --- /dev/null +++ b/blog/javascript-console-better-debugging/index.html @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Here are 5 ways you can ninjafy your console logging skills

    + +

    1. console.log( ‘COLORED_TEXT’ )

    + +

    You will have to use %c with each occurrence accompanied by an argument that expresses the styling that you desire

    + +
    console.log(
    +  '%c Object A instantiated %c before B !!  ',
    +  'background: white; color: red', 
    +  'background: red; color:white'
    +);
    +
    + +

    Note that you could use any CSS property under the sun into as an argument. In case of the above string this is how it renders out

    + +

    console color

    + +

    2. console.table( ARRAY_OF_OBJECTS )

    + +

    Use this when you want to print an array of objects +For example if you want to print this :

    + +
    const arrayOfBooks = [
    +  { title: 'Heart of Darkness', author: 'Joseph Conrad' },
    +  { title: 'A Walk in the Woods', author: 'Bill Bryson' },
    +  { title: 'Rich Dad Poor Dad', author: 'Robert Kiyosaki' }
    +];
    +
    + +

    then y’all know what console.log(arrayOfBooks) does

    + +

    console log

    + +

    But if you instead use:

    + +
    console.table(arrayOfBooks)
    +
    + +

    you’ll get the following output:

    + +

    console table

    + +

    Isn’t it at least 300 times nicer and easier to infer what the array is ?

    + +

    3. console.image( ‘URL_OF_IMG’ )

    + +

    console image

    + +

    HOLD TIGHT FOLKS ! Before you leave to try this out yourself in the console let me tell you that this one is NOT natively available to Javascript in the browser

    + +

    You will have to first load this JS resource from the CDN using the below script tag :

    + +
    <script src='https://raw.githubusercontent.com/adriancooney/console.image/master/console.image.min.js'></script>
    +
    + +

    For more details on ☝️ , refer this link. Obviously the project isn’t maintained anymore (the last commit is like 6 years ago) because there isn’t really anything more to console.image :)

    + +

    BONUS : You get console.meme included in the CDN to make something like this :

    + +

    meme console

    + +

    And the format for that as per their Github Readme is:

    + +
    console.meme(upper text, lower text, meme type|url, width, height)
    +
    + +

    4. console.warn( YOUR_MESSAGE )

    + +

    You can use this to sort of indicate log messages that show the devs it’s not really something that breaks the project but good to fix it in the future commits

    + +
    console.warn('Image Kirk_0932.jpg dimensions are slightly off and its causing a small part to be hidden from the user')
    +
    + +

    and here is a screenshot of how ⚠️ WARNING messages look like inside the console

    + +

    warning

    + +

    5. console.time() to Test Your API

    + +

    You can keep track of how much time api calls take to fetch data right in the console. You can use this to find out average time and if you think it suxx, you can bug your backend dev ;P

    + +

    So pass in the same label 'API_TEST' to time and timeEnd functions for it to work.

    + +
    console.time("API_TEST");
    +
    +const fiftyTests = Array.from(
    +     { length: 50 }, 
    +     () => fetch('https://jsonplaceholder.typicode.com/todos/1'));
    +
    +for(const prom of fiftyTests) {
    +  const resp = await prom;
    +  const json = await resp.json();
    +  console.count('Fetched ');
    +}
    +
    +console.timeEnd("API_TEST");
    +
    + +

    Now you can see the time it takes to make api calls 50 times one - after - the - other printed in your console.

    + +

    console time

    + +

    You can now divide it by 50 to get the average time the API takes to respond.

    + +

    ⚠️ Don’t use Promise.all() because it will simultaneously await all promises and tell you once everything has resolved which defeats our purpose

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/kmp-algorithm/index.html b/blog/kmp-algorithm/index.html new file mode 100644 index 0000000..1900a51 --- /dev/null +++ b/blog/kmp-algorithm/index.html @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    I’d like to talk about an algorithm that I believe should be in any Software Engineer’s toolkit. That is, the KMP algorithm named after its three inventors: Knuth-Morris-Pratt. The algorithm was designed to solve efficiently a very common problem. That is the problem of finding whether or not one string is a substring of a different string.

    + +

    Brute Force

    + +

    Let’s start first with the original problem. We would like to implement the function: int strstr(const string &Str, const string& Pattern); +The brute force solution of this function entails two loops, one over Str and one over pattern. Let’s see it:

    + +

    KMP brute force

    + +

    What is the runtime complexity of this algorithm?

    + +

    Since we are running in two loops and for each i we are trying all j’s, we have a worst-case complexity of O(NM) where N is the size of Str and M is the size of Pat. Can you spot where the inefficiency comes from? The problem is that if we can’t find a match we have to go back (with i) and start over from where we left off when we started the match. Why are we doing this? let’s look at two examples:

    + +
      +
    1. +

      str = “abcbcefg” and pat = “bce”. In this case we start the match at i = 1 and j = 0, we continue to i = 2 and j = 1, but then at i = 3 and j = 2 we have a mismatch. Our algorithm will detect this mismatch and will set “i” to be 2. But what’s the point? for i = 2 we already know that there will be no match. In fact, based on strwe should not be setting “i” to a previous index, but we could just as well continue advancing i.

      +
    2. +
    3. +

      str = “abababc” pat = “ababc”. In this case, we will start matching at i = 0 and will reach i = 4 when we detect a mismatch. We will then return to i = 1 and start again. When we reach i = 2 we will detect that the strings match. The observation is, that we should not have even bothered returning to i = 1 we could have set “i”to 2. But, if we look even closer we may notice that after we matched str = “abab” and pat = “abab” we already have one pair of “ab” in pat which we know that can be used for future matches.

      +
    4. +
    + +

    Let’s try and make our code efficient!

    +

    The two examples are a great way to explain how KMP works and why it is so efficient. KMP starts off by building a prefix table for pat. This prefix table will be used to indicate for each index “i” how much we have matched thus far and use this information to jump back only by the amount needed.

    + +

    Lets see how the prefix table will look like for different patterns:

    + +
      +
    1. pat = “ababc” will result in the table: {0,0,1,2,0}
    2. +
    3. pat = “ississi” will result in the table: {0,0,0,1,2,3,4}
    4. +
    5. pat = “abcd” will result in the table: {0,0,0,0}
    6. +
    + +

    Notice what is happening here. When we detect a prefix that we have seen (such as the second “ab” in “ababc”) the numbers in the table indicate the size of that prefix. So if we start matching “abababc” with “ababc” for i = 4 and j = 4 we see that ‘a’ is different from ‘c’, and hence we have a mismatch. Using the table above we see that the table at index j - 1 = 3 has the value 2. We can have “j” jump back two indexes from 4 to 2, and continue our match from there. We don’t have to touch “i” anymore, we just modify “j” based on the maximal size of the prefix that we have seen thus far.

    + +

    Let us see the code to generate the Prefix table:

    + +

    KMP Prefix table

    + +

    We allocate the prefix table to be the size of “Pat”. We use two indexes to fill the table. The first is “i”, it will indicate the end of the current prefix. The second is “j” which will be used to find the next occurance of the prefix. Notice that “j” starts from index 1. As we are traversing we check to see whether Pat[i] == Pat[j]. If they are, then we know that there is a prefix of size i + 1 that we have encountered at index “j”. We update the table at index “j” to indicate this prefix, and update “i” as well. If they are not the same, then we have two cases: First, if i == 0, it means that we have not found any prefix thus far and we just increment “j”. However, if i > 0, we keep “j” where it is and make “i” go back to the index where the prefix has started and compare it again with “j” .

    + +

    Complete code

    + +

    We are now ready to see the full algorithm and how it uses the prefix table:

    + +

    KMP code

    + +

    The runtime complexity of this new version in the worst case will be O(N).

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/light-backscatter-application/index.html b/blog/light-backscatter-application/index.html new file mode 100644 index 0000000..583ccab --- /dev/null +++ b/blog/light-backscatter-application/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Measure of fat content in milk with LED and LDR

    + +

    India's milk production is estimated to have increased by 6.6 per cent during the last four year. Price of milk is based on the quantity of FAT present in milk . so we need machine which can measures milk parameters like SNF (Solid but Not FAT), FAT, CLR, with less cost.

    + +

    The important thing is that machine should be cheaper and only based on electricity .then it is very helpful for the remote area also.

    + +

    Coming to the point photometric based sensor or light backscatter application technique is able to fulfil the remote area condition(which was proposed by IJIRCCE).

    + +

    How is it better then other method ?

    + +

    first have a look on primary method -

    + +

    1)Gerber method :

    + +

    The specific gravity of fat is 0.9 and that of acid milk mixtures is 1.43. This situation promotes complete separation of fat when proper centrifugal force is applied.

    + +

    Due to application of centrifugal force lighter substances (Butter fat) are thrown towards centre and rest of serum portion that is heavier is thrown towards the pheriphen.Addition of amyl alcohol helps for separation of fat from the milk acid mixture and also prevents the charging of fat and sugar by the H2SO4.

    + +

    Apparatus:

    + +
      +
    • +

      Milk sample bottle.

      +
    • +
    • +

      10 ml automatic tilt measure for H2SO4.

      +
    • +
    • +

      1 ml automatic tilt measurefor amyl

      +
    • +
    • +

      10.75 ml capacity milk pipette.

      +
    • +
    • +

      Dairy floating thermometer.

      +
    • +
    + +

    Procedure:

    + +
      +
    1. +

      Put the clean and dry butyrometer in a butyrometer stand (Camlab part no. 1162195) with open mouth upwards.

      +
    2. +
    3. +

      Run 10 ml of sulphuric acid with the tilt measure in the butyrometer.

      +
    4. +
    5. +

      Pipette out 10.75 ml of milk sample gently by the side of butyrometer, whose temperature is about 15-21 degrees C.

      +
    6. +
    7. +

      Pour 1 ml. of amyl alcohol with tilt measure.

      +
    8. +
    9. +

      Stopper the butyrometer with the help of lock stopper using regulating pin/guiding pin.

      +
    10. +
    11. +

      The tube is well (mixed) shaken till mahogany red colour is obtained. Keep the butyrometer in hot water bath till it attains 15-21 degrees C and the butyrometer are placed in the centrifuge at 1100 ram for 4 minutes.

      +
    12. +
    13. +

      Take out the butyrometer in an upright position with the stopper end down wards.

      +
    14. +
    15. +

      Keep the butyrometer in hot water bath at (65 degrees C) for some time.

      +
    16. +
    17. +

      Note the reading. Reading should be taken from bottom of the fat column to lower border of meniscus on the scale.

      +
    18. +
    + +

    2) Soxhlet extraction principle :

    + +

    Generally this principal is used in industries and it is also costly.

    + +

    Now let's discuss about light backscatter application and it's working-\>

    + +

    photometric based sensor or light backscatter application :

    + +

    In this application the scattering of a beam of light by the fat globules present in the homogenized milk is the principle of this application . The amount of light scattered by the milk sample is a measure of the fat content in the milk.

    + +

    A high intensity LED is used as a light source. The light beam is made to pass through the sample solution contained in the test tube. A LDR is placed exactly on the opposite side of the test tube to detect the amount of light passing through the test tube un-scattered. To obtain maximum sensitivity the test tube is covered in wooden shield which has opening only for LED and LDR to pass through.

    + +

    METHOD:

    + +

    A sensor with two optical fibers, as shown in Figure 1, was used to monitor the coagulation step. An LED light source directs light into an optical fiber that terminates in the milk and an adjacent fiber separated by a distance r1 receives the light backscatter. The uniqueness of this light backscatter configuration is that the light must traverse through a finite distance of fluid (free of specular reflectance) and be backscattered by particulates to the receiving fiber. This configuration was used to measure the change in light backscatter during milk coagulation.

    + +

    Figure 1

    + +

    Figure 1: Schematic of a single waveband backscatter sensor used for cutting time determination in cheese processing.

    + +

    Next figure shows the fiber optic measurement of intensities at two radial distances, r1 and r2, from the emitting fiber. The sensor employed three optical fibers: one that delivered light to the scattering media and two others that measured light intensity (I1 and I2) at spatially separated points r1 and r2, respectively (∼1 mm apart).

    + +

    Figure 2

    + +

    Figure 2. Schematic of the optical fiber configuration tested for measuring composition showing a LED focused on a fiber and two receiving fibers at radial distance r1 and r2 focused onto detectors with outputs F1 and F2.

    + +

    A relatively simple empirical correlation between the distribution of backscattered light intensity and the particle concentration was utilized by adapting a widely used diffusion approximation equation presented by Bolt and ten Bosch [1]:

    + +
                         I(r) = I0 exp(- βCr) /r^m         equation(1);
    +
    + +

    where: I0 = apparent intensity at radial center line of emitting fiber

    + +

    I(r) = Light intensity as a function of radial distance from the emitting fiber

    + +

    β = specific backscatter light coefficient

    + +

    C = concentration of particulates

    + +

    m = exponent relating light diffusion in the radial direction

    + +

    r = radial distance of the receiving fiber (centerline to centerline), mm.

    + +

    The backscatter light coefficient, β, is based on the ability of the sample to scatter light and depends on the optical and radiative properties of the particles in the sample. The value of m depends on whether the detector is placed in the intermediate area (m = ½) or the diffusion area (m = 2). The diffusion area is defined as the area in which sufficient multiple scatterings have taken place, so that the diffusion approximation is valid.

    + +

    In the development of a sensor, the use of signal ratios has the advantage of normalizing the resulting response. This isolates the signal ratio from changes in light intensity and some changes to the physical system (optics, mechanical connections, etc.). For the fully developed diffusion area, the ratio of the intensities at two radial distances (r1 and r2) using Equation (1) reduces to the following equation:

    + +
                 I(r1)/I(r2) =   (r2/r1)^m  exp(K(r2-r1))     equation(2)
    +
    + +

    where r1 and r2 are radial distances for fiber 1 and fiber 2, respectively, and K is a constant for a specific fat content. This equation predicts an increasing signal ratio with increasing milk fat. Light scattering is dominant for high concentrations of fat and the widely used diffusion approximation is valid for this case.

    + +

    A consistent light backscatter pattern (reflectance ratio – ratio of light backscatter signal to initial signal at time zero) was found and is shown in Figure 3. The reflectance ratio is initially relatively steady, traverses through a sigmoidal increase and then gradually increases at a decreasing rate. The first chemical reaction during the enzymatic coagulation of milk for cheese making is the reaction of chymosin and casein. This enzymatic reaction phase destabilizes the colloidal nature of casein micelle but does not significantly affect light backscatter. This reaction proceeds as a first order chemical reaction when the substrate concentration (casein) is in excess supply in relation to the enzyme concentration. The second phase is the aggregation phase of the destabilized casein micelle into flocks which grow and consume the entire casein particulate system. It is during this phase when larger particles are formed and the reflectance of light increases rapidly. The aggregation reaction follows a second order chemical reaction. The third phase is the gel forming phase which results from a micro consolidation of protein strands that result in stronger protein strands and an increasing space within the protein matrix. This phase follows a first order chemical reaction. These three chemical reactions overlap with the resulting reflectance profile as shown in Figure 3. The reflectance of milk at 880 nm typically increases 15% to 40% during coagulation providing a strong response signal.

    + +

    The goal of signal analysis is the extraction of information which will allow accurate prediction of the cutting time from the profile. A successful cutting time prediction technology was developed by utilizing the strong correlation between two time events; tmax and tcut. The correlation, however, needed to be corrected for protein content to develop a precise prediction. The following cutting time prediction equation was determined to predict the cutting time with an approximate precision of ± 1 min:

    + +
             tcut = β tmax (protein correction)               Equation 3
    +
    + +

    Figure 3

    + +

    Figure 3. A typical light backscatter profile, R, for coagulating milk is shown with the first derivative, R', the second derivative, R'', and the time-based parameter, tmax

    + +

    where β = a calibration constant (usually determined by the cheese maker) which typically varies from 1.3 to 2.5. Equation 3 requires only tmax. (a time-based parameter) and protein content to make a cutting time prediction. The time-based parameter, tmax to be an exact measurement proportional to the enzymatic reaction rate. The change in reflectance does represent product changes; however, numerous attempts at extracting consistent information from reflectance changes have proved fruitless. Figure 4 shows observed and predicted cutting time for a broad based test of conditions typically encountered in cheese making.

    + +

    Figure 4

    + +

    Figure 4. Measured and predicted cutting time using the cutting time prediction equation Eqn. 3

    + +

    The light backscatter was measured during the culture of cottage cheese. A typical reflectance profile is shown in Figure 5.

    + +

    A cutting time prediction equation was determined for cottage cheese culture using time-based parameters and a multiple linear regression. The profile is more complicated in that there are two maxima in the first derivative. The second noteworthy difference is that light backscatter increases 200% during the process providing a very strong signal.

    + +

    Figure 5

    + +

    Figure 5. A typical light backscatter profile, R, for cottage cheese culture showing the first derivative, R', the second derivative, R'', and the time-based parameters.

    + +

    The ratio of light intensity response, (I2/I1), measured with two detectors spaced at different radial distances was referred to as signal ratio and was found as predicted by Equation 2 to increase with fat content. The signal ratio for homogenized whipping cream diluted in water is shown in Fig. 6.

    + +

    A single waveband backscatter with two detectors spaced at different radial distances that measures optical extinction has several applications in the dairy industry where an inexpensive sensor is required to monitor and control product composition. A light extinction sensor is a response-based sensor normalized by dividing two signals. Further testing to optimize light wavelengths and fiber spacing is required before a light extinction sensor can be developed with the accuracy and precision required by the dairy industry. From experience, it is known that the attenuation of light varies significantly between products. Thus the determination of optimum fiber spacing and wavelength is required for different products.

    + +

    Figure 6

    + +

    Figure 6. Light backscatter signal ratio as a function of homogenized whipping cream (36% milk fat) at 25 C for light at 470 nm.

    + +

    EXPERIMENTAL RESULTS :

    + +

    The results of fat percentage present in 20 ml milk sample calculated using Gerber's method , dairy method and light backscatter method are as follows -

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodBuffalo Milkcow
    GERBER’S Method6.9%5.00%
    Dairy Machine6.85%4.90%
    Light backscatter7.00%4.95%
    + +

    Figure 7

    + +

    Circuit shown in image is simple and cheaper so this process is in favour of farmer and as well as dairy industry and as the results from all three methods are nearly same. So it is best in compare to other .

    + +

    References :

    + +

    1) https://camblab.info/wp/index.php/total-fat-analysis-in-milk-using-the-gerber-method/
    +2) https://mrclab.com/default.aspx
    +3) http://ijircce.com/

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/lighting-up-your-room/index.html b/blog/lighting-up-your-room/index.html new file mode 100644 index 0000000..42105c4 --- /dev/null +++ b/blog/lighting-up-your-room/index.html @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Apparatus:

    + +

    1.LED strips
    +You should find these in most home decor stores. They could turn out to be expensive depending upon the quality of light you expect. There are RGB strips available too!

    + +

    2.TIP 31 switch
    +Now this is a power transistor that can withstand large currents that the LED strips demand

    + +

    3.AUX cable
    +This is to connect your music player to the device

    + +

    4.12V battery
    +The LED strips demand a lot of current, so get one that supplies enough. There are rechargeable lead acid batteries available. They are cheaper, but bulkier than pocket Li-Po batteries. Sort yourself a powerful 12V battery!

    + +

    5.AUX female adapter
    +To connect your music player to the device. I haven’t been able to find these at stores, you’ll find them on here

    + +

    6.Speakers
    To listen to audio!

    + +

    7.AUX female to female spiltter
    +So that you can feed into the device and listen at the same time.

    + +

    8.Soldering tools
    +This is something you should already have!

    + +

    Setup

    + +

    We will use the transistor to switch the LEDs depending on the audio input that is received. If you have RGB LEDs you can use RC filters to separate out bass and treble and make it cooler. We will stick to regular strips for now.

    + +

    We want the transistor to operate as a switch, so we will use the LEDs as loads across the source and the collector. The audio input will be given to the base. And that is basically all you need!

    + +

    Get the components on to a perforated board and solder the connections once you check them. It is advised not to use a breadboard if you’re using longer LED strips, you could leave residues on the breadboard or even completely damage it.

    + +

    Transistor Switch

    + +

    That’s how to make your room cooler! Engineering FTW!

    + +

    Resources:

    + +

    Check out for more help!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/localization-robotics/index.html b/blog/localization-robotics/index.html new file mode 100644 index 0000000..8a7cb0e --- /dev/null +++ b/blog/localization-robotics/index.html @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Have you ever wondered how life was way before GPS was introduced.I remember taking an OLA ride to a place back in 2013s when google map was not incorporated into the OLA app, and both the driver and I were new to the location and although we were right in front of the location , we didn’t know where exactly we were!!!.

    + +

    We kept driving around the same location for over 30 min only to find that we were at the right location way before. The bill amounted to 1000 and I was devastated. So answering the question of what we did before GPS was mounted in our devices. We got lost! Now you get the essence and importance of Localisation. GPS is a life saver but is not the most reliable technology for indoor localisation.By the end of this article you’ll know the answers for all the Ws of localisation. Have a basic intuition of different models and filters used for localisation.

    + +

    WHAT’S LOCALISATION FIRSTLY ?

    + +

    Localisation provides an answer to the question “Where’s the robot now”?

    + +

    So by localisation we mean estimating the position and the orientation of an “object” in a given coordinate frame.So essentially it is the building block for all navigation systems.

    + +

    The “object” could be a robot navigating through an environment or a self-driving car or a drone, it could be anything.

    + +

    Localisation is often performed given a map of the environment.

    + +

    MAPS ARE EVERYWHERE IN ROBOTICS

    + +

    Maps are required for most of the robotic tasks like path planning and localisation . The map could be represented in various forms as below.

    + +

    1) Feature based maps

    + +

    An image based representation using coordinates of known landmarks or features.

    + +

    img

    + +

    2) Occupancy grid maps

    + +

    An image based representation of the environment in terms of occupied and unoccupied regions. White pixels represent unoccupied regions and black pixels represent occupied regions.

    + +

    img

    + +

    Let’s say you are new to the NITK campus and have to navigate to the swimming pool inside the campus. You are given a map of the campus alongside. How do you know where you are exactly with respect to the map ?

    + +

    You use your vision(Sensor) to perceive the environment around you and compare it with the landmarks provided in the map to find that you are close to the sports complex.You also figure out that to reach the swimming pool you have to walk 3000m forward and take a right and move another 200m/s. You begin to move with a uniform speed of 5m/s.

    + +

    You have your sensors(Your vision), you have a model with you and hence you can estimate your current location with respect to the sports complex using a simple equation x=vt.

    + +

    Great job, that’s what a robot does, a mobile robot equipped with sensors to monitor its own motion (e.g., wheel encoders and inertial sensors) can compute an estimate of its location relative to where it started if a mathematical model of the motion is available.This is called DEAD RECKONING.But dead reckoning is not a truly reliable process due to sensor noises etc.

    + +

    So , Errors in dead reckoning are corrected using environment perception i.e. by correlating the information from sensors( Laser range finders, ultrasonic sensors , Cameras are most common sensors used for obtaining range and bearing measurements to landmarks) with the map available.

    + +

    So as we saw the most important components of a localisation problem are the motion model describing the motion of the bot using simple kinematics equations and the sensor model which is the relationship between the observations from the sensors and the location of the robot in the map.

    + +

    For instance ,the kinematic equation governing your motion is a simple x=vt. similarly,

    + +

    the equations governing the motion of the differential drive robot are given by

    + +

    𝑥̇ (𝑡)=(𝑣(𝑡) + 𝛿𝑣(𝑡)) cos(𝜙𝑟 (𝑡))

    + +

    𝑦̇ (𝑡)=(𝑣(𝑡) + 𝛿𝑣(𝑡)) sin(𝜙𝑟 (𝑡))

    + +

    𝜙̇ (𝑡) = 𝜔(𝑡) + 𝛿𝜔(𝑡)

    + +

    We can have various sensor models based on the sensors mounted and the representation of the environment; either feature based map or grid occupancy based map and obtain location estimate based on the landmark observation.

    + +

    The sensor based positioning includes WiFi based positioning systems, Bluetooth systems,Infrared systems,proximity based or Acoustic based (Sound followers)

    + +

    The main caveat is ,

    + +

    WHO TO LISTEN TO?

    + +

    The estimate based on sensor information or the estimate from the kinematic model (motion information)?

    + +

    The answer is Bayesian filtering.

    + +

    It takes into account the uncertainties involved in both the measurement models and obtains an estimate of the robot location and the associated uncertainty! Extended Kalman filter (EKF) and particle filter provide complaint approximations to Bayesian filtering. Both are recursive probabilistic frameworks.

    + +

    EKF vs PARTICLE FILTER

    + +

    GLOBAL LOCALISATION (initial position of the bot is unknown) cannot be performed using EKF

    + +

    EKF can’t be employed if the representation of the map is an occupancy grid.

    + +

    EKF assumes Gaussian probability distribution, while Particle filters can handle arbitrary probability distributions.

    + +

    THE TAKEAWAY

    + +

    Localisation is highly relevant in robotics, autonomous driving cars, computer vision, achieving intelligent connectivity,even smartphone requires pose information to make use of certain services

    + +

    FURTHER READING

    + +

    Implementation of Mapping and localisation Algorithms on ROS

    + +
      +
    1. ROS NAVIGATION IN 5 DAYS #3 - Robot Localization
    2. +
    3. ROS Developers LIVE-Class #49: How to Map & Localize a Robot (ROS)
    4. +
    + +

    Maths behind Extended Kalman filters ,Particle filters and Monte Carlo localisation Algorithm

    + +
      +
    1. Particle Filters and Their Applications
    2. +
    3. Monte Carlo Localization Algorithm
    4. +
    + +

    BIBLIOGRAPHY

    + +
      +
    1. Robot Localization: An Introduction.
    2. +
    3. Particle Filter and Monte Carlo Localization (Cyrill Stachniss, 2020)
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/log-file-parsing-and-report-generation/index.html b/blog/log-file-parsing-and-report-generation/index.html new file mode 100644 index 0000000..44338d6 --- /dev/null +++ b/blog/log-file-parsing-and-report-generation/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Hello everyone, today I will be talking about the core part of my work during my summer internship at Samsung Semiconductor India R&D Center, Bengaluru. Our project team consisted of four members and we were given the task to parse log files generated by a testing framework called as Jenkins (now a very popular tool for continuous integration and deployment of source code) and present the parsed data in a HTML, XLSX and JSON format. We were also required to develop plotting and charting utilities for the parsed data in the Excel files.

    + +

    Log file parsing

    + +

    Log files are simple text file containing huge amount of information. These files are however unstructured and the data they contain is not in a presentable format and it cannot be grasped quickly. There is no organisation of data and no scope for visualization of the data. Therefore, parsing is a very important step if you want to work upon, present, analyze the data in your log files. +We initially thought of using some existing popular tools like the MS log parser, the ELK (Elastic Search, Logstash, Kibana) stack, etc. But these tools require the log files to retain a fixed format throughout the file and proved to be unsuitable for our use. We then moved on to developing Python scripts (parsers) for the log files. Python gets its immense power through its humungous number of modules and a simple import of these modules can get any of your work done!

    + +

    Parsing

    + +

    The python re module (regular expression) contains most of the functions that a parsing utility of any language would provide you with. This coupled with the string handling functions in Python will get your parsing work done. By parsing, I mean that the you will be able to extract the data from the log files and put them in Python data structures (list, dictionaries, strings and their combinations)

    + +

    Making the JSON file

    + +

    Making the JSON file is perhaps the most important step after parsing. The parsed data present in the Python data structures will be dumped to a JSON file. The JSON file format provides us with a very easy way to retrieve information just like data retrieval in arrays and dictionaries. The python JSON module can write data from a data structure to a JSON file and can load the data from a JSON file to a data structure

    + +

    Writing to MS Excel

    + +

    There are many Python modules for achieving this task. They include xlwt, openpyxl, xlrd, xlsxwriter, etc. The most popular is the xlsxwriter, perhaps because of its excellent online documentation and its extensive and diverse functionalities. Also, this is the only module that supports plotting on an Excel sheet and hence we opted for this module. The python data structures containing the parsed data are written in a tabular format in an Excel worksheet.

    + +

    Plotting on MS Excel

    + +

    The xlsxwriter module contains utilities for graphing and charting. You can decide the type of chart (line, bar, column, pie), set its axes (units, scale, labels, linear/logarithmic), set chart legends, add data labels, formatting (chart color, plot color, trend lines, gridlines, border) and many more features.

    + +

    HTML report generation

    + +

    The xlsx files are suitable when you want to store and export the parsed data. However, for presentation purposes, the HTML format is more suitable. There are command-line based tools like the sswriter and unoconv which help us with this. These are generic tools which can help in conversion of files from one format to another.

    + +

    To conclude, I wanted to share my learnings during my internship tenure at Samsung and provide you with the knowledge of how data should be parsed and presented and the python modules/tools that can be used to achieve the same.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/lstm-models/index.html b/blog/lstm-models/index.html new file mode 100644 index 0000000..e160de2 --- /dev/null +++ b/blog/lstm-models/index.html @@ -0,0 +1,571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What’s the first thing that comes to your mind when you think of speech recognition? Alexa, Google assistant, Cortana, right? It’s quite reasonable; we are fascinated by machines that can understand us. But have you ever wondered how these things even work? +As you read this article, you’ll get the basic idea along with the maths used behind this.

    + +

    When analyzing human voice, a very important aspect are filters, which constitute a selective frequency transmission system that allows energy through some frequencies and not others. Currently, the standard way of preprocessing audio is to compute the short-time Fourier transform (STFT) with a given hop size from the raw waveform. This gives us a tridimensional arrangement called a spectrogram that shows the frequency distribution and intensity of the audio as a function of time.

    + +

    Once we have the spectrogram, it is possible to propose a neural network that is able to handle command recognition while still keeping a small footprint in terms of number of trainable parameters. This leads to our main topic of the article, LSTM models. +But before going to that, let’s just look at its predecessor model, Recurrent Neural Network (RNN).

    + +

    Recurrent Neural Networks

    + +

    Humans don’t start their thinking from scratch every second. As you are reading this essay, you understand each word based on your understanding of previous words. You don’t throw everything away and start thinking from scratch again. Your thoughts have persistence. +Traditional neural networks can’t do this, and it seems like a major shortcoming. Recurrent neural networks address this issue. They are networks with loops in them, allowing information to persist.

    + +

    image-1

    + +

    Recurrent neural networks (RNNs), are a class of neural networks that allow previous outputs to be used as inputs while having hidden states. It can be thought of as multiple copies of the same network, each passing a message to a successor. For each timestamp t, the activation a and the output y are expressed as follows:

    + +

    image-2

    + +

    where Wax , Waa , Wya , ba , by are the coefficients that are shared temporally and g1 , g2 activation functions.

    + +

    The Problem of Long-Term Dependencies

    + +

    RNNs were designed to connect the previous information to the present task, but unfortunately, as the gap grows, RNNs become unable to connect the information.

    + +

    image-3

    + +

    The reason behind this behavior is vanishing and exploding gradients. Due to this, it is difficult to capture long-term dependencies because of multiplicative gradients that can be exponentially decreasing/increasing with respect to the number of layers.

    + +

    Thankfully, LSTMs don’t have this problem!

    + +

    LSTM Networks

    + +

    Long Short Term Memory (LSTMs) are explicitly designed to avoid the vanishing and exploding gradient phenomenon. +They have internal mechanisms called gates that can regulate the flow of information. +Like RNNs, LSTMs also have a chain-like structure, but the repeating module has a different structure. Instead of having a single neural network layer, there are four layers that interact in a very special way.

    + +

    image-4

    + +

    First of all, let’s just try to get comfortable with the notation we’ll be using.

    + +

    image-5

    + +

    In the above diagram, the pale yellow boxes represent a neural network layer. The pink circles represent pointwise operations, like vector addition/subtraction. Lines merging denote concatenation, while a line forking denotes its content being copied and the copies are passed to different locations.

    + +

    The Core Idea Behind LSTMs

    + +

    The core concept of LSTMs are the cell states and its various gates. One can treat cells like a conveyor belt. It runs straight down the entire chain, with only some minor linear interactions which helps to retain info even in a very long chain. It’s very easy for information to just flow along it unchanged.

    + +

    image-6

    + +

    Gates provides a way to optionally let information through. They’re composed of a sigmoid neural network layer and a pointwise multiplication operation. First, we’ve the “forget gate”. This gate decides what information should be kept or thrown away. Data from the current input is passed through the sigmoid function. Values come out to be 0 and 1. The values that are closer to 0 means to forget and closer to 1 means to keep.

    + +

    image-7

    + +

    Next, we’d like to make a decision on what new information we’re going to store within the cell state. This has two parts. First, a sigmoid layer also called the “input gate layer” decides which values we’ll update. Next, a tanh layer creates a vector of the latest candidate values, C~t, that would be added to the state. In the next step, we’ll combine these two to make an update to the state.

    + +

    image-8

    + +

    It’s now time to update the old cell state, Ct−1, into the new cell state Ct. This is the new candidate value, scaled by how much we decided to update each state value.

    + +

    image-9

    + +

    Finally, we have the output gate which will output a filtered version of the cell state. First, we have a sigmoid layer which decides the parts of the cell state we’re going to output. Then, we put the cell state through tanh which ensures to keep the values between 1 and -1, and then, multiply it by the output of the sigmoid gate, so that we can get desirable output.

    + +

    image-10

    + +

    Applications of LSTMs

    + +

    Language Modelling and predictions

    + +

    In this method, the likelihood of a word in a sentence is considered. The probability of the output of a particular time-step is used to sample the words in the next iteration(memory). In Language Modelling, input is usually a sequence of words from the data and output will be a sequence of predicted word by the model. While training we set xt+1 = ot, the output of the previous time step will be the input of the present time step.

    + +

    Speech Recognition

    + +

    A set of inputs containing phoneme(acoustic signals) from an audio is used as an input. This network will compute the phonemes and produce a phonetic segments with the likelihood of output.

    + +

    Machine Translation

    + +

    In Machine Translation, the input is will be the source language(lets say Hindi) and the output will be in the target language(lets say English). The main difference between Machine Translation and Language modelling is that the output starts only after the complete input has been fed into the network.

    + +

    Conclusion

    + +

    We have learned the basic idea behind RNN and LSTM, how LSTM manages the shortcomings of RNN and their use in speech recognition. LSTMs are a very promising solution to sequence and time series related problems. Within a few dozen minutes of training can generate nice looking descriptions of images, Image Captioning. LSTM’s and GRU’s are also used in state-of-the-art deep learning applications like speech synthesis, natural language understanding, etc.

    + +

    If you’re interested in going deeper, here are links to some fantastic resources that can give you a different perspective in understanding LSTM’s and GRU’s. This post was heavily inspired by them.

    + +

    References

    + +
      +
    1. https://colah.github.io/posts/2015-08-Understanding-LSTMs/
    2. +
    3. https://stanford.edu/~shervine/teaching/cs-230/cheatsheet-recurrent-neural-networks#overview
    4. +
    5. https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21
    6. +
    7. https://www.youtube.com/watch?v=8HyCNIVRbSU
    8. +
    9. https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0
    10. +
    11. https://analyticsindiamag.com/overview-of-recurrent-neural-networks-and-their-applications/
    12. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/machine-learning-for-stock-market-investment/index.html b/blog/machine-learning-for-stock-market-investment/index.html new file mode 100644 index 0000000..cdb54c3 --- /dev/null +++ b/blog/machine-learning-for-stock-market-investment/index.html @@ -0,0 +1,591 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    Arthur Lee Samuel, the man who coined the term “machine learning” defined it as the field of study that gives computers the ability to learn without being explicitly programmed.

    +
    + +

    A good analogy to how it actually works would be teaching a child to play chess by locking him in a room with nothing but the rules of the game and a record of say, a hundred previous games (and of course, food and water). After a period of five days, the child would walk out of the room as a pretty good chess player. In our analogy, the child is the ‘machine’, the record of chess games would be the data (which the child is ‘learning’ from) and the rules of the game would be the algorithm.

    + +

    overview

    + +

    Now, let’s talk about how this can be applied to predicting the likelihood of a stock doing well.

    + +

    1. The Algorithm

    + +

    We’ll be using a Support Vector Machine (SVM) in this example. SVMs are based on the idea of finding a hyperplane that best divides a dataset into two classes, as shown in the image below. How do we find the right hyperplane? The distance between the hyperplane and the nearest data point from either set is known as the margin. The goal is to choose a hyperplane with the greatest possible margin between the hyperplane and any point within the training set, giving a greater chance of new data being classified correctly. However, if there isn’t a clear margin between the support vectors like there is in the image below, things get tricky. To overcome this problem, we would use a kernel which would transform our support vectors to a different coordinate system which would make the classification problem easier.

    + +

    SVM

    + +

    Margins

    + +

    UseOfAKernel

    + +

    2. The Tools

    + +

    There are a few challenges to our problem. Firstly, the stock market is closed on weekends and hence, there are no open/close prices for any stocks on those days which hampers our dataset. Hence, we would need to interpolate the data on these days to better our prediction. Secondly, the stock market is highly fluctuating and hence, we would need to use a technique called smoothing. Here’s an example of how data looks before and after applying smoothing:

    + +

    Smoothing

    + +

    The most important tool needed however for machine learning is the dataset itself. A good resource for data on the stock market is Quandl. Here’s a dataset of ten years’ data on SMP 500 Companies in the US and thirty five features to learn on. The SVM algorithm will try seeing if there is any correlation between these parameters and stock price. We will be using the Python framework Scikit-learn which allows us to use Machine Learning tools almost as a black box, without having explicit knowledge on how these algorithms work.

    + +

    3. The Prestige

    +

    Here’s some code on preprocessing the dataset from Quandl that would transform the data into a form recognisable to the SVM:

    + +
    def key_Stats(gather=["Total Debt/Equity",'Trailing P/E','Price/Sales','Price/Book','Profit Margin', 'Parameters that we wil learn on']):
    +    L = []
    +    statspath = path + '/_KeyStats'
    +    stock_list = [x[0] for x in os.walk(statspath)]
    + 	
    +    sp500 = pd.DataFrame.from_csv("YAHOO-INDEX_GSPC.csv")
    +    ticker_list = []
    + 	
    +    for each_dir in stock_list[1:]:
    + 		each_file = os.listdir(each_dir)
    + 		
    + 		ticker = each_dir.split("/")[6]
    + 		ticker_list.append(ticker)
    + 		starting_stock_value = False
    + 		starting_sp500_value = False
    + 		if len(each_file)>0:
    + 			for file in each_file:
    + 				date_stamp = datetime.strptime(file,'%Y%m%d%H%M%S.html')
    + 				unix_time = time.mktime(date_stamp.timetuple())
    + 				full_file_path = each_dir + '/' + file 
    + 				source = open(full_file_path, 'r').read()
    +			    value_list = []
    +			    for each_data in gather:
    +				    #Preprocessing for determining stock price
    +			
    +			    try:
    +				    stock_price = float(source.split('</small><big><b>')[1].split('</b></big>')[0])
    +			    if not(starting_stock_value):
    +				    starting_stock_value = stock_price
    +			    if not(starting_sp500_value):
    +				    starting_sp500_value= sp500_value
    +
    +			    stock_p_change = (stock_price - starting_stock_value)/ starting_stock_value *100
    +			    sp500_p_change = (sp500_value - starting_sp500_value)/starting_sp500_value * 100
    +
    +			    difference = (stock_p_change - sp500_p_change)
    +			    if difference > 0:
    +				    status = "outperform"
    +			    else:
    +				    status = "underperform"
    +			    if value_list.count("N/A")>0:
    +				    pass
    +			    else:
    +				    d  = {...} #Dictionary of parameters for the stock being traversed 
    +				    L.append(d) #Adding to the list 
    +
    + +

    At this point, we would apply the smoothing technique on the data. The final step is just feeding the data to the algorithm and letting it work it’s magic!

    + +
    def analysis():
    +    # Fit the SVC (exclude the last column).
    +    X_train, y_train = build_data_set()
    +    clf = svm.SVC(kernel="rbf", C=8, gamma=0.3)
    +    clf.fit(X_train[:-1], y_train[:-1])
    +
    +    # Now we get the actual data from which we want to generate predictions.
    +    data = pd.DataFrame.from_csv("YAHOO-INDEX_GSPC.csv")
    +    data = data.replace("N/A", 0).replace("NaN", 0)
    +
    +    X_test = preprocessing.scale(np.array(data[FEATURES].values))
    +    Z = data["Ticker"].values.tolist()
    +    invest_list = []
    +
    +    # If our SVM predicts outperformance, append that stock to an invest_list.
    +    for i in range(len(X_test)):
    +        p = clf.predict(X_test[i])[0]
    +        if p:
    +            invest_list.append(Z[i])
    +
    +    return invest_list
    +
    + +

    We’re comparing the performance of each stock represented by stock_p_change against how the market collectively is doing which is represented by sp500_p_change. If it outperforms the market, we would consider it as a stock that’s doing well and assign it the parameter outperform. This is equivalent to a person ‘winning’ a game of chess as used in the analogy above and is what the SVM uses in its classification.

    + +

    We’re done! invest_list would represent which stocks are likely to do well as predicted by our SVM. With about 150 lines of code, we’ve managed to get a prediction accuracy of 63%.

    + +

    Room for Improvement

    +

    The stock market isn’t as dependant on its history as it is on current events and how companies are doing in real life. One way to increase our prediction accuracy would be to parse the headlines of newspaper articles relating to the companies we’re interested in and use that as data in addition to the other parameters. Scikit-learn really is meant for beginners just getting started on machine learning. The next step would be to move to a framework like TensorFlow and either write your own code for applying a machine learning algorithm on your dataset or to use the built in functions of the framework which do offer better results.

    + +

    Resources

    + +

    To get started on Machine Learning, I would highly recommend watching the MIT Open Courseware lectures.

    + +

    Along with this material, getting started on small projects in Python is the only way to get the sense of achievement needed to stay driven.

    + +

    Happy learning!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/machine-learning-magic/index.html b/blog/machine-learning-magic/index.html new file mode 100644 index 0000000..ad9c8fb --- /dev/null +++ b/blog/machine-learning-magic/index.html @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “Did you ever wonder how ML algorithms work?”
    +“How is the weather forecast done?”
    +“How does the self-driving car mimic the way humans drive?”
    +“Let’s try to find answers to some of those questions…”

    +
    + +

    WHAT IS THIS MACHINE LEARNING ?

    + +

    Assume you have some data, it could be anything like a set of tweets or Images of handwritten numbers or Emails marked as spam. +But you don’t know what to do with it!!!

    + +

    img1

    + +

    So you look for an algorithm which can use this data and give you something you are interested in!

    + +

    img2 +So how does this becomes possible? We take the example of marking tweets as suicidal. We make an ML model which is a simple function that takes emails as input and gives spam or not spam as output. So now we tell this model to filter out all those tweets which have #suicide or related words. But that can be many different types of tweets, for example-

    + +
      +
    • the tweet is posted for suicide awareness and prevention
    • +
    • the person is talking about suicidal ideation and/or ways to kill himself
    • +
    • the tweet reports a third person’s suicide eg: news report
    • +
    • the tweet uses suicide as a figure of speech eg: career suicide
    • +
    + +

    So we have to filter, even more, example:

    + +
      +
    • The text conveys a serious display of suicidal ideation; e.g., I want to die or I want to kill myself or I wish my last suicide attempt was successful;
    • +
    • Posts where suicide plan and/or previous attempts are discussed; e.g., ”The fact that I tried to kill myself and it didn’t work makes me more depressed.”
    • +
    • The tone of the text is cloudy and not serious, eg: This makes me want to kill myself, lol, ”This day is horrible, I want to kill myself hahaha” are not included in this category.
    • +
    + +

    So we filter out tweets containing words like “haha” or “lol”, and include the tweets having “I want to die”, “I want to kill”, occurrences of “I”, “kill” and “myself” together. We train it with labelled test set(tweets labelled as suicidal or not suicidal). Training means adding features and tweaking parameters of function so that it obtains the same result that is labelled on training data. After doing this our Model is ready.
    +Now we can feed any tweet and it’ll use the algorithm and tell us if a tweet is suicidal or not.
    +We can’t classify everything correctly, for example, The tweet ”Is it odd to know I’ll commit suicide?” is a tweet that both human annotators, as well as the proposed methodology, couldn’t classify due to its ambiguity, but still, for normal tweets, these algorithms can achieve remarkable accuracy.

    + +

    img3

    + +

    So Machine Learning is the science of programming computers so they can learn from data! +ML is a subset of the larger field of artificial intelligence (AI) that “focuses on teaching computers how to learn without the need to be programmed for specific tasks,”
    +In fact, the key idea behind ML is that it is possible to create algorithms that learn from data and make predictions on it.

    + +

    TYPES OF MACHINE LEARNING

    + +

    SUPERVISED LEARNING: Train me!

    + +

    The case we saw above is an example of supervised learning, we had the labelled tweets and made a function to map tweets with the output

    + +

    But what if the data we had wasn’t labelled?

    + +

    UNSUPERVISED LEARNING: I am self-sufficient in Learning

    + +

    That is when UNSUPERVISED LEARNING comes into action. It learns from data that are not labelled and does categorization or classification.

    + +

    And the last one is

    + +

    REINFORCEMENT LEARNING: My life my Rules! (hit and trail)

    + +

    It is about taking suitable action to maximize reward in a particular situation.

    + +

    img5

    + +

    Reinforcement learning differs from the supervised learning in a way that in supervised learning the training data has the answer key with it so the model is trained with the correct answer itself whereas in reinforcement learning, there is no answer but the reinforcement agent decides what to do to perform the given task. In the absence of training dataset, it is bound to learn from its experience.

    + +

    img4

    + +

    img6

    + +

    How to learn more about Machine Learning?

    + +

    The best place to get Started with basics of ML is Andrew Ng’s Machine Learning Course from coursera. It’s highly recommended for beginners. It’s easy for anyone who has a minimal amount of knowledge of maths :)type

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/machine-translation/index.html b/blog/machine-translation/index.html new file mode 100644 index 0000000..e286daf --- /dev/null +++ b/blog/machine-translation/index.html @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “How does Google translate work? How do Alexa and Siri know what and when to respond to your queries?”

    +
    + +

    What does Machine Translation mean?

    + +

    Machine Translation is essentially software that automatically renders text from one language into another. Formally speaking it falls under computational linguistics and language engineering. Machine translation needn’t just be conversion across human readable languages but can also be used for tasks like trigger word detection, converting human readable dates like ‘Tuesday, the 29th of Jan,2019’ to formats like 29-01-2019.

    + +

    img1

    + +

    Various Methods of Machine Translation.

    +

    In the late 80’s, Rule-based Machine Translation, or RBMT was the initial approach for translating text. It involved following rules layed down by linguists to convert across different languages,the rules could apply at the lexical, syntactic, or semantic level. This method produced a very predictable output for a very closed domain and didn’t require a bilingual corpus (structured text data in two different languages). The problem with this was the expertise required to develop the rules, and the vast number of exceptions required. It was labour intensive and failed to perform well for real-life text.

    + +

    Statistical machine translation, or SMT was a technique that was widely adopted in the industry in the early 90’s , this techinque used statistical and probabalistic models to learn to translate text from a given a source to a target language. In a paper in 1990 (A Statistical Approach to Machine Translation) the problem of translation was stated as

    + +
    +

    Given a sentence T in the target language, we seek the sentence S from which the translator produced T. We know that our chance of error is minimized by choosing that sentence S that is most probable given T. Thus, we wish to choose S so as to maximize Pr(S/T).

    +
    + +

    This technique became widely adopted since it didn’t require a set convoluted rules, exceptions and complex grammar constructs. All that was needed was sample translations of documents. This approach was completely data dependant, meaning no linguists were needed to specify any sort of rule. SMT quickly outperformed the rule-base methods and soon became the de-facto standard techinque for machine translation.

    + +

    Google Translate and Bing Translator and many others still employ this technique at the core of their translation systems. Since they operate on statistics they look for patterns in hundreds of millions of documents that have already been translated by human translators. Google Translate makes special use of UN documents, which are translated in all six official UN languages, and thus provide ample linguistic data. This way, they can weigh a plethora of options for phrases presented by various different (human) translations, and select an educated guess based on the one that occurs most frequently. But statistical approaches required careful tuning of each module in the translation pipeline, and the pure data-driven approach also caused loss of syntax distinctions that could clearly be defined by linguists.

    + +

    But recently, a novel approach called Neural Machine Translation, NMT has gained traction. Though this is a statistical approach, this method uses neural networks, primarily Recurrent Neural Networks, RNN to perform language translation. This method falls under Deep Learning and can learn directly, in an end-to-end fashion to translate across various langauges and all it requires is the text corpus.

    + +

    Translation is achieved through just a single model that has no extra overheads.

    + +

    img2

    + +

    The current state-of-the art network architecture is the encoder-decoder model with an attention mechanism that has shown the best results, partly because of the availability of massive datasets and access to huge computational power.

    + +

    This architecture involves encoding the input sentence into a vectorized form that the model can manipulate and decode it into another language format. This also takes care of cases where the translated sentence is of a different length than the original sentence. The attention mechanism that is in place allows the neural network to recognize the important words that are relevant for translation across different languages.

    + +

    img3

    + +

    The model shown above, uses a type of RNN unit called LSTM (Long Short-Term Memory), every word in the source is passed into one LSTM unit in a sequential manner and for each word present in the input, a context vector is generated that measures the importance that must be given to that word while translating. For the encoding, the input is scanned from both directions using a Bidirectional LSTM, and once an encoding is formed decode network translates this text into another language. This allows the model to perform well on a long input sentences and be robust for different types of text.

    + +

    The key to the encoder-decoder architecture is the ability of the model to encode the source text into an internal fixed-length representation called the context vector. Once this is done different decoders could be used to translate the source to different languages.

    + +

    References

    + +
      +
    1. How Machine Translation works
    2. +
    3. Introduction to Neural Machine Translation
    4. +
    5. Machine translation Wiki
    6. +
    7. Machine translation
    8. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/magnetically-repelling-ice/index.html b/blog/magnetically-repelling-ice/index.html new file mode 100644 index 0000000..2741d3b --- /dev/null +++ b/blog/magnetically-repelling-ice/index.html @@ -0,0 +1,485 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    People can be nervous fliers to begin with. Even when there isn’t a cloud in the sky, there are few words that cause anxiety in some like, “Prepare for takeoff.” But add wintry conditions to the mix, add some ice, and the uneasy feeling can turn to fear.

    + +

    How does ice cause a plane to crash?

    + +

    Ice typically builds up when tiny cloud droplets impact and freeze on the leading edges, or front surfaces, of the plane. The ice alters airflow over the wing and tail, reducing the lift force that keeps the plane in the air, and potentially causing aerodynamic stall—a condition that can lead to a temporary loss of control. For scheduled air carriers (including commercial passenger airlines) icing has been a contributing factor in 9.5 percent of fatal air carrier accidents.

    + +

    For now, the creation is simply called a “magnetic slippery surface” and is made of two components. The first is magnetic tape. “This tape can be put on any surface, whether polymer, metal, etc.” he says. The second component is ferrofluid, which he says is basically a mixture of fluid and magnetic nanoparticles, the latter being on the order of 5 to 10 nanometers in diameter. The ultimate idea was that this combination would make sure ice never encounters a solid to cling to.

    + +

    How it works?

    + +

    Looking at a water drop mixing with a solid, it showed a strong bond has adhesion strength on the order of 100,000 pascals. When ice builds up and has contact with a solid then it has a very solid bond and is very hard to detach. When cold weather sits on a fluid surface, this combination [of magnetic tape and ferrofluid] doesn’t allow the ice to see the solid and it just floats on the surface. Adhesion strength with this invention is 2 pascals. Hadi Ghasemi, assistant professor of mechanical engineering at the University of Houston, who is working on this, says that this is under critical testing but its moving forward and has an optimistic future. One of his goals, he says, is for it to be used in spray form.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/market-basket/index.html b/blog/market-basket/index.html new file mode 100644 index 0000000..5e8c68d --- /dev/null +++ b/blog/market-basket/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Market Basket Analysis

    + +

    Ever wondered how Flipkart knows what items to suggest to you before and after you make a purchase? The is an aspect of analysis created specifically to promote sales called market basket analysis (MBA). In the retail industry, MBA refers to an unsupervised data mining technique that discovers co-occurrence relationships among customers’ purchase activities. The technique is based on the theory that if you buy a certain group of items, you are likely to buy another group of items. For example: while at McDonald’s, if you buy sandwiches and cookies, you are more likely to buy a drink than someone who did not buy a sandwich.

    + +

    Example

    + +

    This technique involves finding a relationship between purchased products by discovering links using simple rules, known as the rules of association. Market basket analysis can effectively present product offers, create more effective promotions and develop more efficient marketing campaigns. The quality of rules determines several measures like support,confidence and lift which are important from business point .

    + +

    Apriori Algorithm

    + +

    In data mining, Apriori is a classic algorithm for learning association rules. Apriori is designed to operate on databases containing transactions (for example, collections of items bought by customers, or details of a website frequentation). . The whole point of the algorithm (and data mining, in general) is to extract useful information from large amounts of data. For example, the information that a customer who purchases a keyboard also tends to buy a mouse at the same time is acquired from the association rule below:

    + +

    Support

    +

    The percentage of task-relevant data transactions for which the pattern is true. +Support (Keyboard -> Mouse) = Support

    + +

    Confidence

    +

    The measure of certainty or trustworthiness associated with each discovered pattern. +Confidence (Keyboard -> Mouse) = Confidence

    + +

    MBA is being used in all aspects of business from small scale retailing to large scale marketing .Its being used extensively in the food industry as well .Suppose that the sales report in a confectionary shop shows that on the first Monday of the month of 1,000 customers, 200 bought cupcakes, and from those who bought cupcakes , 50 bought chocolates as well . Here we see a rule that if someone buys cupcakes, also buys chocolates, which support is 5% (50/1000), and the confidence is 25% (50/200).

    + +

    How can you use MBA for your own store !

    + +
      +
    1. Store Organisation: +Based on the insights from market basket analysis you can organize your store to increase revenues. Items that go along with each other should be placed near each other to help consumers notice them.
    2. +
    3. Spam Messages: +By using data from MBA you can suggest the next best product which a customer is likely to buy. Hence you will help your customers with fruitful suggestions instead of annoying them with marketing blasts.
    4. +
    5. E-Commerce Websites: +In case of e-commerce businesses, website content placement is very important. MBA can be used to predict what a customer will buy next based on the items the customer has viewed . This will not only increase revenue but also bring in more customers
    6. +
    7. Recommendation Engines: +Recommendation engines are already used by some popular companies like Netflix, Amazon, Facebook, etc. If you want to create an effective recommendation system for your company then you will also need market basket analysis to efficiently maintain one.
    8. +
    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/mems/index.html b/blog/mems/index.html new file mode 100644 index 0000000..3f1ba50 --- /dev/null +++ b/blog/mems/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    MEMS (Micro Electro Mechanical Systems)

    +

    An introduction to field of micro systems and their applications.

    + +
    +

    “There is plenty of room at the bottom.”

    +
      +
    • Richard Feynman
    • +
    +
    + +

    This article deals with the emerging field of micro-electromechanical systems, or MEMS. MEMS is a process technology used to create tiny integrated devices or systems that combine mechanical and electrical components. +These devices (or systems) can sense, control and actuate on the micro scale, and generate effects on the macro scale. +MEMS has been identified as one of the most promising technologies for the 21st Century and has the potential to revolutionize both industrial and consumer products by combining silicon-based microelectronics with micromachining technology. Its techniques and microsystem-based devices have the potential to dramatically effect of all our lives and the way we live.

    + +

    fig1

    + +

    While the device electronics are fabricated using ‘computerchip’ IC technology, the micromechanical components are fabricated by sophisticated manipulations of silicon and other +substrates using micromachining processes.In the most general form, MEMS consist of mechanical +microstructures, microsensors, micro actuators andmicroelectronics, all integrated onto the same silicon chip.Microsensors detect changes in the system’s environment by measuring mechanical, thermal, magnetic, chemical or electromagnetic information or phenomena. Microelectronics process this information and signal the micro actuators to react and create some form of changes to the environment.

    + +

    fig2

    + +

    However, MEMS is not just about the miniaturization of mechanical components or making things out of silicon (in fact,the term MEMS is misleading as many micromachined devices +are not mechanical in any sense). MEMS is a manufacturing technology; a paradigm for designing and creating complex mechanical devices and systems as well as their integrated +electronics using batch fabrication techniques.Over the past few years some highly innovative products have emerged from bio MEMS companies for revolutionary applications that support major societal issues including DNA sequencing, drug discovery, and water and environmental monitoring.

    + +

    fig3

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/metamaterials/index.html b/blog/metamaterials/index.html new file mode 100644 index 0000000..afe2064 --- /dev/null +++ b/blog/metamaterials/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Metamaterials are engineered materials or artificially structured composite materials that are made to possess properties absent in conventional materials. The internal microstructure of these materials is what makes these stand apart from naturally occurring materials. The properties of these materials depend on the structure rather than the composition of the material. The structure of the material can be tailored and tuned on a microscale level to suit the required application. The material is arranged in a recurring fashion at scales smaller than the wavelength of the waves used in that particular application. Upon precise engineering, the material can be made to interact with waves in a way not observed in bulk materials. Some of the applications of metamaterials:

    + +

    1. Electromagnetic metamaterials

    +

    Negative refractive index - Refractive index refers to the ability of a material to deflect light. Conventional materials have a positive refractive index. In negative refractive index materials, light bends in a direction opposite to that of the incident beam after entering the medium. The negative value of the refractive index is due to the negative permeability and permittivity of the material and is known as double negative materials (DNG). The structure comprises of periodically arranged split-ring resonators. Unlike regular materials, these materials follow the left-hand rule of electromagnetism. These materials have unusual electromagnetic properties and hence makes a “perfect lens.” A metamaterial with a refractive index of -1 can focus light with minimum change in the resolution even if it is the form of a parallel-sided slab. +Imaging below 200nm is not possible using optical methods, but with the help of superlens, which is a metamaterial application, imaging below the diffraction limit, i.e., subdiffraction-limit imaging, is possible. The superlens can be a more cost-effective and high-resolution alternative to electron microscopes. + Figure 1 +Figure 1: a) Positive Refractive Index material; b) Negative refractive Index material; c) A parallel-sided slab with a Negative Refractive Index behaves as a perfect lens.

    + +

    Optical Cloaking - Cloaking refers to the usage of metamaterials as an invisibility cloak. Conventional material scatters light and hence is visible to the human eye. An object can be said to be “invisible” if it does not absorb, scatter, or reflect any electromagnetic radiation, i.e., it does not disturb the existing electromagnetic field. A cloaking device bends radiation around the object, making it undetectable. Metamaterials can act as cloaking devices over certain electromagnetic ranges. But the application in this field is limited as a fully functional cloaking device in the visible light range has not yet been achieved.

    + +

    Figure 2 +Figure 2: Left) An object placed in an electric field disturbs the field lines; Right) A cloaked object does not disturb the field lines making it “invisible.”

    + +

    2. Seismic metamaterials

    +

    Seismic metamaterials are earthquake dampeners, which dampen the effect of seismic waves on infrastructure and other objects. They work on a similar principle as the electromagnetic metamaterials, i.e., they make the object invisible to the seismic waves. These materials, when cloaking around an object, deflect the waves away from the object. A densely populated forest is a natural example of a seismic metamaterial. + Figure 3 +Figure 3: An illustrated representation of a structure being made “invisible” to seismic waves with metamaterials

    + +

    3. Acoustic metamaterials

    +

    As the name implies, acoustic metamaterials can control and manipulate sound waves. Similar to electromagnetic metamaterials, acoustic metamaterials have negative values for bulk modulus and mass density, which does not allow sound wave propagation. This property can be exploited to cancel or concentrate on sound waves. The periodic arrangement of unit cells gives the material new bulk properties, as mentioned above. They can trap and slow down sound waves as used in sound isolation. This method can be widely used for medical purposes. E.g.: - Metamaterials can be utilized to focus high-intensity ultrasound on destroying tumours in inaccessible areas in the body. Acoustic metamaterials are a good substitute for conventional acoustic materials at low-frequency ranges since, at low frequencies, the wavelength is higher than the effective depth of the material, thus reducing the performance of regular materials. Acoustic metamaterials are further being implemented in medical imaging, soundproofing and noise cancellation, sonar dampening, stealth technology, cloaking, and frequency filters. + Figure 4 +Figure 4: An illustration of an acoustic metamaterial used to trap and slow down sound waves

    + +

    Research in metamaterials is an emerging interdisciplinary field and has tremendous potential in various fields in the forthcoming years. From camouflage and stealth in military operations to noise isolation to even something like the invisibility cloak from Harry Potter can be envisioned with the aid of metamaterials. Something which was only witnessed in science fiction movies and novels is closer to reality than we imagine.

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/microled/index.html b/blog/microled/index.html new file mode 100644 index 0000000..b9a81a6 --- /dev/null +++ b/blog/microled/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The Future of Television?

    + +

    INTRODUCTION

    + +

    Recently at the CES(Consumers Electronics Show) 2018 Samsung unveiled its prototype of the MicroLED at the consumer level with a 146inch MicroLED TV under the name “The Wall”. MicroLED technology was invented in the year 2000 by a research group run by Prof. Hongxing Jiang and Prof. Jingyu Lin of the Texas Tech University. However, the first demonstration of MicroLED as a consumer product can be traced back to Sony’s 55-inch FullHD “Crystal LED Display” that was showcased back in 2012. This was incredibly expensive and was not viable on a commercial scale. To understand why MicroLED can be a revolution in the TV industry we need to delve into the working of the Modern Day TV.

    + +

    1

    + +

    LED OLED µ LED

    + +

    The LED TVS that we consumers use currently consist of a basic LCD display that are illuminated by compact and efficient light emitting diodes(LED) whereas the LCD TVs use cold cathode fluorescent lamps(CCFLs) to provide backlighting. CCFL is an older form of backlighting whose use commercially has been abandoned due to inferior picture quality as well as bigger size.

    + +

    The latest commercial trend after the LED TVs have been the OLED’s. OLED (Organic light emitting diode) is a LED in which the luminescent layer consists of a film of an organic compound that emits light whenever electric current is passed through it. We don’t need backlighting for these TV’s as each pixel of an OLED screen makes its own light. These lead to

    + +

    1) Deeper Black Levels of OLEDs as the black OLED’s emit no light.

    + +

    2) Greater Contrast Ratio and Wider viewing angle with respect to LEDs as each OLED pixel makes its own light without the usage of any backlights

    + +

    3) Better power efficiency as an inactive OLED element does not produce light or consume power unlike normal LEDs where the backlight has to be always on.

    + +

    The downside to OLED’s are that they are pretty expensive as they consist of organic compounds. Their lifespan is also low with RGB luminance degradation reaching around 10% within 1000 viewing hours.

    + +

    2

    + +

    This is where MicroLEDs come into the picture.Unlike OLED, MicroLED is based on conventional GaN LED technology, which offers far higher total brightness than OLED produces, as much as 30 times, as well as higher efficiency in terms of lux/W which basically means lesser power consumption for similar brightness. With their emissive display they can beat OLED’s as they don’t contain organic compounds and rather use smaller and more compact LED’s. The MicroLED’s are therefore immune to burn-in and hence the degradation in luminance will be minimal.MicroLEDs offer higher brightness than any current display technology along with excellent colour and near-perfect off-angle viewing.

    + +

    Recent reports also state that Apple has begun experimenting with MicroLEDs to check it’s usability for tiny screens such as the Apple Watch.

    + +

    3

    + +

    CONCLUSION

    + +

    MicroLED still faces lot of challenges to be viable on a commercial scale .The Wall is just a prototype by Samsung and it has to be reduced to a feasible size of 55-65 inch along with the resolution currently present in The Wall to compete with the OLED. Currently its harder to produce a MicroLED screen when compared to an OLED screen commercially.

    + +

    Hence we must note that though MicroLED’s haven’t been mass-produced or commercialized, they are near-future technology which we can expect to have in our homes within a few years.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/microservices/index.html b/blog/microservices/index.html new file mode 100644 index 0000000..991f10d --- /dev/null +++ b/blog/microservices/index.html @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    We live in a world that’s constantly growing. There are new applications and services that come up everyday. Existing ones evolve to constantly meet the demands of today’s world and to keep up with the latest trends in technology. This essentially means that there is hardly any time devoted to the maintenance of such applications and services. Nobody likes down-times. If a service is down for sometime, its users would naturally start looking for alternatives, and with such a huge network of service providers available over the internet, they would quite obviously even find one. This is where Microservices comes into the picture.

    + +

    This blog delves into the “What” and “Why” of Microservices in detail.

    + +

    What are Microservices?

    + +

    If you are not very new to the world of The Cloud or Systems, then you would’ve heard the term “Microservices” quite frequently. Microservices, as the name suggests, is an architectural style that branches out an application into several small independent applications or services. These individual modules are independently built and deployed. Going by the official definition,

    + +
    +

    Microservices - also known as the microservice architecture - is an architectural style that structures an application as a collection of services that are

    +
      +
    • Highly maintainable and testable
    • +
    • Loosely coupled
    • +
    • Independently deployable
    • +
    • Organized around business capabilities
    • +
    • Owned by a small team
    • +
    +
    + +

    The microservice architecture enables rapid, frequent and reliable delivery of large, complex applications.

    + +

    Let’s go through each of these points one by one.

    + +
      +
    1. Highly maintainable and testable - Since a huge application is broken down into several chunks, it’s not only easier to spot bugs, but also fix them without getting the entire application down. It is also possible to scale up or scale down a component easily, since each of them is completely independent of each other. Scaling up is making a component larger or faster to handle a greater load. In contrast, scaling down refers to decreasing your system resources.
    2. +
    3. Loosely coupled - Each of the individual components, as mentioned before, are independent and isolated. They cannot communicate with each other, except through APIs. None of the components have any say on the structure of another communication. This gives the developers working on each of the components complete freedom to build the service as they would like it. A new stack can be added to a service to avail larger benefits at the application level.
    4. +
    5. Independently deployable - Each of the components are independently deployed. I had mentioned earlier that it’s possible to scale up or scale down an individual service. This necessarily means that each component has its own set of dependencies. Two components can also work with different versions of the same dependency. This is possible with the use of containers. Each component is containerised along with its dependencies and configurations and independently deployed. (Containerisation simply means that the application, along with all its dependencies, is put into a “container” and is treated as a single unit during deployment)
    6. +
    7. Organized around business capabilities - Microservices introduce a massive change in the organisational structure of a business group. Since the overall goal is a good user experience, development teams are no longer divided into web teams, systems teams, database teams and so on. Rather, they are cross functional teams that work towards fulfillment of one single functionality.
    8. +
    9. Owned by a small team - A cleaner distribution of functionality into microservices allows for more streamlined organisations with smaller teams.
    10. +
    + +

    Now that we know what Microservices are, we need to know why they are required in today’s world. But for that, we first need to know what monoliths are.

    + +

    What are Monoliths?

    + +

    In software engineering, a monolithic application describes a single-tiered software application in which the user interface and data access code are combined into a single program from a single platform. In simple words, it’s an architectural style that does not treat modules independently in an application. The application is deployed as a whole, and all the different components of an application use the same dependencies, etc. It contains a single executable that performs all of the server-side functions for an application. Let me explain with the help of an example.

    + +

    Let’s consider an e-commerce application. It can have several components to it - a catalogue of products, an ordering system, a payment system, etc. This would mean there are three different containers, one for each service, deployed independently under the Microservices Architecture. Using the Monolithic Architecture, we would need only one container to bundle up the entire application for deployment.

    + +

    Monoliths vs Microservices

    + +

    Why Microservices?

    + +

    We’ve read in detail about what microservices and monoliths are. But why are microservices preferred over monoliths?

    + +

    Let’s consider a monolithic application with a huge codebase. A small bug somewhere brings the entire application down. It would naturally be difficult to pin-point the location of the bug because of the huge codebase. It also does not make sense to bring the entire application down because of the bug, when the rest of the application is working completely fine. Issues may also arise when scaling up or scaling down the application. All components of the application would have to use the same versions of dependencies. Any conflicts with dependencies can break the entire application.

    + +

    Now let’s consider the same scenario with Microservices. A small bug in the codebase need not bring the entire application down, since each component is independently deployed. This also means that bugs are easier to trace and fix. Scaling up and scaling down the application is much easier as each component is bundled together with its dependencies and containerised for deployment.

    + +

    Conclusion

    + +

    Although microservices have an edge over traditional monoliths due to the aforementioned reasons, it does come with several drawbacks. As each component is deployed independently and communication between components happens only via APIs, there’s the problem of consistency. It also uses up a lot of resources, as there are multiple deployments, and not just one.

    + +

    However, the reason microservices are preferred over traditional monoliths is because of its ability to cleverly deal with bugs, and ease of maintenance. It may take up a lot of resources, but with cloud providers like Google Cloud, AWS, MS Azure providing resources at a nominal price, it is a welcome trade-off. After all, nobody likes down-times, and hence, microservices are the way to go.

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/minimax-algorithm/index.html b/blog/minimax-algorithm/index.html new file mode 100644 index 0000000..26f4926 --- /dev/null +++ b/blog/minimax-algorithm/index.html @@ -0,0 +1,580 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    An Introduction to Minimax Algorithm

    +

    Ever wondered how a computer is able to play wisely in games like Tic-Tac-Toe, Chess and Go? It all boils down to the ever-evolving Artificial Intelligence (AI). Now, what if I say that building powerful AI for such games is easy? Yes, you read it right. We can design powerful AI that can play games much better than you, me or pretty much everyone. As a first step towards this, I would like to introduce you guys to a pretty simple, yet essential algorithm for this task - Minimax Algorithm.

    + +

    What is Minimax Algorithm?

    +

    Minimax algorithm, sometimes also called MinMax, is a recursive or backtracking algorithm which is used to choose an optimal move for a player, assuming that the other player is also playing optimally. It is applicable only to 2-player games, where the opponent’s move is predictable beforehand. For eg. Minimax algorithm can be applied to games like Chess, Tic-Tac-Toe and not for games like Scrabble. It uses recursion to search through the game-tree. +What is a Game Tree? Game-tree is the collection of all possible moves in a game that looks more like an inverted tree. To explain in simple terms, it is similar to looking into different possible moves from a particular game board situation and subsequent possible moves after them and so on or saying that “If I make this move, then my opponent has all these as his/her move”. Game state refers to the present board situation. Every possible state is represented as a node in the tree. All the possible moves from a state or node become the children nodes of this node (ie. are diverged from this node). So when all nodes get connected in this manner, it looks like an inverted tree called - Game tree.

    + +

    Terminology

    +

    To start with, let us first look at some of the commonly used terminology used for this algorithm:

    +
      +
    • MAX : Player whose chances of winning is to be maximised.
    • +
    • MIN : Player whose chances of losing is to be maximised.
    • +
    • Initial state : Comprises the position of the board and showing whose move it is.
    • +
    • Successor function : A function that lists all the valid moves from the current state of board.
    • +
    • Terminal state : Position of the board at the end of the game. This state determines the outcome of the game as either a win, a loss, or a draw, for MAX
    • +
    + +

    How does the algorithm work?

    +

    The main idea is to maximize the chances of winning for MAX. How do we do it? For that we assign a value (or weights) to every node of the game tree such that higher its value, the higher the chances of winning for MAX. Now we need to assign the values to the node in such a way that assures this mechanism. So in order for MAX to win, he/she needs to choose the maximum value out of the possible ones. And MIN has to make a move such that MAX is forced to choose the minimum value out of the possible. +Let’s apply this to an example. Suppose we have a game tree like the one shown. Suppose the weights of the last layer be given to us before-hand (as shown).The rule of the game says that the final value in the red triangle is the points achieved by MAX. So in order to win, MAX has to somehow make red triangle has the maximum value as possible. Also, the weights of the nodes in a layer can take any one of the values from the immediate nodes diverged from it.

    + +

    image for Game tree 1

    + +

    Eg: Leftmost green triangle can take only 55 or 13, rightmost green triangle can only take 13 or 38 and the middle green triangle can take 43 or 62. The red triangle can take value from any of the green triangle.

    + +

    Since MAX get to choose the value in the red triangle, MIN has to select values for the green triangle. In order for MIN to win, he/she chooses minimum value possible for each green triangle, thus forcing MAX to choose one among these low values assigned at green triangles. In games with more than 3 layers it is alternate way of maximizing and minimising at a layer of nodes, hence the process called Minimax - alternatingly maximising (MAX’s move) and minimising (MIN’s move) the possible values at nodes of the layer in a game tree. So to begin, MIN first fills all the weights (or values) in the middle layer, hence filling the values as follows.

    + +
    +

    minimum(55,13) = 13

    +
    + +
    +

    minimum(43,62)=43

    +
    + +
    +

    minimum(13,38) = 13

    +
    + +

    image for Game tree 2

    + +

    The move of MAX is now restricted by the values in green triangles. In order to win the game, MAX must choose the maximum value possible from the 2nd layer and hence choose 43. The whole process can be simply written as:

    + +
    +

    Result= MAX (MIN {55, 13}, MIN {43, 62}, MIN {13, 38}) = MAX {13, 43, 13} = 43

    +
    + +

    The final game tree looks like this

    + +

    image for Game tree 3

    + +

    Now let’s apply this to Tic-Tac-Toe game. This is how a basic game tree of a Tic-Tac-Toe game.

    + +

    Image for Tic-Tac-Toe 1

    + +

    The initial state at the start of the game is the first layer that defines that the board is blank and it’s MAX’s turn to play. So we must try to maximise the value at this layer. The immediate successor layer is played by MIN, and hence must be minimized since we are assuming that both players play optimally. The next layer is again to be played by MAX and hence maximised and the process continues till the terminal states. So we begin by applying the utilities to all the terminal states. But how do we determine the values at the nodes? We just know only at the end of the game that a player has won or lost. Also observe that the terminal state (nodes from whom no more nodes branch off) are those where no more move is possible or in simple terms - where the game has ended. Giving weights to these nodes is easy. We need a way to keep the value high if MAX wins and low if MAX loses. These can be done by using the utilities as shown below.

    + +

    Utilities used are as follows.

    +
    +

    1 : MAX wins

    +
    + +
    +

    0 : draw

    +
    + +
    +

    -1 : MAX loses

    +
    + +

    Image for Tic-Tac-Toe 2

    + +

    Then we start determining the utilities of the higher nodes by maximising/minimising the values obtained from the immediate previous layer, starting from terminal states similar to the way we did for the above example. With the help of this game tree, we can decide the layer to be chosen at the 1st layer to maximize the winning chances of MAX and continue to choose the best branch in order to win.

    + +

    Implementation

    +

    Here is a pseudocode for implementing the Minimax algorithm.

    +
    function minimax(node, depth, maximizingPlayer)
    +            if depth = 0 or node is a terminal node
    +                   return the utility of the node
    +
    +            if maximizingPlayer
    +                   bestValue := 0
    +                   for each child of node
    +                        v := minimax(child, next depth, FALSE)
    +                        bestValue := max(bestValue, v)
    +                   return bestValue  
    +
    +            else 
    +                   bestValue := 0
    +                   for each child of node
    +                          v := minimax(child, next depth, TRUE)
    +                          bestValue := min(bestValue, v)
    +                   return bestValue
    +
    + +

    Bonus

    +

    Optimisation

    +

    The Minimax algorithm works well for smaller state space, or in other words, smaller board games. For eg., for a Tic-Tac-Toe game, there are 39=196839 possible board combinations which can be easily calculated. But what about a game like chess? It has roughly ~10120 possibilities, which is far greater than the number of atoms in the observable universe, and hence not a good idea to dive into. Then how do we tackle such a thing? Optimising the searching in the game tree is a key solution. Alpha-beta pruning is a promising algorithm in which certain sub-trees are cut-off from the game-search tree when there is a chance of choosing another sub-tree over this one. This reduces the state space to a much greater extent. You can read more about Alpha-Beta pruning algorithm from the following links:

    + +

    What is Alpha Beta Pruning in Artificial Intelligence? - Medium

    + +

    Alpha–beta pruning - Wikipedia

    + +

    References

    + +

    Minimax Algorithm with Alpha-beta pruning

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/multitenancy/index.html b/blog/multitenancy/index.html new file mode 100644 index 0000000..dbffee7 --- /dev/null +++ b/blog/multitenancy/index.html @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What is Multitenancy?

    +

    According to Wikipedia, the term “software multitenancy” refers to a software architecture in which a single instance of software runs on a server and serves multiple tenants. With a multitenant architecture, a software application is designed to provide every tenant a dedicated share of the resources.

    + +

    Single tenancy vs Multitenancy

    + +

    The initial aim of a multitenant architecture was to optimise resource allocation in an application. Instead of providing multiple instances of the same software, a single instance of the software was used to serve multiple tenants. But times have changed. Today, 15 years or more after the creation of application and database multi-tenancy, things are different; the economic necessity for multi-tenancy at the application tier has disappeared. We have huge clouds offering cheap infrastructure and tools creating new instances and tearing them down again without any of the manual interventions that used to be necessary.

    + +

    Then why do we still need multitenant architecture?

    + +

    Trust, or the lack thereof, is the number one factor blocking the adoption of Software as a Service (SaaS). SaaS applications provide customers with centralized, network-based access to data with less overhead than is possible when using a locally-installed application. But in order to take advantage of the benefits of SaaS, an organization must surrender a level of control over its own data, trusting the SaaS vendor to keep it safe and away from prying eyes. +To earn this trust, one of the highest priorities for a prospective SaaS architect is creating a SaaS data architecture that is both robust and secure enough to satisfy tenants or clients who are concerned about surrendering control of vital business data to a third party, while also being efficient and cost-effective to administer and maintain.

    + +

    dB Schema

    + +

    In Multi-tenant applications, one instance serves more than one organization, but at the same time provides virtual isolation to data and applications from other tenants of the application. Multitenancy is applied to data, operating system and even hardware. But in this article we talk only about data.

    + +

    Machine learning and Multitenancy

    + +

    We live in the world of artificial intelligence and machine learning. Every application and website has some form of intelligence incorporated into it. But the learning curve of the machine learning models depend on the data provided by the user. Do you see how multitenancy gets applied here? Let me explain with a scenario. You have deployed a website which provides description of an image that you upload. Like you see in many cognitive services, if you put a picture of a guy trekking, it will say “ A picture of a guy trekking”. The training model is trained with some data which you had collected. But since you have deployed and people are using the, you decide you can improve the model by retraining the model with the new pictures and also correct the model based on the feedback of the results that you provide. Sounds good right, you have a cool website which learns on its own through time. But there is one problem. What if one day, a user mails you asking whether the pictures he upload are private and are not shared. You say that they are private and cannot be accessed by anyone. He decides to check it out by uploading an image from his own account. He gave a feedback regarding the prediction. Then he creates a new account and tries with the same picture. He gets the updated result, ie. the result considering his feedback. This makes him feel insecure about using your website. This is the trust issue that we talked about earlier.

    + +

    In the case of SaaS applications, the application vendor does not own the customer data. So it cannot use one customers data to train a model which is used by other customers. +To tackle this issue, we need an architecture which does not use one user’s data to retrain a model which is used by other users. This virtual isolation is provided by a multitenant architecture. The simple way to tackle this problem is by creating a new model for each tenant. Whenever a new user signs up, create a new instance for that user with the basic training done in the mode. All further predictions and retraining for that user will be done to the model exclusive to him. This ensures data isolation while model retraining. The disadvantage of this is memory. A separate model for every user consumes a lot of memory. The other approach is to intelligently share the models among some users. Instead of creating a new model for each user, only create an instant of the model. All retraining can be done to this instant. The instant can be destroyed and put away to secondary memory when the user is inactive. Though the second method has a lot of overhead, because of the memory it saves, this is method is preferred. You might be confuse thinking how creating new instances of models support multitenancy. Isn’t this the opposite of multitenancy. No, this is because we are still using only one instance of the application. Only the machine learning model that it accesses varies.

    + +

    Choosing an Approach

    + +

    Approach

    + +

    Factors influencing

    +
      +
    1. Economic considerations
    2. +
    3. Security considerations
    4. +
    5. Tenant considerations
    6. +
    7. Law and order considerations
    8. +
    9. Complexity considerations
    10. +
    + +

    Resources

    +
      +
    1. Design Patterns for multitenant SaaS application
    2. +
    3. Implementing multitenancy using namespace
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/my-two-snowflakes/index.html b/blog/my-two-snowflakes/index.html new file mode 100644 index 0000000..fcbe455 --- /dev/null +++ b/blog/my-two-snowflakes/index.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    There are plenty of resources that say that no two snowflakes are alike. But where do we get this idea from? The universe is really old, with countless planets, surely two of them have been alike…

    + +

    Wilson Bentley, an American meteorologist and photographer, worked with snowflakes for 50 years, without getting married, taking detailed photographs of snowflakes and recording their features. He called them ‘masterpieces of design’, but there doesn’t seem to be any design in any of them, but that does not make them any less amazing.

    + +

    image1

    + +

    Every plate, every branch, every needle on a needle on a needle, all of those details, are what is called emergent properties. This is complexity that is based on very simple rules, and for snowflakes, those rules go back to the basic laws of physics. In the air, or in a liquid, water molecules are zipping around, bouncing off each other and every else trillions of times per second, and we have no way of knowing where they are or what direction they are facing at any moment. As we remove heat, it gets colder, and those water molecules start to slow down, eventually their atomic attraction, the actual hydrogen bonds between water molecules take over, and they settle into order. Sounds complicated, but we just call that ‘freezing’.

    + +

    image2

    + +

    The structure of a snowflake can be found in just 6 water molecules. It is known that the angle between any two hydrogen is about 105 degrees. For some of those water molecules, the other hydrogen is behind them. Just like that, we’ve uncovered the six-fold symmetry of a snowflake crystal. That crystal starts as a tiny speck of dust, or pollen, which catches water vapor out of the air and eventually forms the simplest of snowflake shapes: tiny hexagons called diamond dust and then randomness kicks in. Till we get the intricate and delicate structures that we know and love.

    + +

    image3

    + +

    Depending on temperature and humidity, and a variety of factors that are not fully understood yet, those simple hexagons can give rise to seemingly infinite shapes. Each snowflake will travel through different air current and bump into different water molecules. But, in 1998, Nancy Knight claimed to find two identical snowflakes and they do look very much alike. But they cannot be alike and physics tells us why.

    + +

    We know that water molecules are made of two hydrogen atoms and an oxygen atom, but not every hydrogen is created equally. If we go back to the Big Bang, we find out that out of every million or so hydrogen atoms created, a couple hundred of them, instead of just being a proton and an electron, are holding on to a neutron. This is the isotope of hydrogen called deuterium. In Earth’s water, even in you, about one in 3,000 molecules will be holding onto deuterium instead of hydrogen. Out of the millions of molecules that make up a snowflake, a lot of them will be holding onto deuterium. Even identical looking snowflakes are not the same.

    + +

    Now you could love a snowflake just because it’s pretty, but it doesn’t take away from its beauty that it was sculpted by chance and physics. They’re ordered, but they’re created in disorder, every random branch re-tells their history, that singular journey that they took to get here, and most of all they’re fleeting and temporary.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/nano-medicine/index.html b/blog/nano-medicine/index.html new file mode 100644 index 0000000..8fea00f --- /dev/null +++ b/blog/nano-medicine/index.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    How evolutionary is nanomedicine in therapeutics? Is it worth all the hype? Can we, as +engineers, find opportunities in the field of nanomedicine? Well, I hope this article will +answer many similar questions.

    + +

    Nanopills: Medicinal advantage

    + +

    Nanotechnology and its manifestation in Medicine

    + +

    Manifestation of Nanotechnology in Medicine

    + +

    Let’s start with the understanding of how exactly is nanotechnology playing a +noteworthy role in the field of medicine. From its very dawn, nanotechnology has +indeed shaped the fundamental industrial applications such as manufacturing, +biotechnology, semiconductors and fabrication of work area from micro to large- +scale prospects. The impact of nanotechnology on the medical domain is well +pronounced and the results can be pointed out at biosensors, nanosized microchips, +modified liposomal action and mainly the ease brought in the fields of treatment and +diagnosis of diseases.

    + +

    Why use Nanotechnology for Drug delivery?

    + +

    If the goal of research on nanotechnology is just to make something nano, new, and +more complicated, the goal is achieved as seen from the progress made in the last +decade, at least in part. The ultimate goal of any research in drug delivery, however, +must be to develop drug-delivery systems, nanoparticulate systems in this case, to +prevent, to control, and to treat debilitating diseases. Most scientists working in the +pharmaceutical and biotechnology sectors, as well as in academia, want to develop +nanoparticle formulations that can deliver drugs more effectively to the target site for +enhanced efficacy and reduced side effects.

    + +

    Nano Surgery

    + +

    Nanoparticles offer important multifunctional platforms for biomedical applications. +Varieties of nanoparticles, such as silica nanoparticles, quantum dots, metal +nanoparticles, and lanthanide nanoparticles, have unique properties which are +adapted for different applications in the bio-analysis field. Nanoparticles not only +ensure the drug delivery but also the confirmation of target site (commonly tumors). +A new challenge of essentially tracking down the nanomedicine from systemic to +subcellular level is posed which is swept off with the use of fluorescent markers, +those being detectable during diagnostic assays.

    + +

    Target Specificity

    + +

    Various examples in different forms include:

    + +
      +
    • +

      Fe3O4 nanocrystals on uniform dye-doped mesoporous silica nanoparticles +to be used as a contrast agent in magnetic resonance imaging and loaded +doxorubicin in the pores.

      +
    • +
    • +

      Histidine-tagged cyan fluorescent protein-capped magnetic mesoporous +silica nanoparticles system was fabricated for drug delivery and fluorescent +imaging.

      +
    • +
    • +

      Quantum dots are small-sized (1–10 nm) semiconductor nanocrystals +composed of the inorganic elemental core (e.g., Cd and Se) surrounded by a +metallic shell (ZnS). They are widely used in biological research and can +also be used as drug carriers or simply as fluorescent labels for other drug +carriers remain highlighted.

      +
    • +
    + +

    Other notable advancements include usage of iron oxide and gold nanoparticles +due to the presence of surface plasmons which make the nanoparticles to absorb +light in the visible region, making it possible to study their size-dependent light +absorption through surface plasmon resonance (SPR). In terms of biocompatibility +and non-cytotoxicity, gold nanoparticles as approved by the Food and Drug +Administration(FDA) have distinct advantages over other metallic particles and +could also be utilized as a favorable carrier for delivery of drugs. These +nanoparticles can be conjugated with amino acid and proteins. Fabrication of gold +nanoparticles and functionalization with organic molecules to interact with any +physiological system are more important. These functionalized nanoparticles are a +promising candidate for drug delivery as biomarkers of the drug-resistant cancer +cell. Reported application of gold nanoparticles includes insulin delivery by nasal +route, improved antimicrobial action against E. coli strains and ciprofloxacin- +protected nanoparticles for better drug release.

    + +

    Misconceptions and Limitations:

    + +

    Yes, though nanobiotechnological advancements are a promising outcome, +it is not all that it looks like. Nanotechnology fever was fueled by an +observation of the behavior of nanoparticles in tumors in mice, known as the +enhanced permeation and retention (EPR) effect. The EPR effect is +considered to be responsible for increased delivery of nanoparticles to +targeted tumors in mouse experiments. This notion evolved into an idea that +only nanoparticles have the EPR effect. Careful analysis of the original data, +however, indicates that albumin and IgG are actually better in accumulating at +the tumor site.

    + +

    The enhanced EPR effect of PEGylated nanoparticles was thought to be due +to the increased circulation cycles. Thus, it has been widely assumed that +PEGylated nanoparticles having the EPR effect will result in an enhanced +tumor-killing effect, and therefore, the problem of targeted drug delivery to +tumors was partially solved. The reality is that these assumptions have +produced numerous research articles, but have made no significant advances +in translation into patient treatment

    + +

    Nanoparticle formulations, as compared with solution formulations, increase +the drug concentration around a tumor by 100–400%. These increases are +phenomenal by any measure. What is missing here, however, is the big +picture showing the full story on drug delivery. It should be understood that +>95% of the administered nanoparticles end up at sites other than the +targeted tumor; this fact has been largely overlooked. Nanoparticles may +provide an alternative way of making aqueous solution formulations for +intravenous administration of poorly soluble drugs without using undesirable +excipients. This is a great use of nanoparticle approaches. It is simply +different than the widely believed notion that nanoparticles would be far +superior to non-particulate solution formulations.

    + +

    Future Opportunities:

    + +

    Possible wonders

    + +

    Nanoparticles are rapidly becoming the focus of most efforts aiming at targets and +site-specific drug delivery. The targeting ability of nanoparticles depends on certain +factors such as particle size, surface charge, surface modification and +hydrophobicity. Still many problems related to selective binding, targeted delivery +and toxicity need to be overcome. Limited knowledge about the toxicity of +nanoparticles is a major concern and certainly deserves more attention. If these +nanoparticles are cautiously designed to tackle problems related to target and +route of administration, they may lead to a new more successful paradigm in the +world of therapeutics and research. The most promising research in nanoparticle +production is via using supercritical fluids which are environmentally friendly and +free of toxic solvents. Much research is currently being performed to overcome +these hurdles which will definitely establish nanoparticle-based drug delivery as the +gold standard for site-specific therapeutics. Though ample optimizations are existing +in the field nanotechnological research in the medical field is an evergreen +opportunity.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/nanomachines/index.html b/blog/nanomachines/index.html new file mode 100644 index 0000000..52e42cc --- /dev/null +++ b/blog/nanomachines/index.html @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    This article provides a brief insight in the field of nanomachines and nanosensors, the challenges faced by the researchers in this field, and the promise they hold for us in future applications.

    + +

    What is the difference between micro and nano systems?

    +

    When we talk about about nanomachines, we consider devices which are only a few atoms apart in their dimensions whereas in microsystems, the dimensions are in the range of a few microns. Thus, these devices can only be observed under HR-TEM (High Resolution Tunneling Electron Microscope) or thermal imaging techniques.

    + +

    A nano car developed by RICE University

    + +

    How do these machines move?

    +

    The very first challenge that we face as a result of too much scaling down is how we are going to move these tiny machines; be it a nanocar a few atoms across or a nanobot? We simply cannot fit an even smaller diesel engine or a servo motor. Instead, we use some other phenomena, which are insignificant in macro scale but cannot be ignored in microscale.

    + +

    Several years ago, researchers at RICE University created nanocars which are only a few atoms wide. They were made to move by thermal excitation

    + +

    Let us consider another example. This time, a microbot. These ‘microbots’ are small tubes that are made of several layers of different metals. They are designed to pick up unhealthy damaged cells and transport them within our body. So how do we move them? Hydrogen Peroxide is used as a fuel for these bots. The highly reactive compound produces bubbles of oxygen which acts as the exhaust of a nano jet engine, thus propelling the bot forward.

    + +

    Locomotion of a microbot

    + +

    Now you must be wondering, “Hold on, this means the bot will keep moving in one direction only, this is not very useful”. They can do so by using magnetic fields to change their direction of motion.

    + +

    A microbot changing its direction

    + +

    What are the applications?

    + +

    The field of nanodevices are still in its R & D stage and everything is still confined in the laboratory. Nonetheless, these devices hold a lot of promise. Scientists are working on being able to control these nanomotors inside of living material as well, which would enhance the possible applications. As this field continues to grow, we can imagine these nanomachines will be able to help with countless applications – from breaking down kidney stones to fighting cancer, breaking up blood clots, cleaning wounds and removing infections. Recent advancements show a lot of promise in DNA repair and treating diseases which cannot be treated by conventional medical practices. The applications and advantages really are endless!

    + +

    Nanobots in bloodstream

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/nanomotors/index.html b/blog/nanomotors/index.html new file mode 100644 index 0000000..2f79659 --- /dev/null +++ b/blog/nanomotors/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Nanotechnology was regarded to be the technology of the future. Well, the future has come. Its no more the technology of the future. Scientists and engineers have become increasingly good at designing and engineering materials down at the level of atoms and molecules. Nanotechnology is the manipulation of matter at nanoscale which is about 1-100 nanometres. Its well known that everything in this universe is made out of atoms and it’s the atoms and the arrangement of these atoms that dictate the characteristics. Two wheels and a handle, although are said to make a bicycle, it’s called a bicycle only if they are assembled the right way. Otherwise, they are just parts and the functionality of bicycle can never be achieved. Atoms are just like the wheels, except they are smaller, however the idea remains the same. The arrangement of atoms decides how strong or how weak a substance is, or if the substance is transparent etc.

    + +

    Here, I would be talking about the bottom-up approach. In this approach we try and control the atoms and their assembly in order to achieve the desired characteristics. Imagine a scattered pile cups in front of you and you are wearing the boxing gloves. You can move the cups around but you cannot control an individual cup. If you are asked to pick a cup at a time and arrange, it would be extremely hard or even impossible. Nanotechnology allows us to take the boxing gloves off, thus making it easier to pick one cup at a time and arrange in the desired manner. Nanotechnology has opened gates for research in every possible field. One such field is Biology.

    + +

    The human body is made up of millions and millions of cells and each cell is made of several cell organelles. Each of which performs specific task. The energy required to perform these tasks is supplied by mitochondria, the powerhouse of the cell. Apart from the energy, there is cargo that needs to be transported to different parts of the cell. These activities are made possible by the nanomotors or the biological motors in the cell.

    + +

    Bio-molecular motors like kinesins, myosins and ATP synthase have been created by nature and these are essential for the functioning of the cell and also regulate specific functions like inter-cellular cargo transportation and macroscopic muscle contraction. These are self-propelled and composed of proteins and are of the size within the nanoscale. Hence, these are called biological nanomotors. These motors are highly efficient and its evident by their relentless performance throughout the lifecycle of a cell.

    + +

    ATP synthase or ATPase is a rotary motor and is responsible for catalytic synthesis of ATP molecules, accompanying rotary motion. Kinesins are motors that are responsible for transport of inter-cellular cargo and also the mitosis. Kinesins carry the cargo on their heads and walk on microtubules. The walking action is similar to that of the walking action of human beings. Kinesins have two leg like structures, and alternatively place each one at the front. The impressive performance of these motors stimulates the transition towards the artificial system.

    + +

    The combination of bottom-up, self-controllable assembly and the design inspired by the natural biological motors has made it possible for the development of self-propelled synthetic nanomotors. The improvements in nanotechnology permits realization of autonomously synthetic motors with engineering features. These assembled nanomotors are expected to be extremely useful in the future and hold potential promise for targeted drug delivery, biodetoxification, cleaning wounds, blood clots and parasites.

    + +

    The properties of the nanomotors can be conveniently variedby assembling different components such as polymer, nanoparticles, proteins, inorganic or organic functional molecules, vesicles etc. Therefore, controlled self-assembly of the motors enables achievement of functionalities like self-propulsion, regulated motion and controlled transportation by assembling corresponding components.

    + +

    The development of these synthetic, self-propelling nanomotors is one of the most exciting yet challenging fields in nanotechnology. Controlling the motion of the motors is one of the challenges. The solution to this is also inspired by the biological model of chemotaxis and phototaxis. Now, immense control on the motion of these motors is achieved. The capability and the sophistication of the motors is continuously growing but so are the challenges associated with them and their applications in the areas of biomedicines. One of the major problems being biodegradability and biocompatibility as these motors are mainly manufactured from metals. Not just that, these motors must be efficient enough to function in different biological media.

    + +

    In spite of these major challenges, with continuous innovation and development of controlled assembled self-propelling nanomotors will have a profound impact on future biomedical applications.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/nanoparticle-wonder-liquid/index.html b/blog/nanoparticle-wonder-liquid/index.html new file mode 100644 index 0000000..be55081 --- /dev/null +++ b/blog/nanoparticle-wonder-liquid/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Magneto Serum - A potential panacea

    + +

    Though the name sounds very cool and straight out of a science-fiction franchise , what I’m referring to is actually called a ferro-fluid , but make no mistake , this liquid’s abilities are very near sci-fi.

    + +

    A ferro-fluid is basically a colloidal sol , made up of 3 components which are, nano-sized particles of a ferromagnetic substance like haematite or magnetite, a liquid dispersion medium and a surfactant ( citric acid for example) which prevents the nanoparticles from clumping together and depositing .

    + +

    What’s special about this fluid is that it gets strongly magnetized in the presence of a magnetic field , because of the ferromagnetic nanoparticles of course. This liquid can be moved around without using a fluid pump of any sort but by a magnetic field alone.

    + +

    ferro-fluid

    + +

    Ferro-fluid in presence of a magnetic field

    + +

    lines of force

    + +

    The magnetic lines of force around a bar magnet

    + +

    As you can see , the shape sustained by the ferro-fluid is due to the nanoparticles aligning themselves with the magnetic lines of force and due to surface tension of the liquid(dispersion medium).

    + +

    It was first developed by Steve Papell of NASA in 1963 with a goal of transporting liquid fuel in zero gravity and vacuum using magnets , though it wasn’t realized due to some practical limitations, ferro-fluids are very efficient in some applications in the present, like they’re being used as a replacement for dampers in speakers making them energy efficient and able to produce better sound quality. They’re also being used for reducing friction in certain mechanical arrangements, also this liquid maybe used to harvest energy from vibrations more efficiently than the solids currently being used, however the most ambitious and attention grabbing application of this weird looking thing is in medicine.

    + +

    Drug Pilot

    + +

    Ferro fluids can be driven by magnetic fields , it is this property which makes it possible to use it as a carrier of a drug to administer it to a specific target organ and thereby reduces the chances of the drug acting on non target organs which might cause some side effects.

    + +

    Cure for cancer ?

    + +

    This is the coolest and most ambitious idea of all regarding ferro fluids . The current cancer treatment methods have a drawback that there is a chance of the tumor growing back once it’s gone ,because often only the cells on the outer side of the tumor are eliminated and not the ones in its core , whereas in the case of ferro fluids as the particles are tiny enough to pass in and out of the cells’ membranes and as the fluid’s movement can be driven by a magnetic field , the idea as suggested by Thomas Webster , Director of Nanomedicine laboratory Northwestern University , is to get this liquid into the targeted cells at the core of the tumor by appropriately applying a magnetic field and heating it up by doing the same, till a certain temperature at which the cancerous cell dies, also at that temperature a normal cell endures no damage ( which is around 42-430 celcius) .

    + +

    Research is being done on this and it has been only used on mice until now. This might be yet another example of how nanoscience is bringing about a revolution in modern technology.

    + +

    This creepy looking material maybe having marvelous potential , but watching it is surely a feast for the eyes :)

    + +

    magnetoserum

    + +

    Check it out yourself :

    + + + +

    References :

    + +
      +
    1. https://en.wikipedia.org/wiki/Ferrofluid#Mechanical_engineering
    2. +
    3. http://sustainable-nano.com/2016/08/30/magnetic-nanoparticles-cancer-treatment/
    4. +
    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/nanosheets-decorated-with-dna/index.html b/blog/nanosheets-decorated-with-dna/index.html new file mode 100644 index 0000000..3a27acc --- /dev/null +++ b/blog/nanosheets-decorated-with-dna/index.html @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    One possible means of bridging the gap between India’s abundant, varied natural resources and her ever-increasing requirements like clean water, food and rapid, low cost diagnostic machinery is the use of nanotechnology.

    + +

    When we modify materials at their atomic and molecular level, some very unusual and useful properties are generated. Since the dimensions of atoms and molecule are in nanometers, this technology is called nanotechnology.

    + +

    Efforts to promote research in nanotechnology in India began early in the millennium. The efforts have paid off well, India published over 23000 papers in nanoscience in the past 5 years. One of the recent developments in this field by India was the synthesis of nanosheets using DNA leading to the most powerful storage device ever made.

    + +

    Researchers from Indian Institute of Science Education and Research (IISER) Thiruvananthapuram, Kerala and Institute of Microbial Technology, Chandigarh have developed a novel method to synthesize 2 dimensional nanosheets decorated with DNA molecule. The design strategy allows for an ultra-dense array of DNA molecules to be grown on 2 D crystalline nanosheets.

    + +

    DNA

    + +

    Deoxyribonucleic acid (DNA) is made of a long chain of repeating monomer units called nucleotides and is the primary carrier of genetic information in organisms. DNA forms the basis for all of life, driving growth, development and reproduction of all living organisms.

    + +

    In recent years, the emergence of nanotechnology has diversified the uses for DNA, including non-biological applications. The information rich molecule has been used for data storage, computing, crystallography, molecular scale electronics and many more. DNA molecules have the potential to store up to 5.5 quadrillion bytes of data in each cubic millimeter of the DNA molecule, making it the most compact and efficient data storage device ever developed!

    + +

    Designing a nanosheet with the surface decorated with DNA could have potential applications in materials science, drug delivery, and nanoelectronics. However, fabricating such a nanosheet has been a challenge. The results suggest that this design strategy can be applied as a general approach for the synthesis of DNA decorated high aspect ratio sheets, which may find potential applications in materials science, drug delivery, and nanoelectronics.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/neural-landers/index.html b/blog/neural-landers/index.html new file mode 100644 index 0000000..ce6426e --- /dev/null +++ b/blog/neural-landers/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “When I meet God, I am going to ask him two questions: Why relativity? And why turbulence? I really believe he will have an answer for the first.” +-Horace Lamb

    +
    + +

    Landing any aircraft smoothly is difficult. It is an energy-management challenge. The aircraft must make the transition from a vast open sky to a relatively constricted environment. It is subject to strong crosswinds increasing the turbulence. There is complex turbulence created as the airflow from the wing/rotor bounces off and interacts with the ground. We do not have a good enough understanding of turbulence yet, and pilots should have excellent judgment skills to make a smooth landing. Coming to autonomous flight, it is a very challenging task to develop a system to account for the turbulence and make the right adjustments to land smoothly.

    + +

    Understanding Ground Effects

    + +

    The ground effect is a phenomenon that causes reduced induced drag when hovering close to the ground. Below is an image of a section of a wing.

    + +

    img-1

    + +

    A wing generates lift by deflecting incoming airflow downward. According to Bernoulli’s principle, the region above the airfoil has high-speed winds at low pressure compared to the low speed-high pressure winds below the airfoil. This difference in pressure causes lift. The high-pressure air below the wing tries to rush to the low-pressure region above the wing, but the wing comes in between, obstructing it, except at the wingtips, which causes the airflow below the wings to spill around the wingtips above the wings, forming a twisting vortex. This can be visualized in the image below.

    + +

    img-2

    + +

    The formation of the vortices increases the downwash. The lift generated is perpendicular to the direction of relative wind flow. And with increased downwash, the lift vector tilts backward, and its horizontal component is called induced drag, as seen in the image below. This reduces the net lift force and increases the drag on the aircraft.

    + +

    img-3

    + +

    When an aircraft is closer to the ground, the downwash is restricted as the ground is a rigid surface. As a result, even wingtip vortices are restricted. This causes the airflow below the wing to be nearly horizontal, and the lift vector now is not much tilted back. As a result, the induced drag is reduced, which means less power is required to maintain the same airspeed. However, due to an increase in lift, cushioning effect is experienced by the aircraft. The aircraft tends to float and takes longer to land. This effect is noticeable when the aircraft is at a height equal to its wingspan.

    + +

    img-4

    + +

    In fixed-wing aircraft, a solution is to have Winglets, which are vertical extensions of the wingtips to reduce the vortices and the associated induced drag. Below image shows the effects of winglets on vortices.

    + +

    img-5

    + +

    However, if we talk about rotorcraft, using winglets is not a very efficient idea. This is because the propellers are rotating at a very high RPM. The winglet would be acting as a cantilever beam, which would cause instability and material failure due to fatigue. The ground effect in helicopters is shown in the image below and is more complicated for drones.

    + +

    img-6

    + +

    Neural Landers

    + +

    Due to complex interactions of the rotors and the wind flow with the grounds, which can cause flight instability, the automatic landing of a drone is risky. Typically drones wobble and slowly move towards the dock until power is cut off and then drop the remaining distance to the ground, which is about 15-20cm of free fall.

    + +

    img-7

    + +

    Unmanned Aerial Vehicles require high precision control of aircraft positions during takeoff and landing. Artificial Intelligence experts from Caltech’s center for autonomous systems and technologies have used Deep Neural Networks(DNN) to develop a system that aids the UAVs to learn how to land efficiently.

    + +

    The system created is a learning-based controller that tracks the position and speed of the drone and modifies its landing trajectory and rotor speed accordingly to achieve the smoothest possible landing. The existing systems are mathematical models based on steady flow assumption, while it is never the case in practice. Integral and adaptive control methods give delayed feedback.

    + +

    To incorporate a Machine Learning approach to the system’s development, a lot of data is required, for which, they used a giant array of 1296 computer fans to generate different sorts of winds and repeatedly landed the drone to study the controllers’ performance. Neural networks are a series of algorithms that detect underlying relationships between data. DNN is used as a feedforward prediction term in the controller; that is, the disturbances are measured and accounted for before they have time to affect the system. The input for the neural network is knowledge about the drone’s location, velocities, and angular rate, along with the landing location. The output is the additional force required to make the drone land smoothly at the desired location. The result can sometimes be widely varying predictions or condition shifts. To compensate for this, spectral normalization of data is used. The output is used to separately control each of the rotors to adjust the thrust and correct the trajectory to make a smooth landing. Below is an image that was taken during the testing of the neural lander.

    + +

    img-8

    + +

    We know that landing is the trickiest maneuver for any aircraft. Even more so for vertical take-off and landing(VTOL) aircraft as apart from ground effects, the side winds can make it difficult to control its orientation perfectly. The deep neural controller will significantly contribute to solving these challenges. Future uses of these could be to effectively incorporate this controller into the aircraft to make landings smoother and can be used for 3D mapping, search-rescue missions, and delivery services.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/number-theory/index.html b/blog/number-theory/index.html new file mode 100644 index 0000000..fb84d7c --- /dev/null +++ b/blog/number-theory/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The Mathematics of 1,2,3, …

    + +

    Number Theory

    + +

    Number theory is a field of mathematics that deals with the study of numbers and their properties. It is just like how chemists study different elements, their reactivity, their compounds, etc, in number theory mathematicians boil numbers, titrate them, react with numbers and form number complexes (complex numbers).

    + +

    Group

    + +

    A group is a set of elements $G = {…}$ and an operation $#$. For G to be called a Group with respect to $#$, it must satisfy the following four group axioms or conditions:

    +
      +
    • Closure: For any $x$,$y$ $\in G$, $x$ $#$ $y$ $\in G$
    • +
    • Associativity: If $x$, $y$, $z$ $\in G$, then ($x$ $#$ $y$) $#$ $z = x$ $#$ ($y$ $#$ $z$)
    • +
    • Identity: $\exists e \in G$ such that for any $x \in G$, $x$ $#$ $e = e$ $#$ $x$ = $x$
    • +
    • Invertibility: For every $x \in G$, there must exist an element $x^{-1}$ or $y \in G$ such that, $x$ $#$ $y = y$ $#$ $x = e$, where $e$ is the identity element.
    • +
    + +

    Integers form a group with the operation of addition. Let us check to see if they follow the rules of the Group Axioms:

    +
      +
    • Closure: For any two integers a and b, a+b is also an integer.
    • +
    • Associativity: Obviously
    • +
    • Identity: 0 is the identity integer
    • +
    • Invertibility: For every integer a, -a is also an integer and a + (-a) is 0.
    • +
    + +

    ** Note that, group operations need not be commutative. **

    + +

    The order of a group $G$, is the number of elements in the set $G$.

    + +

    There are many interesting Groups in nature. Some of them are called symmetric groups and abelian groups. Let us discuss them one by one.

    + +

    Symmetric Groups

    + +

    In general, symmetric groups are defined on a set $X$ and the group elements consist of bijective functions defined from X to X and the group operation is composition of functions.

    + +

    Let us take two elements in the group. Each element is a bijective function from X to X. Let $f$ and $g$ be two such functions.

    + +

    Now, $f:X\rightarrow X$ and $g:X \rightarrow X$.

    + +

    Consider the composition of f and g, $g o f:X \rightarrow X$ also belongs to the group by definition. +Identity elements always exist in these groups and therefore they form a symmetric group.

    + +

    Here, taking the first N natural numbers, the bijection becomes a mere permutation of re-arrangement.

    + +

    On a set $X_n$, for example consisting of numbers 1 to n. +\begin{equation} +S_n = { 1, 2, 3, … , n-1, n } +\end{equation}

    + +

    the symmetric group on the set $S_n$ consists of all the permutations of the numbers from 1 to n taken all at once.

    + +

    For example, let +\begin{equation} +S_n = {1,2,3} +\end{equation} +Then it’s symmetric group is: +\begin{equation} +G = {(1,2,3),(1,3,2),(2,3,1),(2,1,3),(3,1,2),(3,2,1)} +\end{equation}

    + +

    For $n$ elements there are $n!$ permutations. Hence, the order of the symmetric group of $S_n$ is $n!$. +By this definition, a Rubik’s cube, molecules like ammonia, permuations of numbers and millions of other objects in the real world that contain states can be mathematically modelled into a symmetric group.

    + +

    Abelian Groups

    + +

    An abelian group is a special form of a group, which adds the condition of commutativity to the group. A group $G$ is said to be an abelian group with respect to an operation $#$, if $G$ is a group and:

    + +

    For any $x,y\in G$, $x$ $#$ $y = y$ $#$ $x$

    + +

    The concept of Abelian Groups are important when it comes to rings, fields and finite fields.

    + +

    Ring

    + +

    A ring is an abelian group $R$ but it has two operations, usually denoted as $+$ and $*$. But in order to make things simpler, let us consider them as $#1$ and $#2$.

    + +

    Conditions for a Group $R$ to be a ring:

    +
      +
    1. $R$ is an abelian group (i.e closure, associativity, commutative, identity and invertibility in $#1$)
    2. +
    3. $R$ is monoid in $#2$, i.e +
        +
      • For any $x,y,z\in R$, ($x$ $#2$ $y$) $#2$ $z = x$ $#2$ ($y$ $#2$ $z$) [Associative]
      • +
      • There exists an element $e \in R$, such that for any element $x \in R$, $x$ $#2$ $e = e$ $#2$ $x = x$ [Identity]
      • +
      +
    4. +
    5. The two operations must be distributive over the first operation $#1$. For all $x,y,z \in R$: +
        +
      • $x$ $#2$ ($y$ $#1$ $z$) = ($x$ $#2$ $y$) $#1$ ($x$ $#2$ $z$) [Left distributivity]
      • +
      • ($y$ $#1$ $z$) $#2$ $x$ = ($y$ $#2$ $x$) $#1$ ($z$ $#2$ $x$) [Right distributivity]
      • +
      +
    6. +
    + +

    ** Note: Other sources use, $+$ and $*$ to denote the operations $#1$ and $#2$ respectively.**

    + +

    There is an interesting concept here called the rng (without the $i$), also known as the pseudo ring. +A rng has all the properties of a ring except that it need not have a multiplicative identity. +Consider, the set of even integers, +\begin{equation} +S = {…,-8,-6,-4,-2,0,2,4,6,8,…} +\end{equation} +and the operations addition $+$ and multiplication $*$. They form a $rng$ but not a $ring$ because there is no multiplicative identity $1$ in $S$.

    + +

    The set of Integers $Z$ with $+$ and $*$, however can claim the title of the LORD of the RINGS. Because they form a ring. Get it?Nope? Moving on!

    + +

    Field

    + +

    A set $F$(see how I am conveniently changing the letters of the set as the definition changes, get used to it when reading math books) is said to be a Field with respect to the operations $+$ and $*$ if the following field axioms are satisfied:

    +
      +
    • ($F,+$) must be an abelian group
    • +
    • ($F-\{0\},*$) must be an abelian group [0 is the additive identity]
    • +
    + +

    Characteristic of a Field:

    +

    A positive integer n is said to be a characteristic of a field $F$, if +\begin{equation} +n . 1 = 0 +\end{equation} +i.e. +\begin{equation} +1 + 1 + … + 1 = 0 +\end{equation} +Here, 0 is the identity of the $+$ operation. If there is no positive integer n that satisfies this condition, then the field is said to have a zero characteristic.

    + +

    We need not take only 1 here. In fact, for any element $x \in F$, $n.x = 0$ is true. We also want the least positive positive integer n that satisfies this condition for all the elements in the set $F.

    + +

    Subfield

    + +

    A field $(G,+,*)$ is said to be a subfield of $(F,+,*)$, if $0$ in $F = 0$ in $G$, both the operations are the same and $G\subset F$.

    + +

    Prime Field

    + +

    Given a prime number $p$, we can build a prime number field. +Let the $+$ operation be a $+modulo$ p operation:if the sum exceeds p, we mod it with p. +Let the $*$ operation be a $*modulo$ p operation:if the product exceeds p, we mod it with p. +Add these two operations with a set consisting of integers from $0$ to $p-1$, we get a prime field.

    + +

    This field is commonly referred to as $\mathbb{Z}_p$.

    + +

    For example, +\begin{equation} +\mathbb{Z}_7 = {0,1,2,3,4,5,6} +\end{equation}

    + +

    Finite Field

    + +

    By the blessings from the gods of obviousness, a finite field is a field containing a finite number of elements in its set. One interesting finite field is the finite field of prime order, also called the Galois Field ($GF(p)$ or $\mathbb{Z}/p\mathbb{Z}$ or $\mathbb{F}_{p}$).

    + +

    The elements of a Galois Field are actually generally defined as,

    + +

    \begin{align} + gf(p^n) = && (0,1,2,…, p-1) \cup \
    + && (p,p+1,p+2,…,p+p-1) \cup \
    + && (p^2, p^2+1,p^2+2,…,p^2+p-1) \cup … \cup \
    + && (p^{n-1},p^{n-1}+1, p^{n-1}+2,…,p^{n-1}+p-1) +\end{align} +where $p \in \mathbb{P}$ and $n \in \mathbb{Z}^{+}$

    + +

    Let us try to compute $gf(3^2)$:

    + +

    \begin{equation} +gf(3^2) = {0,1,2,3,4,5} +\end{equation}

    + +

    The operations here are $+modulo3$ and $*modulo3$.

    + +

    One can easily note that, $gf(p^1)$ is nothing but the prime field $\mathbb{Z}_p$. However, $gf(p^n)$ is considered to be an extension to the prime field $\mathbb{Z}_p$. The addition of the new elements to the set do not violate any of the field properties.

    + +

    All of this number physics is beautiful actually. Mathematics is the purest form of art and knowledge to have ever been invented by mankind. It is certainly very true that numbers never lie. In the upcoming blogs, let us explore the application of number theory in cryptography.

    + +

    Feel free to contact me at dth.bht@gmail.com for any queries, complaints or suggestions.

    + +

    Signing off, Yours truly, the Hermitsage

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/once-upon-a-time-in-fiction/index.html b/blog/once-upon-a-time-in-fiction/index.html new file mode 100644 index 0000000..05cbe88 --- /dev/null +++ b/blog/once-upon-a-time-in-fiction/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    We often assume that the technology we rely on came from the minds of genius inventors determined to solve a problem. While most original concepts are inspired by the need to improve the way something was done, some ideas spring from the imaginations of creative people who have little or no expertise in design and are armed only with the ability to imagine worlds beyond the constrictions of the here and now. These persons, in turn, inspire those who possess the necessary proficiency to convert these ideas into reality.

    + +

    Many of the inventions we use every day are inspired by the stories written many years before they were possible. Here are some of such designs that started as works of fiction and eventually made their way into our everyday lives.

    + +

    Voice Control

    + +

    Robot

    + +

    Voice-controlled robots such as R2-D2 from Star Wars (pictured) were a mainstay of science fiction long before Apple unveiled its Siri software. While the technology had been in development as far back as the 1950s, it wasn’t until Stanley Kubrick’s 1968 film 2001: A Space Odyssey showed a talking and responsive computer, HAL, that people began to imagine its true possibilities. Voice control systems first emerged during the 1950s and 1960s, when Bell Laboratories designed its ‘Audrey’ system, which could recognize digits spoken by a single voice. IBM took things a step further with its ‘Shoebox’ machine that could understand 16 English words. By the turn of the century, consumer electronics firms started to integrate such technology into their products.

    + +

    Chess Playing Computers

    + +

    A game as complicated as Chess is renowned for necessitating patience, forethought, and strategic thinking. The idea of creating a machine capable of challenging humans in chess has been around for centuries, including several hoaxes in the 18th and 19th centuries that hid human players inside seemingly intelligent machines.

    + +

    Chess Playing Computers

    + +

    However, it wasn’t until 2001: A Space Odyssey showed the supercomputer HAL playing chess against a human opponent that software companies were inspired to design programs capable of taking on the world’s best chess players. After many failed attempts to match the fictional feat, IBM’s Deep Blue supercomputer defeated World Chess Champion Garry Kasparov in 1997.

    + +

    Mobile Phones

    + +

    Often cited as one of the most forward-thinking television shows in history – and the cause of embarrassment for many grown men, with their in-depth knowledge of alien languages, uniforms, and starship registrations – Star Trek imagined an early form of the mobile phone. The ‘Communicator’ used by Captain Kirk and his crew inspired mobile phone inventor Martin Cooper to design a portable cellular phone in the early 1970s. Cooper’s somewhat clunky design has been refined over the years, and it is now an essential part of almost every human being’s life.

    + +

    Mobile Phones

    + +

    He has said that the inspiration he took from Star Trek was clear: “That was not fantasy to us, that was an objective.”

    + +

    Organ Transplants

    + +

    Some have cited Frankenstein as the first science fiction novel. In Mary Shelley’s 1818 book, scientist Victor Frankenstein uses parts of a dead body to build a man, bringing him to life with a powerful electric current. While such an extreme feat has yet to be achieved, transplanting body parts from one human to another has been possible for some time. Transplants have been attempted for centuries, but the ability to make the host bodies accept the donor’s organs has only come about in the last 100 years.

    + +

    Organ Transplants

    + +

    Dr. Richard H Lawler of Chicago achieved the first successful kidney transplant in 1950, and in 1967 Christian Barnard performed the first heart transplant in South Africa. It is thought Shelley’s story had a huge influence on the idea of organ transplantation, and her idea of using electricity to animate a body can be seen as a foreshadow of the defibrillator. These innovations have proved vital in saving lives all over the world.

    + +

    3D Printers

    + +

    3D Printer

    + +

    Unsurprisingly, science fiction staple Star Trek presaged more than one modern invention. On the Enterprise, “Replicators” could print a copy of just about anything the crew needed in a matter of seconds. Experimenting with liquid photopolymers and ultraviolet light, Chuck Hull figured out in 1983 how to turn printing liquid-solid when the light hit it, creating a solid 3D model of a computer design. Since then, people have been able to 3D print everything from jet engines to human ribs.

    + +

    Atomic Power

    + +

    Nuclear Plant

    + +

    HG Wells first mentioned the idea of atomic power in his novel, The World Set Free, in 1913. This vision of Wells’ inspired Hungarian-German-American physicist Leo Szilard. Twenty years later, he patented the idea of a nuclear reactor along with Enrico Fermi. While this invention led to the atomic bomb, Wells envisioned a greater use for atomic power than a bomb.

    + +

    These were the advanced ideas of the 19th and 20th centuries that have been successfully realized recently. I am personally looking forward to the next 50-100 years where we will bring to reality the fantasies suggested by Marvel, Steven Spielberg, Christopher Nolan, and others. We might have a fully functional Iron Man suit (I say fully because a rudimentary model already exists), a Thor’s Hammer that could decide your ‘worth,’ A Time Machine (finally!). For all we know, the next dream holiday could be a Jurassic Park in place of Disney Land. The only thing we need to bring these ‘futuristic’ schemes to life is a bit of technology, lots of time, and a group of eccentric people who genuinely believe that ‘THINGS ARE ONLY IMPOSSIBLE UNTIL THEY’RE NOT.’

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/opencv/index.html b/blog/opencv/index.html new file mode 100644 index 0000000..afe8780 --- /dev/null +++ b/blog/opencv/index.html @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Why learn Image Processing?

    + +

    This is the question I was primarily asked when I first started exploring just exactly what Image Processing can offer. As time passed, I soon found the now seemingly obvious answer. Although the name, Image Processing, itself suggests manipulating an image for either aesthetic pleasure or requirement, Image Processing actually provides a gateway for the next revolution in engineering. As more and more people become accustomed to having human tasks being done by machines, image processing becomes crucial in training and programming these machines to flourish. Image processing not only provides the framework for Computer Vision but also gives way to Industrial Automation, Artificial Intelligence and much more. OpenCV is used for many Image and Video processing applications such as Facial Recognition, Object Detection, Photo Editing, Robotic Vision, Character Recognition and so much more!

    + +

    Open CV Logo +When I first started Image Processing, I was blown back at the abundance of information available online. One of the first steps I needed to take was to decide between the leading Image Processing tools, OpenCV (Open Source Computer Vision) and Matlab. Where Matlab is easier to setup and faster to debug, OpenCV usually runs faster due to its better optimization, has a much larger comprehensive open source library for computer vision, and many more functions. Not to forget, OpenCV is entirely free, whereas Matlab has a pretty pricing licensing involved.

    + +

    Python Logo +Now without dwelling with the non-technical details, let us dive into the world of OpenCV! You can use OpenCV on Ubuntu, Windows, and macOS so no worries there. Installation can be a bit complicated but thankfully there are great guides out there for different Operating Systems. OpenCV is compatible with Python 2.7, Python 3.5, Java, C, and C++ so use whichever programming language you are most comfortable with. I would suggest learning in Python just because of the extensive support online for Python and OpenCV. For windows I usually prefer to work with Anaconda because of its versatility but it’s up to you. You will also need Numpy for numerical operations and Matplotlib for viewing your images in an easy way.

    + + + + + +

    Now once the installation is out of the way, we can get started on the fun stuff! It’s important to note this article is a quick start guide to OpenCV, not a comprehensive tutorial. To get a further understanding of OpenCV I would suggest following a video tutorial such that on https://pythonprogramming.net/loading-images-python-opencv-tutorial/ or rent some books on OpenCV. The Video Tutorial Link Above is a very easy to understand and fun guide to OpenCV.

    + +

    With OpenCV you can do with both Image and Video Processing. This is because a video is nothing but successive frames put together. The frames are then analyzed individually much like a single image. Most cameras nowadays usually record anywhere between 30 to 60 frames per second.

    + +

    Gray

    + +

    Most image processing operations in OpenCV is done on a simplified form of the actual image. Usually the image is converted to grayscale but we can also filter different colors from the original image or find gradients before sending the image to Processing. After extracting the information of this processed image, the information is then applied back to the original image or sent to your post processing program like a robot’s motor for example.

    + +

    In Image Processing we have many different operations we can do. This includes Color Filtering, Edge Detection, Feature Matching, Object Recognition, and so much more.

    + +

    Documentation

    + +

    There is very good Documentation online for any of your Image Processing Needs:

    + + + +

    Well I hope this article has sparked your interest in Image Processing! Hopefully you don’t run into errors when installing OpenCV or any of the other required libraries. Have a fun time on your Image Processing Adventure and remember

    + +

    “Computers are good at following instructions, but not at reading your mind. ” - Donald Knuth

    + +

    All the Best!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/organic-photovoltaics/index.html b/blog/organic-photovoltaics/index.html new file mode 100644 index 0000000..6e2abf8 --- /dev/null +++ b/blog/organic-photovoltaics/index.html @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Organic Photovoltaics

    + +

    Introduction :

    + +

    Photovoltaics is the process of directly converting sunlight into electricity without any heat engine to interfere. Photovoltaic devices are rugged and simple in design requiring very little maintenance and their biggest advantage being their construction as stand-alone systems to give outputs from microwatts to megawatts. Hence they are used for a vast array of applications resulting in the increase in demand for photovoltaics. Recently, ORGANIC PHOTOVOLTAICS (OPV), has been the subject of active research as this technology has the potential to spawn a new generation of low-cost, solar-powered products with thin and flexible form factors.

    + +

    Solar Technology :

    + +

    Solar technologies are currently dominated by wafer-size single-junction solar cells based on crystalline silicon that are assembled into large area modules. However, other semiconductor materials and devices are under active investigation in order to further reduce the cost of produced electricity by increasing the power conversion efficiency, reducing the amount of absorbing material needed, and lowering the assembly cost of modules. Thin-film photovoltaic technologies, referred to as second-generation photovoltaics, are based on inorganic semiconductor materials that are more absorbing than crystalline silicon and can be processed directly onto large area substrates. Despite the laboratory demonstration of cells with high efficiencies (19+ACU- for CIGS and 16+ACU- for CdTe), the controlled manufacturing of second-generation cells remains a challenge and their commercial use is growing but not as widespread yet.

    + +

    The advent of Organic Photovoltaics (OPV) :

    + +

    Over the past two decades, the science and engineering of organic semiconducting materials have advanced very rapidly, leading to the demonstration and optimization of a range of organics-based solid-state devices, including organic light-emitting diodes (OLEDs), field-effect transistors, photodiodes, and photovoltaic cells. Seeded in the 1960s, fundamental studies on the optical and electronic properties of model organic molecules such as acenes- molecules based on up to five fused benzene rings -this area of research gained significant momentum when high-purity small organic molecules with tailored structure and properties were synthesized and processed at room temperature into thin films using physical vapor deposition techniques.

    + +

    fig1

    + +

    The low-temperature processing of either organic small molecules from the vapor phase or polymers from solution confers organic semiconductors with a critical advantage over their inorganic counterparts, as the high-temperature processing requirements of the latter limit the range of substrates on which they can be deposited.

    + +

    Third Generation Technologies :

    + +

    The organics-based approaches and those that do not rely on conventional single p+AJY-n junctions are often referred to as third-generation technologies. They include: (i) the dye-sensitized solar cells which are electrochemical cells that require an electrolyte+ADs- (ii) multijunction cells fabricated from group IV and III+AJY-V semiconductors+ADs- (iii) hybrid approaches in which inorganic quantum dots are doped into a semiconducting polymer matrix or by combining nanostructured inorganic semiconductors such as TiO2 with organic materials+ADs- (iv) all-organic solid-state approaches.

    + +

    What is different in OPV?

    + +

    A key difference in the physics of organic semiconductors compared to their inorganic counterparts is the nature of the optically excited states. The absorption of a photon in organic materials leads to the formation of an exciton, i.e., a bound electron-hole pair. The exciton binding energy is typically large, on the order of or larger than 500 meV such binding energies represent twenty times or more the thermal energy at room temperature, kT(300 K) +AD0- 26 meV to be compared with a few meV in the case of inorganic semiconductors. Consequently, optical absorption in organic materials does not lead directly to free electron and hole carriers that could readily generate an electrical current. Instead, to generate a current, the excitons must first dissociate. The excitonic character of their optical properties is a signature feature of organic semiconductors, which has impacted the design and geometry of organic photovoltaic devices for the past decades.

    + +

    fig2

    + +

    Organic Photovoltaic Devices :

    + +

    A typical OPV has a layered structure involving: a substrate, a transparent bottom electrode, photoactive layer and top metal electrode. Light is converted to electrical current in the photoactive layer, which has a typical thickness of +AH4- 100 nm. In efficient OPVs, this layer is a composite of two or more semiconductors (electron donors and acceptors) mixed together to form a nanostructured (or bulk) heterojunction for charge generation.

    + +

    fig3

    + +

    Photocurrent generation in OPVs is a multistep process that can be summarised as follows. Initially, photon absorption by a molecule in the active layer promotes an electron to an excited state, resulting in a localized and tightly bound electron-hole pair (a so-called molecular exciton). To contribute to the photocurrent from the solar cell, the exciton must be dissociated, which requires the Coulomb interaction between the hole and electron (+AH4- 0.5 eV) to be overcome. This step can occur at an interface between electron accepting and donating semiconductors, resulting in the transient formation of a charge-transfer state whereby the electron and hole exist on different molecules. The dissociation of the charge-transfer state is then followed by (1) charge transport - where electrons and holes +ACYAIw-39+ADs-hop+ACYAIw-39+ADs- between adjacent electron acceptor and donor molecules respectively +AJY- and (2) charge extraction at the electrodes of the solar cell. For efficient overall performance, all of these steps should be well characterized and carefully optimized.

    + +

    fig4

    + +

    Advantages of Organic photovoltaics :

    + +

    The primary advantage of OPV technology over inorganic counterparts is its ability to be utilized in large areas and semi-transparent, flexible solar modules. Additionally, the manufacturing cost can be reduced for organic solar cells due to their lower cost compared to silicon-based materials and the ease of device manufacturing. The OPVs also offer low thermal budget, solution processing and a very high speed of processing.

    + +

    Conclusion :

    + +

    The future of organic solar cells as a pervasive technology for portable power will largely rely on their economic potential. This depends on a number of intricate factors such as efficiency, manufacturing cost, lifetime, form factor, weight, scalability, and sustainable manufacturing.

    + +

    To summarize, organic photovoltaics provides an exciting playground at the frontiers of science, engineering, and technology. Advances in the near term are likely to lead to solar cells with efficiencies close to 10+ACU- in single heterojunction geometries and efficiencies up to 15+ACU- in tandem-cell geometries. If organic photovoltaics holds its promise, it can soon become a ubiquitous, clean and sustainable technology for portable power and potentially provide large-scale energy production for future generations.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/page10/index.html b/blog/page10/index.html new file mode 100644 index 0000000..e827d8f --- /dev/null +++ b/blog/page10/index.html @@ -0,0 +1,1056 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Communication Protocols Part 1 + +

    +

    + + by Rahul M Hanchate +   + | +   + April 15, 2020 +

    +

    + Introduction Consider a multiplayer game that involves two or more participants. As there are many multiplayer games on an online platform, there’s always a need to be a proper collaboration between the players. A game is only as good as... +

    + + + +
    +
    + + + + +
    +
    + +

    + A Dive into Git Directory + +

    +

    + + by Ameya Deshpande +   + | +   + April 15, 2020 +

    +

    + Git is a distributed version control system. It means Git helps you manage different versions of your work, record the changes and helps different collaborators work parallelly on the same project. Imagine that you are working on a big project... +

    + + +
    + + Git + + Github + + Bash + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Genome Editing + +

    +

    + + by B. Sai Prasad +   + | +   + March 14, 2020 +

    +

    + GENOME EDITING A genome is an organism’s complete set of DNAs, together with all of its genes. Every genome contains all the data required to create and maintain that organism. In humans, a replica of the whole genome (more than... +

    + + + +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + What is machine learning? + +

    +

    + + by Adithya Kannan +   + | +   + March 07, 2020 +

    +

    + What is Machine Learning? Machine learning is a school of computer science that focuses on programming machines to improve their performance through data and iteration. The machine can learn without being explicitly programmed. Yes, you read it right. This is... +

    + + + +
    +
    + + + + +
    +
    + +

    + An Overview of Tarjan's Algorithm + +

    +

    + + by Aditya Sohoni +   + | +   + March 07, 2020 +

    +

    + Background Strong components in directed graphs are components in which all vertices are strongly connected to each other. 2 vertices A and B are strongly connected if there is a directed path from A->B and B->A. Need for Computing Strongly... +

    + + +
    + + IEEE NITK + + CompSoc + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page11/index.html b/blog/page11/index.html new file mode 100644 index 0000000..9f0c800 --- /dev/null +++ b/blog/page11/index.html @@ -0,0 +1,1064 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + SLAM Coverage Algorithms + +

    +

    + + by Jai Mandal +   + | +   + March 07, 2020 +

    +

    + With the increased use of robots in industries, the need for robots to be more efficient is incredibly high. One of the key concerns is the way in which they commute. Gone are the days when robots were restricted to... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + Solving a traffic problem using graph decomposition + +

    +

    + + by Varun Raghavendra +   + | +   + February 21, 2020 +

    +

    + Solving a traffic problem using graph decomposition The Capital city is known for its prosperous life and big opportunities. Its inhabitants are called “capitolates”. Every capitolate in Capital city wants to live a happy and peaceful life. Now Capital city... +

    + + +
    + + Algorithms + + Graph Theory + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Web Vulnerabilities + +

    +

    + + by Vineeth Rajesh +   + | +   + January 15, 2020 +

    +

    + Web Vulnerabilities A vulnerability is a hole or a weakness in the application, which can be a design flaw or an implementation bug, that allows an attacker to cause harm to the stakeholders of an application. Websites across the world... +

    + + +
    + + IEEE NITK + + CompSoc + + web + + vulnerabilities + +
    +
    +
    + + + + +
    +
    + +

    + PSLV to Mars + +

    +

    + + by Ekta Ramnani +   + | +   + January 15, 2020 +

    +

    + PSLV to Mars (Mars Orbiter Mission) Marking the series of events in the world history, November 5,2013 is recognized to be a day of great significance all over the world. On this day, ISRO launched MOM(Mars Orbiter Mission) also called... +

    + + +
    + + IEEE NITK + + Piston + + PSLV + + Mars + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Piezoelectricity and Piezoelectric Sensors + +

    +

    + + by Kaushik Alwala +   + | +   + January 15, 2020 +

    +

    + PIEZOELECTRICITY AND PIEZOELECTRIC SENSORS Piezoelectricity The accumulation of electric charge in solid materials in response to applied mechanical stress is called the piezoelectric effect or piezoelectricity, and those types of solid materials are called piezoelectric materials. Quartz, Berlinite (AlPO4), Sucrose... +

    + + +
    + + IEEE NITK + + Diode + + Piezoelectricity + + Sensors + +
    +
    +
    + + + + +
    +
    + +

    + A Comprehensive Guide to Li-Fi + +

    +

    + + by Krithik Vaidya +   + | +   + January 07, 2020 +

    +

    + Introduction Wouldn’t it be interesting if we could use our everyday LED bulbs as the transmitters of data for wirelessly accessing the internet, instead of Wi-Fi Routers or Cellular Networks? Li-Fi is a technology that does exactly that. Li-Fi was... +

    + + +
    + + Li-Fi + + Wireless Networks + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page12/index.html b/blog/page12/index.html new file mode 100644 index 0000000..b2dde48 --- /dev/null +++ b/blog/page12/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Autopilot + +

    +

    + + by Sharayu Brahmankar +   + | +   + January 07, 2020 +

    +

    + AUTOPILOTS An autopilot is a flight control system that allows a pilot to fly an airplane without continuous hands-on control of the airplane. It allows the pilot to focus on higher-order tasks such as navigating, communicating with air traffic control,... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Stem Cell Technology + +

    +

    + + by Ishita Goyal +   + | +   + December 30, 2019 +

    +

    + STEM CELL TECHNOLOGY What are stem cells? Imagine waking up from a tragic accident that left you paralyzed from the neck down, will there be any hope to recover completely? Won’t it be amazing if there was a research that... +

    + + +
    + + stem cells + + Piston + + IEEE NITK + +
    +
    +
    + + + + +
    +
    + +

    + Bluetooth Low Energy + +

    +

    + + by Suraj Kulkarni +   + | +   + December 30, 2019 +

    +

    + We all know how infuriating it is when our devices drains battery when it uses wireless communication like wifi, bluetooth, infra-red. In every device we use, we are always concerned with the power consumption. A device which consumes less power... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + An Introduction To WebSockets + +

    +

    + + by P Akshara +   + | +   + December 30, 2019 +

    +

    + Introduction Have you ever wondered how the extremely volatile stock/share market prices are constantly updated on online portals? To have a glimpse of how rapid the changes are, head here Cryptowatch portal Similarly how do new messages automatically pop up... +

    + + +
    + + Web + + Web Sockets + + Networks + +
    +
    +
    + + + + +
    +
    + +

    + Why do Generative Adversarial Nets matter? + +

    +

    + + by Videh Raj Nema +   + | +   + November 10, 2019 +

    +

    + A new class of Generative Models was proposed in 2014 by Ian Goodfellow (a.k.a The GANfather) which brought in a novel method of dealing with issues in ML and AI. The Invention of Generative Adversarial Networks (GANs) can be regarded... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page13/index.html b/blog/page13/index.html new file mode 100644 index 0000000..02ae735 --- /dev/null +++ b/blog/page13/index.html @@ -0,0 +1,1024 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Who doesn't want to live on another planet? + +

    +

    + + by Drishika Nadella +   + | +   + November 10, 2019 +

    +

    + The colonization of Mars has been a popular theme of discussion over the past few decades. Whether it's in the spirit of exploration, expansion of human settlement or mining for additional resources, the idea of inhabiting another planet has allured... +

    + + +
    + + Piston + + IEEE NITK + +
    +
    +
    + + + + +
    +
    + +

    + Bionics - The Gap between disability and ability + +

    +

    + + by Nikhil Nair +   + | +   + November 10, 2019 +

    +

    + 1.Bionics and its growing relevance The rise of bionics has prompted some interesting questions- Can we trade away our biological body for a repairable one , one that won’t age?. Bionics is defined as the science of connecting biological systems... +

    + + +
    + + Diode + + IEEE NITK + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Generate Strange Text with GPT-2 + +

    +

    + + by Kinshuk Kashyap +   + | +   + November 02, 2019 +

    +

    + GPT-2 refers to a set of Language Models released recently by OpenAI. My objective is to find weird ways that GPT-2 can fail, and also some smart things it is capable of. I’ll be using talktotransformer for this task. It’s... +

    + + +
    + + NLP + + ML/AI + +
    +
    +
    + + + + +
    +
    + +

    + Future of Drones + +

    +

    + + by Sai Kumar Dande +   + | +   + November 02, 2019 +

    +

    + The word Drone is used pretty often in today’s world. Today the term has broadened to include anything from highly sophisticated $100M Global Hawk to $30 teeny-tiny UDI 839 Quadcopter. Even flightless vehicle such as Drone ship are occasionally referred... +

    + + +
    + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Concorde: Why did it fail? + +

    +

    + + by Kartik Udaya Nayak +   + | +   + November 02, 2019 +

    +

    + Concorde: Why did it fail? We had it. From January 21st, 1976 to October 24, 2003, we had a commercial supersonic passenger service, called the Concorde, that would bring people from London to New York in just 3.5 hours, a... +

    + + +
    + +
    +
    +
    + + + + +
    +
    + +

    + Forward Swept Wings + +

    +

    + + by Vehan Doshi +   + | +   + October 08, 2019 +

    +

    + Introduction Forward Sweeping is the concept of having the wings bent in the forward direction towards the fuselage (as seen in the picture of the X-29). Forward swept wings were first developed in the 1980s as an experiment to overcome... +

    + + +
    + + Piston + + Aeronautics + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page14/index.html b/blog/page14/index.html new file mode 100644 index 0000000..34ec198 --- /dev/null +++ b/blog/page14/index.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Space-based Solar Power + +

    +

    + + by Jyotsna M +   + | +   + October 08, 2019 +

    +

    + Introduction Can you imagine deploying solar panels in space and efficiently converting the solar power that is received right from space and then transmitting the energy back to earth wirelessly, interesting right? Space-based solar power project is a daring effort... +

    + + +
    + + Diode + + Space + + Solar Power + +
    +
    +
    + + + + +
    +
    + +

    + Password Security: Techniques and Challenges + +

    +

    + + by Suhas K S +   + | +   + October 02, 2019 +

    +

    + Introduction Let me preface this article with something: There’s a very good chance that your password is not secure. In fact, if it’s anything less than nine characters long, any attacker could crack it in seconds if he had a... +

    + + +
    + + Systems + + Security + + Cryptography + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Research, an informal testimony + +

    +

    + + by KV Krishna +   + | +   + August 22, 2019 +

    +

    + Research, an informal testimony The feeling of working with the author of textbooks that you first read to learn a subject is something beyond the ability of adjectives to explain. However, it is also the time when you begin to... +

    + + +
    + + Requirements + + Research + +
    +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + Radar Imaging + +

    +

    + + by Rohit Manohar Kulkarni +   + | +   + August 22, 2019 +

    +

    + RADAR IMAGING The World Wars were undoubtedly the worst things to happen to mankind but, they also birthed some ground breaking technology that is till date being used, one such example is the RADAR, acronym for Radio Detection and Ranging.... +

    + + +
    + + RADARSs + + Doppler Processing + + Image + +
    +
    +
    + + + + +
    +
    + +

    + ELF Files in Linux + +

    +

    + + by Arpitha Raghunandan +   + | +   + March 09, 2019 +

    +

    + Have you ever tried to print the a.out file generated when you compile your C program? It prints gibberish! Ever wondered how the computer produces a valid, sensible output from this? Read ahead to find out. Introduction ELF stands for... +

    + + +
    + + ELF + + Linux + + Binary + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page15/index.html b/blog/page15/index.html new file mode 100644 index 0000000..ad755e6 --- /dev/null +++ b/blog/page15/index.html @@ -0,0 +1,1052 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Solving Switch Riddle using RL + +

    +

    + + by Madhuparna Bhowmik +   + | +   + February 28, 2019 +

    +

    + In this article, we will use a Reinforcement Learning based method to solve the Switch Riddle problem. So, let’s start with defining the riddle. Switch Riddle There are n prisoners in prison and a warden. The Warden decides to free... +

    + + + +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + Machine Learning Magic + +

    +

    + + by Kumar Saharsh +   + | +   + January 26, 2019 +

    +

    + “Did you ever wonder how ML algorithms work?” “How is the weather forecast done?” “How does the self-driving car mimic the way humans drive?” “Let’s try to find answers to some of those questions…” WHAT IS THIS MACHINE LEARNING ?... +

    + + + +
    +
    + + + + +
    +
    + +

    + INNOVATIONS IN THE DRONE INDUSTRY + +

    +

    + + by KushagraRawat +   + | +   + January 26, 2019 +

    +

    + “Do you think drones are just four rotor-legged flying machines?” “Have you ever thought how we can modify these machines to get maximum out of it?” Multiple innovations are happening currently in this very industry and here are some of... +

    + + +
    + + Drones + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Social Engineering + +

    +

    + + by Pranav P +   + | +   + January 18, 2019 +

    +

    + Have you ever stared into the keyboard while your friend is typing a password? Or have you ever made up stories to play a prank on your friend? If the answer to any of the above questions is yes then... +

    + + + +
    +
    + + + + +
    +
    + +

    + The Missing Circuit Element + +

    +

    + + by S.R. Sahith +   + | +   + January 15, 2019 +

    +

    + Leon Chau, an American circuit theorist at the University of California, predicted the existence of the fourth fundamental circuit passive element. The first three passive circuit elements are the resistor, capacitor, and inductor. We already have relationships among voltage, current,... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page16/index.html b/blog/page16/index.html new file mode 100644 index 0000000..7111a8e --- /dev/null +++ b/blog/page16/index.html @@ -0,0 +1,1092 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Heard of Smart Contracts yet? + +

    +

    + + by Prajwal S Belagavi +   + | +   + January 15, 2019 +

    +

    + Smart contract, also known as a cryptocontract , is a computer program that directly controls the transfer of digital currencies or assets between parties under certain conditions.It not only defines the rules and penalties related to an agreement in the... +

    + + + +
    +
    + + + + +
    +
    + +

    + Self Healing Materials + +

    +

    + + by Smrithi S +   + | +   + January 15, 2019 +

    +

    + A breakthrough for bio-inspired technology. Many natural organisms have the ability to repair themselves. Now, manufactured machines will be able to mimic this property. Researchers have created a self-healing material that spontaneously repairs itself under extreme mechanical damage. What is... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Photocatalytic Detoxification + +

    +

    + + by Tirth Savla +   + | +   + December 29, 2018 +

    +

    + Photocatalytic Detoxification The water bodies around the world are regularly dumped with waste water effluents. These contain various organic and inorganic molecules that affect the aquatic life and overall water quality, which is called water pollution. The surprising fact is... +

    + + + +
    +
    + + + + +
    +
    + +

    + Intro To The MapReduce Programming Paradigm + +

    +

    + + by Abhinav P Y +   + | +   + December 29, 2018 +

    +

    + The following blog is an attempt to explain the map-reduce programming paradigm and some of its practical appliations. Introduction: Over the past few years, many computer scientists at Google have implemented hundreds of special purpose computations that process large amounts... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Thermal Imaging + +

    +

    + + by Kumar Alabhya +   + | +   + December 29, 2018 +

    +

    + Have you ever tried talking to people about Thermal camera .Well, the general response you receive is , “ohh.. , the night vision camera .” If you also have the same notion , you actually don’t know about this wonderful... +

    + + + +
    +
    + + + + +
    +
    + +

    + NanoMedicine + +

    +

    + + by Manoj A B +   + | +   + December 22, 2018 +

    +

    + How evolutionary is nanomedicine in therapeutics? Is it worth all the hype? Can we, as engineers, find opportunities in the field of nanomedicine? Well, I hope this article will answer many similar questions. Nanotechnology and its manifestation in Medicine Let’s... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page17/index.html b/blog/page17/index.html new file mode 100644 index 0000000..6e46d2e --- /dev/null +++ b/blog/page17/index.html @@ -0,0 +1,1116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + GaN: Gate to New era + +

    +

    + + by Vishal Shukla +   + | +   + December 22, 2018 +

    +

    + GaN: Gate to New era To make life easier, more affordable mankind has always been in search of transforming the current technologies and making it much more better, whether be it wheels to cars, or electric current to cell phones.... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Why you should learn Flutter? + +

    +

    + + by Vaibhav G +   + | +   + December 15, 2018 +

    +

    + What is Flutter? Flutter is an open-source Mobile Application Development SDK launched by Google back in May 2017. It is used to create apps for both Android and iOS Operating Systems. It is also the primary method of developing applications... +

    + + + +
    +
    + + + + +
    +
    + +

    + Nanosheets decorated with DNA + +

    +

    + + by Aditi Marathe +   + | +   + December 15, 2018 +

    +

    + One possible means of bridging the gap between India’s abundant, varied natural resources and her ever-increasing requirements like clean water, food and rapid, low cost diagnostic machinery is the use of nanotechnology. When we modify materials at their atomic and... +

    + + +
    + + Nanosheets + + DNA + + Nanotechnology + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + NanoMachines + +

    +

    + + by Shaswata Bose +   + | +   + December 08, 2018 +

    +

    + This article provides a brief insight in the field of nanomachines and nanosensors, the challenges faced by the researchers in this field, and the promise they hold for us in future applications. What is the difference between micro and nano... +

    + + +
    + + MEMS + + NEMS + + Nanotechnology + + Biomedics + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page18/index.html b/blog/page18/index.html new file mode 100644 index 0000000..a069d14 --- /dev/null +++ b/blog/page18/index.html @@ -0,0 +1,1064 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Cloud Gaming + +

    +

    + + by Aakash Singh +   + | +   + December 08, 2018 +

    +

    + Till today gaming had been possible only on dedicated machines like PCs, gaming consoles like nintendo, playstations and xbox and in the recent times on mobile phones too. But even today the AAA titles or the large budget games like... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Zero Knowledge Proof + +

    +

    + + by Arpitha Raghunandan +   + | +   + December 01, 2018 +

    +

    + Introduction In cryptography, zero knowledge proof or zero knowledge protocol is a method by which one party proves to another party that they know some kind of secret without revealing any information about the secret, except the fact that they... +

    + + +
    + + ZKP + + Cryptography + +
    +
    +
    + + + + +
    +
    + +

    + MicroLED + +

    +

    + + by Suraj Jagannath +   + | +   + December 01, 2018 +

    +

    + The Future of Television? INTRODUCTION Recently at the CES(Consumers Electronics Show) 2018 Samsung unveiled its prototype of the MicroLED at the consumer level with a 146inch MicroLED TV under the name “The Wall”. MicroLED technology was invented in the year... +

    + + +
    + + LED + + Television + + Micro + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Ballistics + +

    +

    + + by Rahul R L +   + | +   + December 01, 2018 +

    +

    + Ballistics is the science of the propulsion, flight, and impact of projectiles especially bullets, unguided bombs or rockets. It is divided into several disciplines. Internal and external ballistics, respectively, deal with the propulsion and the flight of projectiles. The transition... +

    + + +
    + + Ballistics + +
    +
    +
    + + + + +
    +
    + +

    + Organic Photovoltaics + +

    +

    + + by Iteesha Ashwath +   + | +   + November 10, 2018 +

    +

    + Organic Photovoltaics Introduction : Photovoltaics is the process of directly converting sunlight into electricity without any heat engine to interfere. Photovoltaic devices are rugged and simple in design requiring very little maintenance and their biggest advantage being their construction as... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page19/index.html b/blog/page19/index.html new file mode 100644 index 0000000..67298de --- /dev/null +++ b/blog/page19/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + MEMS + +

    +

    + + by Avinash Kumar +   + | +   + November 10, 2018 +

    +

    + MEMS (Micro Electro Mechanical Systems) An introduction to field of micro systems and their applications. “There is plenty of room at the bottom.” Richard Feynman This article deals with the emerging field of micro-electromechanical systems, or MEMS. MEMS is a... +

    + + +
    + + MEMS + +
    +
    +
    + + + + +
    +
    + +

    + Demystifying Deconvolutions + +

    +

    + + by Deepak K +   + | +   + November 10, 2018 +

    +

    + Demystifying Deconvolutions This article mainly discusses about Up-sampling with Deconvolution. If you’ve heard about the term Deconvolution, and are willing to learn more about it, please read on. The contents of the this article is as follows: The need for... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Supercapacitors + +

    +

    + + by Naman Agarwal +   + | +   + November 03, 2018 +

    +

    + Introduction A supercapacitor is a specially designed capacitor which has an enormous capacitance. While capacitors used in everyday life tend to have values in the nano or microfarad range, supercapacitors can have values of upto 12,000 F depending on their... +

    + + + +
    +
    + + + + +
    +
    + +

    + KMP Algorithm + +

    +

    + + by TSS Chandana +   + | +   + November 03, 2018 +

    +

    + I’d like to talk about an algorithm that I believe should be in any Software Engineer’s toolkit. That is, the KMP algorithm named after its three inventors: Knuth-Morris-Pratt. The algorithm was designed to solve efficiently a very common problem. That... +

    + + +
    + + KMP + + Strings + + Competitive Programming + + C++ + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Drive By Wire + +

    +

    + + by Smit Rambhiya +   + | +   + November 03, 2018 +

    +

    + Drive-by-wire Drive by wire is a catch all term that can refer to a number of electronic systems that take either augment or completely replace traditional mechanical controls.Instead of using cables, hydraulic pressure and other ways of providing a driver... +

    + + + +
    +
    + + + + +
    +
    + +

    + Coronary Stents + +

    +

    + + by Aravind G +   + | +   + October 28, 2018 +

    +

    + How coronary stents work? A Brief Breakdown On One Of The Most Frequented Surgeries. Ever wondered how exactly stents are used during or after an angioplasty? Why did this method replace bypass surgeries for minor heart attacks ? Well, read... +

    + + +
    + + heart + + disease + + treatment + + surgeries + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page2/index.html b/blog/page2/index.html new file mode 100644 index 0000000..cad4d6f --- /dev/null +++ b/blog/page2/index.html @@ -0,0 +1,1057 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Different Ways to console.log for Better Clarity + +

    +

    + + by Tilak +   + | +   + August 16, 2021 +

    +

    + Here are 5 ways you can ninjafy your console logging skills 1. console.log( ‘COLORED_TEXT’ ) You will have to use %c with each occurrence accompanied by an argument that expresses the styling that you desire console.log( '%c Object A instantiated... +

    + + +
    + + IEEE NITK + + CompSoc + + Javascript + + Debugging + +
    +
    +
    + + + + +
    +
    + +

    + Amateur Radio + +

    +

    + + by Moha Mankad +   + | +   + August 16, 2021 +

    +

    + We are all fascinated by how our voice travels through the atmosphere by electromagnetic waves and reaches its destination. We humans have built transmitters and receivers suitable to our needs. What is Amateur Radio and who are these Amateurs? Amateur... +

    + + +
    + + IEEE NITK + + Diode + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Where's the Bot Now? + +

    +

    + + by P Ramyashri +   + | +   + August 09, 2021 +

    +

    + Have you ever wondered how life was way before GPS was introduced.I remember taking an OLA ride to a place back in 2013s when google map was not incorporated into the OLA app, and both the driver and I were... +

    + + +
    + + IEEE NITK + + Diode + + Robotics + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Brain-Machine Interfaces + +

    +

    + + by Achintya K N +   + | +   + August 09, 2021 +

    +

    + Brain-Machine Interfaces With Artificial Intelligence and assisted technologies improving as rapidly as they are, many scientists and tech pioneers feel that AI might become ‘better’ than humans sooner than we think (some even say that they can take over the... +

    + + + +
    +
    + + + + +
    +
    + +

    + Learning Fluid Mechanics: From Living Organisms to Machines + +

    +

    + + by Diptesh Banerjee +   + | +   + August 02, 2021 +

    +

    + Birds, bats, insects, fish, whales, and other aquatic and aerial life-forms perform remarkable feats of fluid manipulation, optimizing and controlling their shape and motion to harness unsteady fluid forces for agile propulsion, efficient migration, and other exquisite maneuvers. The range... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + + + + + +
    • 1
    • + + + +
    • 2
    • + + + +
    • 3
    • + + + +
    • 4
    • + + + +
    • 5
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page20/index.html b/blog/page20/index.html new file mode 100644 index 0000000..fd9f4a3 --- /dev/null +++ b/blog/page20/index.html @@ -0,0 +1,1100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Electronic Aspirin + +

    +

    + + by Deeksha M S +   + | +   + October 28, 2018 +

    +

    + ELECTRONIC ASPIRIN For people who suffer from migraines, cluster headaches and other causes of chronic, excruciating head or facial pain, the "take two aspirins and call me in the morning" method is useless. Doctors have long associated the most severe,... +

    + + + +
    +
    + + + + +
    +
    + +

    + Web 3.0: The upcoming Web revolution + +

    +

    + + by Govardhan G D +   + | +   + October 28, 2018 +

    +

    + Web 3.0?? What in the world is that???!!! There is a lot of buzz around web 3.0 and the changes it can bring in the world of tech. But only a few know what it actually is…Before hopping into web... +

    + + +
    + + Web 3.0 + + Ethereum + + Blockchains + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Vortices + +

    +

    + + by Darren Charles Fernandes +   + | +   + October 21, 2018 +

    +

    + Vortices “When everything seems to be going against you, remember that an airplane takes off against the wind, not with it” – Henry Ford This article has been written especially for those who are interested in aerodynamics and also for... +

    + + +
    + + aerodynamics + + vortex + + formula 1 + + aviation + + flight + + airflow + + fluids + +
    +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + Why 'you' need GPU + +

    +

    + + by Rohit M P +   + | +   + October 21, 2018 +

    +

    + Why you need GPU You’ve probably wanted to buy a laptop/desktop with a GPU to play those awesome high graphics games that your friends keep talking about, and yes your parents wouldv’e probably said “You’re not going to get that.... +

    + + +
    + + GPU + + parallel computing + +
    +
    +
    + + + + +
    +
    + +

    + Varistor + +

    +

    + + by Prithvi Patil +   + | +   + October 14, 2018 +

    +

    + Varistor The name itself might have given you some idea about what it is, varistor stands for variable resistor What is a varistor? Varistor is a varying resistor whose resistance depends on applied voltage,one of the special features of varistor... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page21/index.html b/blog/page21/index.html new file mode 100644 index 0000000..e829273 --- /dev/null +++ b/blog/page21/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Automate The Industries + +

    +

    + + by Nisarg B Shah +   + | +   + October 14, 2018 +

    +

    + Automate The Industries Industrial Automation refers to the use of sensors, robots , actuators in various industrial processes so that we get much better efficiency and the working labour required is low. Although the initial cost of setup of an... +

    + + + +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + Phase Change Material + +

    +

    + + by Anurag P K +   + | +   + October 08, 2018 +

    +

    + A Phase Change Material (PCM) is a substance with a high heat of fusion which, on melting and solidifying at a certain temperature, is capable of storing and releasing large amounts of energy. In the most basic terms, a PCM... +

    + + +
    + + Storage Device + + Material + +
    +
    +
    + + + + +
    +
    + +

    + Avionics + +

    +

    + + by Chethan M +   + | +   + October 07, 2018 +

    +

    + The merging of the words aviation and electronics, Avionics are all of the electronic devices and systems which perform individualized functions, used on any aircraft. Whether it is a military standard drone or a small hobby craft, it contains many... +

    + + +
    + + Drone + + Hobbycraft + + Avionics + + Flight Control + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Segment Trees + +

    +

    + + by Shantanu S Rai +   + | +   + October 07, 2018 +

    +

    + Introduction Segment trees are extensivly used in competitive programming for problems that invlove range queries and range updates. For example, given an array A of N elements, answer Q queries (of two types): 1 L R : output the sum... +

    + + + +
    +
    + + + + +
    +
    + +

    + Nanoparticle-Wonder Liquid + +

    +

    + + by Rohit Manohar Kulkarni +   + | +   + September 16, 2018 +

    +

    + Magneto Serum - A potential panacea Though the name sounds very cool and straight out of a science-fiction franchise , what I’m referring to is actually called a ferro-fluid , but make no mistake , this liquid’s abilities are very... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page22/index.html b/blog/page22/index.html new file mode 100644 index 0000000..9dbc6a3 --- /dev/null +++ b/blog/page22/index.html @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Cloud Computing + +

    +

    + + by Saurabh Agarwala +   + | +   + September 16, 2018 +

    +

    + You are probably using cloud computing right now, even if you don’t realise it. If you use an online service to send an email, edit documents, watch movies or TV, listen to music, play games or store pictures and other... +

    + + +
    + + Cloud Computing + + AWS + +
    +
    +
    + + + + +
    +
    + +

    + Biomicry: Creating A Truly Sustainable Environment + +

    +

    + + by KushagraRawat +   + | +   + September 15, 2018 +

    +

    + What is something that is common between the bullet train , self cooling houses , super strong adhesives and turbine blades? Well it turns out they are all inspired by nature is profound ways to optimise favourable characteristics and reduce... +

    + + +
    + + Biomicry + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + BIO(logy and electro)NICS + +

    +

    + + by Anirudh Ashok Aatresh +   + | +   + September 09, 2018 +

    +

    + The living cell can be considered as an extraordinary piece of engineering, where each of the components of the cell work in precise coordination with utmost efficiency. Each cell generates its own energy which it uses to carry out specific... +

    + + +
    + + Biology + + Electronics + + Bionics + +
    +
    +
    + + + + +
    +
    + +

    + THE NEW BIOMETRIC - BRAINPRINT + +

    +

    + + by Preeti J Kalloli +   + | +   + September 09, 2018 +

    +

    + Since the conception of computers, mobile phones, tablets and most importantly, Internet, securing our devices and data has become crucial. Personal data ranging from shopping wishlists to bank details are either stored in PCs or are available online, all protected... +

    + + +
    + + biometrics + + brainprint + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Quantum Supremacy: Is it hyped? + +

    +

    + + by Shashank P +   + | +   + June 23, 2018 +

    +

    + The term “quantum computer” has been buzzing around in recent years. But what is a quantum computer? Have they been built? How are they different from a classical computer? What kind of problems do they solve? Do I need to... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page23/index.html b/blog/page23/index.html new file mode 100644 index 0000000..18f62da --- /dev/null +++ b/blog/page23/index.html @@ -0,0 +1,1072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Evolving Strings with Genetic Algorithms + +

    +

    + + by Gurupungav Narayanan +   + | +   + June 19, 2018 +

    +

    + Introduction A genetic algorithm is a search heuristic inspired by Darwin’s theory of natural evolution. A genetic algorithm reflects the process of natural selection: the fittest survive and breed. The process of natural selection begins by selecting the fittest individuals... +

    + + + +
    +
    + + + + +
    +
    + +

    + Nanomotors + +

    +

    + + by Sanath K. +   + | +   + June 18, 2018 +

    +

    + Nanotechnology was regarded to be the technology of the future. Well, the future has come. Its no more the technology of the future. Scientists and engineers have become increasingly good at designing and engineering materials down at the level of... +

    + + +
    + + Nanotechnology + + Nano motors + + Motors + + ATP + + Biology + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Earthing Systems + +

    +

    + + by Shreeram Hegde +   + | +   + June 17, 2018 +

    +

    + Many appliances such as an electric heater, a refrigerator, a CPU etc. have metallic body (casing).If with use the insulation of a wire breaks or melts , the live wire may touch the casing. If we happen to touch the... +

    + + + +
    +
    + + + + +
    +
    + +

    + Chain of Things + +

    +

    + + by Mehak Arora +   + | +   + June 10, 2018 +

    +

    + “The Internet will disappear. There will be so many IP addresses, so many devices, sensors, things that you are wearing, things that you are interacting with, that you won’t even sense it. It will be part of your presence all... +

    + + +
    + + blockchain + + IoT + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Diving into and Exploiting the Heap + +

    +

    + + by Suraj Singh +   + | +   + June 06, 2018 +

    +

    + At the physical level, computer memory consists of a large number of flip flops. Each flip flop consists of a few transistors, and is capable of storing one bit. Individual flip flops are addressable by a unique identifier, so we... +

    + + +
    + + heap + + exploitation + + memory + + allocation + +
    +
    +
    + + + + +
    +
    + +

    + Computational Approaches of Shock Waves + +

    +

    + + by Shashank Ravichandir +   + | +   + June 06, 2018 +

    +

    + In this article I would like to discuss the two different CFD approaches while solving for flows involving shock waves. In flow fields involving shock waves there is a sharp discontinuous change in the flow variables like pressure, density, temperature,... +

    + + +
    + + Piston + + Shock Waves + + CFD + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page24/index.html b/blog/page24/index.html new file mode 100644 index 0000000..cec3034 --- /dev/null +++ b/blog/page24/index.html @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Charge Crowding + +

    +

    + + by Sampath Koti +   + | +   + June 06, 2018 +

    +

    + Charge crowding Electrostatic Discharge Electrostatic Discharge, or ESD, is a single-event, rapid transfer of electrostatic charge between two objects, usually resulting when two objects at different potentials come into direct contact with each other. ESD can also occur when a... +

    + + + +
    +
    + + + + +
    +
    + +

    + Why 50Hz ? + +

    +

    + + by Megh Bhalerao +   + | +   + May 29, 2018 +

    +

    + Why do most of the countries use a 50/60 Hz, 110/220 V power supply and not any othervalue? The answer to this question is not definite but quite a few technical and historical reasons can be found to support this... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Market Basket Analysis + +

    +

    + + by Anumeha Agrawal +   + | +   + May 29, 2018 +

    +

    + Market Basket Analysis Ever wondered how Flipkart knows what items to suggest to you before and after you make a purchase? The is an aspect of analysis created specifically to promote sales called market basket analysis (MBA). In the retail... +

    + + +
    + + Data mining + + Apriori + +
    +
    +
    + + + + +
    +
    + +

    + Alterego + +

    +

    + + by Sinchana Hegde +   + | +   + May 29, 2018 +

    +

    + AlterEgo We basically can’t live without our cell phones, our digital devices. But at the moment, the use of those devices is very disruptive. Wouldn’t it be rather nice if we could just think of the question and a device... +

    + + +
    + + Alterego + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Envision Project 3: Regenerative Braking + +

    +

    + + by Salman Shah +   + | +   + May 21, 2018 +

    +

    + Idea: Regenerative Braking is an energy recovery mechanism which slows a vehicle or object by converting its kinetic energy into a form which can be either be used immediately or stored until needed. We have implemented this RBS in bicycles... +

    + + +
    + + Braking + +
    +
    +
    + + + + +
    +
    + +

    + Washable Electronics using Water repellant Graphene Circuits + +

    +

    + + by Sonal S. Parab +   + | +   + May 16, 2018 +

    +

    + Washable electronics? Water-repellent graphene circuits make it possible! New graphene printing technology can produce electronic circuits that are low-cost, flexible, highly conductive and water repellent. The nanotechnology “would lend enormous value to self-cleaning wearable/washable electronics that are resistant to stains,... +

    + + +
    + + graphene + + electronics + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page25/index.html b/blog/page25/index.html new file mode 100644 index 0000000..51cffc8 --- /dev/null +++ b/blog/page25/index.html @@ -0,0 +1,1036 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + QEMU/KVM for Virtual Machines + +

    +

    + + by Archit Pandey +   + | +   + May 16, 2018 +

    +

    + A “virtual machine” or “VM” is a virtual computer system. It is a tightly isolated software container with an operating system and application inside. Putting multiple VMs on a single computer enables several operating systems and applications to run on... +

    + + +
    + + virtualization + + qemu + +
    +
    +
    + + + + +
    +
    + +

    + Amazon Go - Cashier Less Shopping + +

    +

    + + by Anirudh Sundar +   + | +   + May 16, 2018 +

    +

    + Amazon Go is Amazon’s cashier-less shopping platform. Contrary to Amazon’s online website, the Go is a brick and mortar store- similar to your regular convenience store. What’s unique about the Go is that you can pick up an item and... +

    + + +
    + + IoT + + Spatial Imaging + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Envision Project 2: Smart Lighting Systems + +

    +

    + + by Anirudh B H +   + | +   + May 13, 2018 +

    +

    + Idea With the ongoing developments in the technological World, a lot of efforts have been invested in the field of automation to make everyone’s life easier. As engineering students and the future of the World, it is our responsibility to... +

    + + +
    + + IoT + +
    +
    +
    + + + + +
    +
    + +

    + Envision Project 1 - Professor Matching for Research Internships + +

    +

    + + by Anirudh B H +   + | +   + May 06, 2018 +

    +

    + Idea Finding research/internship opportunity under a professor’s guidance is exceedingly difficult because the professors are very busy and students are not well aware of the professors who are ready to give internship opportunities. The professor has to shortlist the resumes... +

    + + +
    + + Android + + Web + + Django + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Evolution of bicycle + +

    +

    + + by Aditya Prabhu +   + | +   + February 17, 2018 +

    +

    + Ever since a person began thinking of sources of transportation, maximum development until date has been in the field of bicycle. Here are a few of the designs discussed briefly, innovation in them and the reasons for their failure or... +

    + + +
    + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + Electric Cars - The Future + +

    +

    + + by Sachin Sampath +   + | +   + February 17, 2018 +

    +

    + Should you really buy an electric car? Electric vehicles are hitting the world’s roads and with government support behind them these are hyped up to be the next big thing in the automobile industry . Combustion engine vehicles generate huge... +

    + + +
    + + Electric Cars + + CAS/SPS + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page26/index.html b/blog/page26/index.html new file mode 100644 index 0000000..8bbc855 --- /dev/null +++ b/blog/page26/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + t-SNE + +

    +

    + + by Chenna Keshava B S +   + | +   + February 16, 2018 +

    +

    + It’s manually impossible to understand the structure of a dataset with 100 dimensions. And it’s fairly common to come across data having so many features. And the exploratory-analysis of data is a preliminary step, before proceeding to other aspects of... +

    + + + +
    +
    + + + + +
    +
    + +

    + Bit Manipulation + +

    +

    + + by Ashwin Joisa +   + | +   + January 12, 2018 +

    +

    + All data in computer programs is internally stored as bits, i.e., as numbers 0 and 1. It turns out that there are many uses for bit manipulation in competitive programming. In programming, an n bit integer is internally stored as... +

    + + +
    + + Bit masks + + DP + + Competitive Programming + + C++ + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Fluids and Satellites + +

    +

    + + by KV Krishna +   + | +   + January 12, 2018 +

    +

    + The increasingly large volumes of fluid that have to be carried aboard satellites designed for long operating lifetimes, but which often must also deliver high-accuracy pointing, mean that special attention has to be paid to the behavior of fluids in... +

    + + + +
    +
    + + + + +
    +
    + +

    + How is Technology Helping the Differently Abled People? + +

    +

    + + by Shruti Deshpande +   + | +   + January 12, 2018 +

    +

    + This year, the government of India dedicated the National Science Day to the theme “Science and Technology for specially-abled people”. The main aim was to encourage innovation and also to ease the difficulties of differently abled people. So here are... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + How do websites communicate securely? + +

    +

    + + by Nishanth P Hebbar +   + | +   + December 29, 2017 +

    +

    + The inherent need for human beings has always been to communicate and share information,albeit selectively. For this purpose, the information is to be coded in such a way that it can be deciphered only by the recipient, regardless of whether... +

    + + + +
    +
    + + + + +
    +
    + +

    + War of the Currents + +

    +

    + + by Aditya Rangarajan +   + | +   + December 29, 2017 +

    +

    + Thomas Edison Nikola Tesla At the end of the 19th century, the world witnessed one of the greatest scientific feuds of all times, which changed the course of the history. Three brilliant inventors, Thomas Edison, Nikola Tesla and George Westinghouse,... +

    + + +
    + + Tesla + + Edison + + AC/DC + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page27/index.html b/blog/page27/index.html new file mode 100644 index 0000000..f1212b0 --- /dev/null +++ b/blog/page27/index.html @@ -0,0 +1,1036 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Speed Printing + +

    +

    + + by Harshit Ranjan +   + | +   + December 28, 2017 +

    +

    + Introduction 3D printing technology is often used to construct highly complex objects of different kinds, properties and materials. Despite its numerous advantages, one major drawback of 3D printers is its traditionally slow speed. This is where it fails miserably, in... +

    + + + +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + The E INK + +

    +

    + + by Satyam Shivam +   + | +   + December 21, 2017 +

    +

    + Let’s start with talking about the screen you’re currently glaring at to read this article. If you don’t scroll down then the screen is pretty much static right? Not really. Behind the screen, all the pixels controlling what you see... +

    + + +
    + + E Ink + +
    +
    +
    + + + + +
    +
    + +

    + The Rocker-Bogie Mechanism + +

    +

    + + by Nithin M Eapen +   + | +   + December 21, 2017 +

    +

    + Introduction Everyone might know what a rover is. It is a space exploration device designed to move across the surface of celestial bodies. Have you ever wondered how these rovers are capable of traversing the rough and rocky terrains of... +

    + + +
    + + Space + + Rovers + + Rocker Bogie + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + The Future of Computing: Quantum Computing + +

    +

    + + by Rosa Anil George +   + | +   + December 18, 2017 +

    +

    + Lately, you must been hearing a lot about quantum computing. There are loads of news stories about how it “could change the world” and “open new dimensions”. Universities are hyping up their quantum microchip prototypes, demonstrations of quantum mechanical ideas... +

    + + + +
    +
    + + + + +
    +
    + +

    + Airbag System for two Wheeler vehicles + +

    +

    + + by Kiran Kumar G +   + | +   + December 08, 2017 +

    +

    + Introduction The Airbag system was first introduced in 4-wheelers . This paper gives information about the introduction of the airbag system can be used in the two wheelers(bikes). This paper shows the working, construction, installation of this system and problems... +

    + + +
    + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page28/index.html b/blog/page28/index.html new file mode 100644 index 0000000..2bb8714 --- /dev/null +++ b/blog/page28/index.html @@ -0,0 +1,1048 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + BoT + +

    +

    + + by Ashwin Hebbar +   + | +   + December 08, 2017 +

    +

    + Botnet of things The Internet of Things aka IoT is one of the hot trending topics in the tech world right now. The IoT is basically a network of devices connected to the internet, each having a unique IP address.... +

    + + +
    + +
    +
    +
    + + + + +
    +
    + +

    + A step ahead in Reverse Engineering! + +

    +

    + + by Adwaith V Gautham +   + | +   + December 07, 2017 +

    +

    + Hello to all the computer enthusiasts out there! In this article,we will look into a simple C program intended to perform a particular task is MADE to perform a task it was not supposed to perform. SO,WE WILL BE TRYING... +

    + + +
    + + CTF + + Ethical Hacking + + Security + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Radio Frequency Identification + +

    +

    + + by Mehak Arora +   + | +   + November 20, 2017 +

    +

    + RFID technology has been in circulation for many years now. You may have encountered it first-hand while borrowing library books, or while swiping for attendance in school. Recently, the government issued RFID chips to be installed in cars so that... +

    + + +
    + + RFID + + ADC + +
    +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + Evacuated Tube Collectors + +

    +

    + + by Sanath K. +   + | +   + November 20, 2017 +

    +

    + Introduction Renewable energy is the key for the planet’s existence in the future. The fossil fuels are non-renewable and require finite resources, which are dwindling because of high cost and environmentally damaging retrieval techniques. Climate change is real. Global warming... +

    + + + +
    +
    + + + + +
    +
    + +

    + The Halting Problem + +

    +

    + + by Shashank P +   + | +   + November 13, 2017 +

    +

    + Introduction If you have written computer codes, then you certainly would have fallen into the trap of infinite loops. Then you might have wondered if there is an algorithm to check if any given computer program runs into an infinite... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page29/index.html b/blog/page29/index.html new file mode 100644 index 0000000..3a7641f --- /dev/null +++ b/blog/page29/index.html @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Design of Aircraft Windows + +

    +

    + + by Shashank Ravichandir +   + | +   + November 12, 2017 +

    +

    + Everything in an aircraft you see is for a reason. Nothing is there coincidentally. And one such thing is the shape and design of the windows. With increase in commutation through flights, the aeroplanes started flying at higher altitudes, since... +

    + + +
    + + Aeronautics + +
    +
    +
    + + + + +
    +
    + +

    + How QR code was invented + +

    +

    + + by Shreeram Hegde +   + | +   + November 12, 2017 +

    +

    + How QR code was invented Denso Wave a subsidiary of the Toyota Group are attributed with the creation of the QR Code back in 1994. Originally it was used to track parts in the vehicle manufacturing industry, but its use... +

    + + +
    + + QR code + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Smart Grid + +

    +

    + + by Shama G Vasisht +   + | +   + November 05, 2017 +

    +

    + Introduction How many times have you felt guilty about excessive usage of electricity when you see your monthly bill? Imagine managing the electricity delivered to your house like you manage activities like personal banking from a computer! You will no... +

    + + + +
    +
    + + + + +
    +
    + +

    + Magnetically repelling ice + +

    +

    + + by Sonal S. Parab +   + | +   + November 05, 2017 +

    +

    + People can be nervous fliers to begin with. Even when there isn’t a cloud in the sky, there are few words that cause anxiety in some like, “Prepare for takeoff.” But add wintry conditions to the mix, add some ice,... +

    + + +
    + + Magnetism + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + The Beginning Of The End - Have The Machines Won? + +

    +

    + + by Palak Singhal +   + | +   + November 05, 2017 +

    +

    + Wondering when artificially intelligent robots will take over the Earth? Wonder no more — they’ve already done it! You’re probably thinking But wait. Wouldn’t I have noticed if chrome-plated autonomous killing machines began to exterminate humans? Not necessarily. It turns out... +

    + + + +
    +
    + + + + +
    +
    + +

    + Introduction to Docker + +

    +

    + + by Mahim Agrawal +   + | +   + October 30, 2017 +

    +

    + Docker is probably the most talked-about infrastructure technology of the past few years. And why not? It makes managing and deploying applications so much easier without the overhead of a Virtual Machine. Here’s how: Docker is a tool designed to... +

    + + +
    + + Docker + + Containers + + DevOps + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page3/index.html b/blog/page3/index.html new file mode 100644 index 0000000..578f463 --- /dev/null +++ b/blog/page3/index.html @@ -0,0 +1,1061 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + CPUs Vs GPUs: Allies or Foes? + +

    +

    + + by Rahul Magesh +   + | +   + August 02, 2021 +

    +

    + CPUs Vs GPUs: Allies or Foes? CPUs are the brains of a computer handling connections and all the processes involved in running your computer. While this remains true even today, one doesn’t attain a full picture of the basic processing... +

    + + + +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + Revolutionising the Wheel + +

    +

    + + by Monal Singh +   + | +   + July 30, 2021 +

    +

    + With scientific advancements in space technologies, the need for more robust and efficient components is on the rise. To meet the demands of smoother and more stable rides in exoplanet missions such as Mars exploration, scientists are on the verge... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + Introduction to Kubernetes Architecture + +

    +

    + + by Sravani Katasani +   + | +   + July 30, 2021 +

    +

    + This blog post will give you a basic idea of what Kubernetes is,its applications and infrastructure. Let’s take a look at how application development and deployment has changed over time. Traditional deployment era Early on, organizations ran applications on physical... +

    + + +
    + + IEEE NITK + + CompSoc + + Kubernetes + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + An Introduction to IoT + +

    +

    + + by V Kartikeya +   + | +   + July 30, 2021 +

    +

    + A Look into The Internet of Things Recently, there has been much buzz around the topic Internet of Things. In this post, let us know what IoT is and why there is a certain buzz around it, its applications, advantages,... +

    + + + +
    +
    + + + + +
    +
    + +

    + To Infinity and Beyond + +

    +

    + + by Pranshu Shukla +   + | +   + July 17, 2021 +

    +

    + Ever since the dawn of space exploration in 1957, humankind has seen an unprecedented amount of growth in the domain of space exploration. With the innovation of new and advanced space technologies, both the government and private companies are competing... +

    + + +
    + + IEEE NITK + + Piston + + Space + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + + + + + +
    • 1
    • + + + +
    • 2
    • + + + +
    • 3
    • + + + +
    • 4
    • + + + +
    • 5
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page30/index.html b/blog/page30/index.html new file mode 100644 index 0000000..f242c37 --- /dev/null +++ b/blog/page30/index.html @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + The LIGO Experiment + +

    +

    + + by Megh Bhalerao +   + | +   + October 30, 2017 +

    +

    + The LIGO (Laser Interferometer Gravitational-Wave Observatory) Experiment – A completely different perspective of studying the universe. Einstein’s Prediction Over a century ago, Albert Einstein proposed the idea of something called a Gravitational Wave which was a part of his General... +

    + + +
    + + LIGO + +
    +
    +
    + + + + +
    +
    + +

    + Wireless Power Transmission + +

    +

    + + by Vanshika Gupta +   + | +   + October 30, 2017 +

    +

    + We cannot imagine the world without electric power. Generally power is transmitted through wires, however there is an idea to eradicate the hazardous usage of electrical wires which involves a lot of confusion particularly in organizing them. Some of these... +

    + + +
    + + Power + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Making Iot communications easy using mDNS + +

    +

    + + by Hrishi Hiraskar +   + | +   + October 26, 2017 +

    +

    + A project in Iot often requires multiple devices communicating with each other. This is usually done through sending messages over sockets. To locate a device, usually addresses are used. This is good technique, but due to commom use of DHCP,... +

    + + +
    + + Iot + + Networking + +
    +
    +
    + + + + +
    +
    + +

    + The Honeycomb Conjecture + +

    +

    + + by Rajat Chandavar +   + | +   + October 23, 2017 +

    +

    + Why do bees build hexagonal structured hives? Why not any other shape? Let us deliberate these questions which troubled many thinkers. Consider prisms of different regular polygons and assume them to have same height and volume. This means that the... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Charge your phone whenever you walk into the room + +

    +

    + + by Sowjanya Kandula +   + | +   + October 23, 2017 +

    +

    + Charge your phone whenever you walk into the room One quick and easy way to induce anxiety is to misplace your phone charger. You’re stressed out just thinking about it right now, well what if instead of dealing with your... +

    + + +
    + + transmitter + + reciever + +
    +
    +
    + + + + +
    +
    + +

    + Augmented Reality + +

    +

    + + by Anumeha Agrawal +   + | +   + October 23, 2017 +

    +

    + Whether you have played “Pokémon Go” or not, you’ve probably at least heard of the game. A special app on your smartphone or tablet makes it look like Pokémon is right there in front of you  while you search for... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page31/index.html b/blog/page31/index.html new file mode 100644 index 0000000..83d8d38 --- /dev/null +++ b/blog/page31/index.html @@ -0,0 +1,1052 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + The Brain behind a Formula One Car + +

    +

    + + by Anirudh Sundar +   + | +   + October 16, 2017 +

    +

    + The track belongs to the driver, the pits belong to the engineers Formula One cars are mean machines. They have been fine tuned for one purpose- Speed. In fact, they are the most efficient mode of transport after space shuttles.... +

    + + +
    + + Formula One + + ECU + + TAG-320 + +
    +
    +
    + + + + +
    +
    + +

    + Robots Can Now See In 3D + +

    +

    + + by Sinchana Hegde +   + | +   + October 16, 2017 +

    +

    + Autonomous robots can inspect nuclear power plants, clean up oil spills in the ocean, accompany fighter planes into combat and explore the surface of Mars. Yet for all their talents, robots still can’t make a cup of tea. That’s because... +

    + + +
    + + Robots + + Computer Vision + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Search Engine Optimisation + +

    +

    + + by Praveen Gupta +   + | +   + October 08, 2017 +

    +

    + Guess how many websites come up each day. Any ideas? A survey by Netcraft in 2012 showed that total number of websites launched in 2012 were 51 million i.e. ~140,000 per day. This flood makes it necessary for your website... +

    + + +
    + + SEO + + Google + + Web + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Raspberry Pi Tutorial + +

    +

    + + by Varshini Srinivasan +   + | +   + October 08, 2017 +

    +

    + If you have just started exploring microcontrollers and experimenting with development boards like Arduino and Raspberry Pi, you might have had struggles with configuring the board and interfacing them with the hardware that you used to build your little fascinating... +

    + + +
    + + Raspberry Pi + +
    +
    +
    + + + + +
    +
    + +

    + Aircraft Engines + +

    +

    + + by Mirthun Raj +   + | +   + October 08, 2017 +

    +

    + Many of you might have flown in an aircraft at least once in your lifetime and even if you haven’t, you might have at least seen one in a picture. You might have noticed that there are different types of... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page32/index.html b/blog/page32/index.html new file mode 100644 index 0000000..22d0638 --- /dev/null +++ b/blog/page32/index.html @@ -0,0 +1,1072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Fingerprint Recognition + +

    +

    + + by Manan Sharma +   + | +   + October 03, 2017 +

    +

    + Fingerprint recognition systems are practically everywhere today, from your smartphone, laptops, and are an integral part of the Aadhar system enabling us to authenticate our identity easily. Here’s a look at how the whole system of fingerprint recognition works. Fingerprints... +

    + + + +
    +
    + + + + +
    +
    + +

    + The Intriguing World of Chatbots + +

    +

    + + by Adil Ashique +   + | +   + October 03, 2017 +

    +

    +  “Hey Siri, What’s my schedule for today” “Hey Cortana, when is my appointment with the dentist today” These are a few phrases that we use casually from day to day in order to make our life a tad bit... +

    + + +
    + + Chatbot + + Chat + + Bots + + Language Processing + + IoT + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Biohacking + +

    +

    + + by Anand Pathak +   + | +   + October 03, 2017 +

    +

    + Ever fantasied becoming the Cyborg from DC comics universe? Well, brace yourself, because that dream is soon to come into reality. Introducing Biohacking, a fairly new practice that could bring major changes in human life as we know it. Biohacking... +

    + + + +
    +
    + + + + +
    +
    + +

    + Quantum Computers and The Future of Computation + +

    +

    + + by Sampath Koti +   + | +   + September 24, 2017 +

    +

    + Background: Quantum Mechanics a realm of physics where the tiny subatomic particles reside and whose physics is beyond the perception of the classical physical world. 1] What makes this realm so weird and different in working? The behaviour working of... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Getting Started with GUIs + +

    +

    + + by Archit Pandey +   + | +   + September 24, 2017 +

    +

    + While learning a programming language, there’s often a question of how simple problem solving using code is going to help us create software we see around us. The fact is that software engineering requires a lot more skills as a... +

    + + +
    + + GUI + + GTK+ + + Gnome + +
    +
    +
    + + + + +
    +
    + +

    + The Challenger Disaster + +

    +

    + + by Nikhil Govindarajan +   + | +   + September 24, 2017 +

    +

    + Introduction On January 28th 1986, the scheduled launch for NASA’s space orbiter- the Challenger, took place as planned. But the launch was the only part of the mission that stuck to plan. 73 seconds after liftoff, the shuttle exploded and... +

    + + +
    + + Space + + NASA + + Case Study + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page33/index.html b/blog/page33/index.html new file mode 100644 index 0000000..48c1d11 --- /dev/null +++ b/blog/page33/index.html @@ -0,0 +1,1040 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + BitTorrent Explained + +

    +

    + + by Mahir Jain +   + | +   + September 18, 2017 +

    +

    + “Just torrent it!” “You can torrent any type of file, its all there on the internet…” These are just some of the common sentences one hears when it comes to downloading files from the internet. However, many people do not... +

    + + +
    + + Networking + + Torrents + + P2P + +
    +
    +
    + + + + +
    +
    + +

    + Storing energy in molten salt + +

    +

    + + by Adila M Rajiv +   + | +   + September 18, 2017 +

    +

    + Introduction Renewable energy is the answer to sustainable development. It is the hot topic of our generation and even though it is in its rudimentary stage, it is the best solution in maintaining the balance between environment and our energy... +

    + + +
    + + Energy + + Research + + Innovation + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + What makes a Smart Home Smart + +

    +

    + + by Anirudh B H +   + | +   + September 18, 2017 +

    +

    + Introduction When you leave your home have you been bothered by these little doubts like have I turned the water heater off? Did I set the security at home? Did I switch off the TV? With the introduction of smart... +

    + + +
    + + Smart homes + + IoT + +
    +
    +
    + + + + +
    +
    + +

    + You don't really know Arduino + +

    +

    + + by Vibhore Jain +   + | +   + September 12, 2017 +

    +

    + Is he kiddin? Well I am not (just be patient enough to reach the end). Arduino is a very good platform to start making witty electronics projects instead of dumb L.E.D blinking circuits (apologies to the 555) but after some... +

    + + +
    + + Arduino + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Water Memory, What A Memory + +

    +

    + + by Ayush G S +   + | +   + September 11, 2017 +

    +

    + What would you preferably use to store your precious data - a hard disk, a pen-drive, a DVD; or perhaps WATER! Scientists from Germany now believe that water has a memory, meaning that what once was seen as a simple... +

    + + +
    + + Water Memory + +
    +
    +
    + + + + +
    +
    + +

    + Rock Paper Scissors + +

    +

    + + by Sachin Sampath +   + | +   + September 04, 2017 +

    +

    + If you have ever played the game of rock, paper scissors I bet that the best strategy you had was trying to predict your opponent’s move which is a pretty appealing idea. But given that it is nigh impossible to... +

    + + +
    + + Game Theory + + Strategy + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page34/index.html b/blog/page34/index.html new file mode 100644 index 0000000..4da19c5 --- /dev/null +++ b/blog/page34/index.html @@ -0,0 +1,1040 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Airbus E-Fan + +

    +

    + + by Sachit Krishnan +   + | +   + September 04, 2017 +

    +

    + The Airbus E-Fan Project For over a hundred years - and certainly many to follow, the aircraft industry, for the most part, has relied upon combustion based engines, ranging from the long-forgotten piston-prop through the state of the art Turbofan.... +

    + + +
    + + Aviation + + Environment + +
    +
    +
    + + + + +
    +
    + +

    + Safety Issues in AI Systems + +

    +

    + + by Chenna Keshava B S +   + | +   + September 04, 2017 +

    +

    + I am pretty sure the title will flood the reader’s mind with images of Skynet and Matrix, but this post focuses on the shortcomings of AI technologies that are currently in vogue. It’s much more productive to contemplate on the... +

    + + +
    + + ML + + AI + + Security AI + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Technology in Sports + +

    +

    + + by Abhishek Thigale +   + | +   + August 22, 2017 +

    +

    + The world of sport is continually changing over the years, and the use of technology is just one of those areas that has made an impact on many sports. It has changed the way players approach a particular sport. Various technologies... +

    + + +
    + + Sports + +
    +
    +
    + + + + +
    +
    + +

    + Hashing in Competitive Programming + +

    +

    + + by Somanth Sarkar +   + | +   + August 22, 2017 +

    +

    + Introduction At it’s most basic hashing is a technique to identify a particular value of a certain type among other values of the same type. To achieve this we typically make use of a hash function: a function that takes... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + When Strokes are Six + +

    +

    + + by Vinayak V Gopal +   + | +   + August 13, 2017 +

    +

    + Man and his Car The stories are different, yet the same . From the spark that taught him about fire and the wheels that took him to places, to the roads that he hit everyday, he has come a long... +

    + + + +
    +
    + + + + +
    +
    + +

    + A QuickStart Guide to Image Processing with OpenCV + +

    +

    + + by Santosh Kodali +   + | +   + August 13, 2017 +

    +

    + Why learn Image Processing? This is the question I was primarily asked when I first started exploring just exactly what Image Processing can offer. As time passed, I soon found the now seemingly obvious answer. Although the name, Image Processing,... +

    + + +
    + + OpenCV + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page35/index.html b/blog/page35/index.html new file mode 100644 index 0000000..b02db2f --- /dev/null +++ b/blog/page35/index.html @@ -0,0 +1,1060 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Is Random really Random? + +

    +

    + + by N Subbalakshmi +   + | +   + August 04, 2017 +

    +

    + Random numbers have been used for many thousands of years. Roll a dice. Flip a coin. Pick a card from a deck. Whatever the result may be in these three situations, it’s completely random each time and there’s no way... +

    + + +
    + + random + + PRNG + + TRNGs + + cryptography + + Lehmer's RNG + +
    +
    +
    + + + + +
    +
    + +

    + Smart Phones and Health issues + +

    +

    + + by Akshay Krishna +   + | +   + August 04, 2017 +

    +

    + The way smartphones have changed our lives is amazing. Technology has been ever bringing multiple facets of our daily lives within the scope of smartphones, which in turn gets smaller and slimmer. No more does our parents bother us to... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Of a tooth and a pie + +

    +

    + + by Shwetha S V +   + | +   + August 04, 2017 +

    +

    + At first, I thought I would write about the wonder creation of yesteryear-Bluetooth. Give you a little insight into how it works, the various layers of Bluetooth, it’s profiles and so on. But I guess Wikipedia would do a much... +

    + + + +
    +
    + + + + +
    + +
    + +
    + + + + +
    + +
    +
    + +

    + 3D Printing + +

    +

    + + by Nandini +   + | +   + July 28, 2017 +

    +

    + 3-D Printing-A world beyond 2D The emerging world of 3D printing 3D Printing is something all of us have come across in today’s world. It may seem like a new technology but history points out that it is no recent... +

    + + + +
    +
    + + + + +
    +
    + +

    + An Introduction to Reinforcement Learning + +

    +

    + + by Aneesh Aithal +   + | +   + July 28, 2017 +

    +

    + An Introduction to Reinforcement Learning Imagine you are trying to train a dog to do fetch a ball. What you’d normally do is that you would reward it a snack every time it fetched the ball. The dog would then... +

    + + +
    + + Machine Learning + + AI + + Bots + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page36/index.html b/blog/page36/index.html new file mode 100644 index 0000000..e4f41c1 --- /dev/null +++ b/blog/page36/index.html @@ -0,0 +1,1068 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Number Theory + +

    +

    + + by Adithya Bhat +   + | +   + July 23, 2017 +

    +

    + The Mathematics of 1,2,3, … Number Theory Number theory is a field of mathematics that deals with the study of numbers and their properties. It is just like how chemists study different elements, their reactivity, their compounds, etc, in number... +

    + + +
    + + Number Theory + + Group + + Ring + + Rng + + Field + + Finite Field + + Galois Field + +
    +
    +
    + + + + +
    +
    + +

    + Log file parsing and formats of report generation + +

    +

    + + by Karthik +   + | +   + July 23, 2017 +

    +

    + Hello everyone, today I will be talking about the core part of my work during my summer internship at Samsung Semiconductor India R&D Center, Bengaluru. Our project team consisted of four members and we were given the task to parse... +

    + + +
    + + File Parsing + + Logging + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Multitenancy + +

    +

    + + by Sandeep Menon +   + | +   + July 15, 2017 +

    +

    + What is Multitenancy? According to Wikipedia, the term “software multitenancy” refers to a software architecture in which a single instance of software runs on a server and serves multiple tenants. With a multitenant architecture, a software application is designed to provide every tenant a dedicated share of the... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Continuously Variable Transmission + +

    +

    + + by Prajwal Bharadwaj +   + | +   + July 15, 2017 +

    +

    + Introduction A Continuously variable transmission is a type of power transmission which be called as an efficient replacement for a conventional automobile gearbox with a gearshift. A CVT is a system of belt and pulleys which is used to achieve... +

    + + + +
    +
    + + + + +
    +
    + +

    + All about FinFETS + +

    +

    + + by Megha Mantur +   + | +   + July 08, 2017 +

    +

    + Introduction Hello folks, today I’m going to discuss in detail about FinFET technology. The demand for smartphones and tablets with better performance and longer battery life has been driving the industry to come up with chips that are faster, smaller... +

    + + +
    + + FinFETS + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page37/index.html b/blog/page37/index.html new file mode 100644 index 0000000..1a8eaaa --- /dev/null +++ b/blog/page37/index.html @@ -0,0 +1,1028 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Fascinating World Of Compliant Mechanisms + +

    +

    + + by Shuvam Senapati +   + | +   + July 08, 2017 +

    +

    + What is a Mechanism? A mechanism is a mechanical device used to transfer or transform motion, force, or energy. Traditional rigid-body mechanisms consist of rigid links connected at movable joints. Whatever machines you see in your day to day life... +

    + + + +
    +
    + + + + +
    +
    + +

    + Introduction to big data and hadoop + +

    +

    + + by A Aditya +   + | +   + July 08, 2017 +

    +

    + What is ‘Big data’? In simple terms, Big data is data which can’t comfortably be processed on a single machine. We live in a world increasingly driven by data. Try googling about big data and you will find some staggering... +

    + + +
    + + Big Data + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Dealing with Underdetermined Systems + +

    +

    + + by Abhijith Kamath +   + | +   + July 02, 2017 +

    +

    + What is meant by “under-constrained” system? I will start off this segment with my favourite quote. “To the ones who tread the path less taken; To the ones who believe the answer to everything lies in data.” The answer to... +

    + + + +
    +
    + + + + +
    +
    + +

    + Hyperloop + +

    +

    + + by Pranay Praveen +   + | +   + June 25, 2017 +

    +

    + Hyperloop   One of the most valued and important entity nowadays is time. To help the people around the world to save their   travelling time, Elon Musk came up with an innovative idea of hyperloop. Hyperloop is a proposed mode... +

    + + +
    + + hyperloop + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Graphene - A Wonder Material + +

    +

    + + by Samarth Bonthala +   + | +   + June 24, 2017 +

    +

    + GRAPHENE – A WONDER MATERIAL “I have never even heard of this term graphene before”, might be your thought process presently. Read further to understand why I call it a wonder material. What’s running in your mind at this point... +

    + + +
    + + Graphene + +
    +
    +
    + + + + +
    +
    + +

    + Promises, Closures and Potatoes + +

    +

    + + by Vighnesh Velayudhan +   + | +   + June 23, 2017 +

    +

    + Promises, Closures and Potatoes. Well this article is mainly about Promises and Closures, two concepts that most of us don’t really care about in the beginning, but in reality, we have been using it a lot. “Promises and Closures” wouldn’t... +

    + + +
    + + JavaScript + + Programming + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page38/index.html b/blog/page38/index.html new file mode 100644 index 0000000..6e0616a --- /dev/null +++ b/blog/page38/index.html @@ -0,0 +1,1045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Fluid mechanics in everyday life + +

    +

    + + by Shreyas Hegde +   + | +   + June 18, 2017 +

    +

    + Applying Makeup! When you put on eye shadow or powder, you are most definitely applying shear and pressure forces. When you put foundation on a sponge and smear it over your face you can feel the shear stress acting on... +

    + + +
    + + Fluid Mechanics + +
    +
    +
    + + + + +
    +
    + +

    + The Fourth Industrial Revolution + +

    +

    + + by Vasista Ayyagari +   + | +   + June 16, 2017 +

    +

    + Automation, Internet of Things, Genetic engineering, cloud computing, renewable energy, sustainable development. Welcome to the Future. Welcome to the 4th Industrial revolution. Professor Klaus Schwab, Founder and Executive Chairman of the World Economic Forum published the ‘The Fourth Industrial Revolution’.... +

    + + +
    + + IoT + + Automation + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Introduction to Reverse Engineering + +

    +

    + + by Jeshventh Raja +   + | +   + June 14, 2017 +

    +

    + I am sure you would have fixed a bug if you have done programming. Going through your code, identifying places where it could have gone wrong, trying out different inputs to make it easier, each one with your own different... +

    + + +
    + + CTF + + Ethical Hacking + + Security + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Implementing Google Image Search Style Grid + +

    +

    + + by Hrishi Hiraskar +   + | +   + June 10, 2017 +

    +

    + Implementing Google Image Search Style Grid I love design principles of Google. The way they present things is really awesome. One such presentation is Google Image Search. Look at the way they arrange images. Each row has a fixed width,... +

    + + +
    + + Web Design + + Grid + +
    +
    +
    + + + + +
    +
    + +

    + Lighting Up your Room! + +

    +

    + + by Abhijith Kamath +   + | +   + June 10, 2017 +

    +

    + Apparatus: 1.LED strips You should find these in most home decor stores. They could turn out to be expensive depending upon the quality of light you expect. There are RGB strips available too! 2.TIP 31 switch Now this is a... +

    + + +
    + + CAS + + SPS + + EEE + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 36
    • + + + +
    • 37
    • + + + +
    • 38
    • + + + +
    • 39
    • + + + +
    • 40
    • + + + + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page39/index.html b/blog/page39/index.html new file mode 100644 index 0000000..cffc060 --- /dev/null +++ b/blog/page39/index.html @@ -0,0 +1,1049 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + The Class of NP + +

    +

    + + by Isha Tarte +   + | +   + June 09, 2017 +

    +

    + Many of us have this notion that NP stands for “Non Polynomial”, the problems which can’t be solved in polynomial time. This is not true. First of all, NP consist of only decision problem (given any problem, the answer should... +

    + + +
    + + Algorithms + + P v/s NP + +
    +
    +
    + + + + +
    +
    + +

    + Why Not Chemical Engineering + +

    +

    + + by Anupama G +   + | +   + June 07, 2017 +

    +

    + I don’t know what kind of fascination it is, probably parents sermon their little ones or the Indian school teachers are rather pedagogues, but this one notion of securing admission for undergraduation in a leading institute with specialisation in computer... +

    + + +
    + + Chemical + + Career Advice + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Introduction to GPU Computing + +

    +

    + + by Vilas M +   + | +   + June 04, 2017 +

    +

    + A Gamer’s priced possession - Graphic Cards! Let’s say that you have bought a brand new computer with one of the latest i7 processors but without installing a separate graphics card. And your friend is still using his 5 year... +

    + + + +
    +
    + + + + +
    +
    + +

    + How to Get Started with Bots + +

    +

    + + by Tarun Mittal +   + | +   + June 01, 2017 +

    +

    + How to get Started with bots Have you ever been fascinated by robots - Awestrucking objects which are capable of performing some cool tasks without needing a human intervention (well, unless they decide to go mad! :P) ? And certainly... +

    + + +
    + + Bots + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Hello World + +

    +

    + + by Adithya Bhat +   + | +   + May 26, 2017 +

    +

    + A dissection of the hello world C program DISCLAMER: The contents on this page are strictly R rated. With R standing for Rigorous material. This is not a beginner’s guide to C. This is more of an article for intermediate/advanced... +

    + + +
    + + GCC + + C + + Programming + + HelloWorld + +
    +
    +
    + + + + +
    +
    + +

    + Getting to love the Terminal + +

    +

    + + by Kaushik S Kalmady +   + | +   + May 24, 2017 +

    +

    + I Just Got Ubuntu! But I’m not so sure about this command line Early days with the Unix command line interface, or the terminal (bash shell by default) can be pretty annoying and intimidating. But it doesn’t have to be.... +

    + + +
    + + Unix + + Terminal + + Bash + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 35
    • + + + +
    • 36
    • + + + +
    • 37
    • + + + +
    • 38
    • + + + +
    • 39
    • + + + +
    • 40
    • + + + + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page4/index.html b/blog/page4/index.html new file mode 100644 index 0000000..bc8f77c --- /dev/null +++ b/blog/page4/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + A beginner's guide to Cloud Computing + +

    +

    + + by Srujan Bharadwaj +   + | +   + July 17, 2021 +

    +

    + What is Cloud? Simply put, cloud computing provides storage, computing resources, networking and other services without direct management by the user. The existence of such user-accessible cloud resources is possible because of the presence of data centers. A data center... +

    + + +
    + + IEEE NITK + + CompSoc + + Cloud + +
    +
    +
    + + + + +
    +
    + +

    + CubeSats + +

    +

    + + by Nakshatra Gopi +   + | +   + July 17, 2021 +

    +

    + Let’s start off with what “CubeSats” are, and how they are different from other small satellites. Any satellite that weighs less than 300 kg is called a small satellite, but a CubeSat must adhere to more specific size, shape, and... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Paradox Free Time Travel + +

    +

    + + by Viren Varma +   + | +   + July 11, 2021 +

    +

    + “People like us, who believe in physics, know that the distinction between past, present, and future is only a stubbornly persistent illusion.” – Albert Einstein. It’s a worry of physics enthusiasts who believe in the notion of “Time Travel” everywhere.... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + Bionics, Biomimetics and Robotics + +

    +

    + + by Shobuj Paul +   + | +   + July 11, 2021 +

    +

    + Let us get the boring part out of the way and define those three terms in the title. Biomimetics is when we look at how biological systems work and try to replicate the same movements and systems with electromechanical components.... +

    + + +
    + + IEEE NITK + + Diode + + Robotics + + Automation + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Alpha Beta Pruning + +

    +

    + + by Pranav DV +   + | +   + July 11, 2021 +

    +

    + Among the many advancements computer science has made in the past couple of decades, Artificial Intelligence (AI) is the most widely known. You might have simply heard about J.A.R.V.I.S from the Avengers or smart assistants like Siri or Alexa. All... +

    + + + +
    +
    + + + + +
    +
    + +

    + Holographic Memory + +

    +

    + + by Soma Anil Kumar +   + | +   + July 05, 2021 +

    +

    + Holographic Memory The word holography might fill your mind with 3-D images, but what the term essentially means is to record a unique photographic image of something that can be stored and later retrieved. The definition of holography hints at... +

    + + +
    + + IEEE NITK + + Diode + + Data Storage + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 2
    • + + + +
    • 3
    • + + + +
    • 4
    • + + + +
    • 5
    • + + + +
    • 6
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page40/index.html b/blog/page40/index.html new file mode 100644 index 0000000..72b7cb4 --- /dev/null +++ b/blog/page40/index.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Installing Ubuntu For Windows Users + +

    +

    + + by Hrishi Hiraskar +   + | +   + May 24, 2017 +

    +

    + Installing Ubuntu For Windows Users Hie Installing Ubuntu on your machine is really helpfull in college days. It comes free and there are lots of open source softwares available for it. Last year, a lot of people came to my... +

    + + +
    + + Linux + + Ubuntu + +
    +
    +
    + + + + +
    +
    + +

    + Introduction to IEEE-NITK Chapter + +

    +

    + + by Salman Shah +   + | +   + May 15, 2017 +

    +

    + IEEE is the world’s largest professional association advancing innovation and technological excellence for the benefit of humanity. IEEE and its members inspire a global community to innovate for a better tomorrow through its highly-cited publications, conferences, technology standards, and professional... +

    + + +
    + + Introduction + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 35
    • + + + +
    • 36
    • + + + +
    • 37
    • + + + +
    • 38
    • + + + +
    • 39
    • + + + +
    • 40
    • + + + + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page5/index.html b/blog/page5/index.html new file mode 100644 index 0000000..d75acc1 --- /dev/null +++ b/blog/page5/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Concrete: The Way You've Not Seen It + +

    +

    + + by Harshavardhan S +   + | +   + July 05, 2021 +

    +

    + Introduction Concrete, as we know it today, is a mixture of cement, water, and some aggregates along with it. After Portland Cement was patented in 1824, concrete came out to the world as one of the most useful materials ever... +

    + + +
    + + IEEE NITK + + Concrete + +
    +
    +
    + + + + +
    +
    + +

    + Introduction to Audio Processing in NLP + +

    +

    + + by Pratham Nayak +   + | +   + July 05, 2021 +

    +

    + Introduction Any machine learning task involves three steps - data collection, training and evaluation. However, for training a machine learning model, we cannot use raw data. We need to pre-process the data to some suitable form and extract features which... +

    + + +
    + + IEEE NITK + + CompSoc + + Audio Processing + + NLP + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Trying-to-understand-Trie + +

    +

    + + by Adithya Rajesh +   + | +   + June 18, 2021 +

    +

    + Introduction A trie is a rooted tree that maintains a set of strings. Each string in the set is stored as a chain of characters that starts at the root. If two strings have a common prefix, they also have... +

    + + + +
    +
    + + + + +
    +
    + +

    + LSTM Models + +

    +

    + + by Chandan Kumar +   + | +   + June 18, 2021 +

    +

    + What’s the first thing that comes to your mind when you think of speech recognition? Alexa, Google assistant, Cortana, right? It’s quite reasonable; we are fascinated by machines that can understand us. But have you ever wondered how these things... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + The Impact of F1 on the World + +

    +

    + + by Kaustubh +   + | +   + June 18, 2021 +

    +

    + In general, F1 and motorsport have a long history of inventing and implementing technologies that eventually trickles down into road cars. Active suspension, traction control, carbon fibre construction, advanced aerodynamics and semi-automatic paddle gearboxes all began in the technology race... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + State Management in Flutter + +

    +

    + + by Ikjot Singh Dhody +   + | +   + June 04, 2021 +

    +

    + Let’s start by getting one thing clear. What do you mean by “state”? Essentially, the state of the app, or a particular widget in the app, is just information, that is used to render the UI. This means that any... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 3
    • + + + +
    • 4
    • + + + +
    • 5
    • + + + +
    • 6
    • + + + +
    • 7
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page6/index.html b/blog/page6/index.html new file mode 100644 index 0000000..3204d1a --- /dev/null +++ b/blog/page6/index.html @@ -0,0 +1,1072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + Image Steganography + +

    +

    + + by Garvin Pokhra +   + | +   + June 04, 2021 +

    +

    + Data or information is a very crucial resource to us, therefore it’s our responsibility to protect its confidentiality and integrity. While sending a message or information, unintended users might try to tamper with the message or might use its content... +

    + + + +
    +
    + + + + +
    +
    + +

    + The First 20 Hours + +

    +

    + + by Yuvasankar B +   + | +   + June 04, 2021 +

    +

    + The amount of time to acquire and master a skill is approximated to be 10,000 hours. But these approximations were taken by studying top athletes, artists, musicians, etc. at the top of the game. They were one of the best... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + The Revolution called DDR + +

    +

    + + by Kruti Deepan Panda +   + | +   + May 28, 2021 +

    +

    + DDR DDR SDRAM DDR memory stands for Double Data Rate memory, this is actually called DDR SDRAM but since it has become so widespread we just say DDR. To understand how this works and why is this so important lets... +

    + + +
    + + IEEE NITK + + Diode + + DDR + + RAM + + Digital Systems + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Neural Landers + +

    +

    + + by Viba R Udupa +   + | +   + May 28, 2021 +

    +

    + “When I meet God, I am going to ask him two questions: Why relativity? And why turbulence? I really believe he will have an answer for the first.” -Horace Lamb Landing any aircraft smoothly is difficult. It is an energy-management... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + Once upon a time in Fiction + +

    +

    + + by Varshini C +   + | +   + May 21, 2021 +

    +

    + We often assume that the technology we rely on came from the minds of genius inventors determined to solve a problem. While most original concepts are inspired by the need to improve the way something was done, some ideas spring... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 4
    • + + + +
    • 5
    • + + + +
    • 6
    • + + + +
    • 7
    • + + + +
    • 8
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page7/index.html b/blog/page7/index.html new file mode 100644 index 0000000..bd126ef --- /dev/null +++ b/blog/page7/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + CAN Bus Protocol + +

    +

    + + by Sahaj Saxena +   + | +   + May 21, 2021 +

    +

    + The CAN Bus protocol stands for Controller Area Network Protocol, which is a two wired, bidirectional serial bus communication method. It was designed to perform in harsh environments such as in the automotive industry, but now it has emerged as... +

    + + + +
    +
    + + + + +
    +
    + +

    + Neural Style Transfer + +

    +

    + + by K Dharmick Sai +   + | +   + May 21, 2021 +

    +

    + Neural Style Transfer Neural Style Transfer is the problem of applying the style of an image/painting onto a content image. For Humans the process of painting is seamless. In this blog we will step by step include components into style... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + What is the future of power generation? + +

    +

    + + by Pramod Sunil Parande +   + | +   + May 14, 2021 +

    +

    + The following statements are something we all have been reading and learning as the truth: Fossil fuels, such as coal and oil, are dangerous pollutants, and anyway we are running out of them. Nuclear power is so dangerous that it... +

    + + +
    + + IEEE NITK + + Piston + + Power Generation + + Civil + +
    +
    +
    + + + + +
    +
    + +

    + ConvNets: What, Why and How? + +

    +

    + + by M Shreyas Rao +   + | +   + May 14, 2021 +

    +

    + A Convolutional Neural Network is a Deep Learning algorithm which can take an input image, assign learnable weights to various aspects/objects in the image and be able to differentiate one from the other. It is based on the convolution mathematical... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + A Beginner's Guide to Microservices + +

    +

    + + by Gaurang Velingkar +   + | +   + May 14, 2021 +

    +

    + We live in a world that’s constantly growing. There are new applications and services that come up everyday. Existing ones evolve to constantly meet the demands of today’s world and to keep up with the latest trends in technology. This... +

    + + +
    + + Microservices + + Cloud + + Systems + +
    +
    +
    + + + + +
    +
    + +

    + My Two Snowflakes + +

    +

    + + by Erin Sam Joe +   + | +   + May 07, 2021 +

    +

    + There are plenty of resources that say that no two snowflakes are alike. But where do we get this idea from? The universe is really old, with countless planets, surely two of them have been alike… Wilson Bentley, an American... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    +
      + + +
    • <<
    • + + + + + + + + + +
    • First
    • +
    • ..
    • + + + + + +
    • 5
    • + + + +
    • 6
    • + + + +
    • 7
    • + + + +
    • 8
    • + + + +
    • 9
    • + + + + +
    • ..
    • +
    • Last
    • + + + +
    • >>
    • + +
    +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page8/index.html b/blog/page8/index.html new file mode 100644 index 0000000..2f5bbb5 --- /dev/null +++ b/blog/page8/index.html @@ -0,0 +1,1076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + Gramophone Gaana - Old Is Gold + +

    +

    + + by Akash S Bharadwaj +   + | +   + May 07, 2021 +

    +

    + Music. Who doesn’t love music? Hanging around with headphones on, earphones hooked to the ears and people travelling with volume up is common these days, but these audio devices weren’t a fashion before 20 years. You might have heard your... +

    + + + +
    +
    + +
    + + + + +
    + +
    +
    + +

    + Water-Jet Guided Laser Cutting + +

    +

    + + by Mallikarjun G M +   + | +   + February 11, 2021 +

    +

    + Laser The term ‘Laser’ originated as an acronym for Light Amplification by Stimulated Emission of Radiation. The difference between a Laser and other Light sources is the coherence. The spatial coherence of lasers allows them to be focused on a... +

    + + +
    + + IEEE NITK + + Piston + +
    +
    +
    + + + + +
    +
    + +

    + Metamaterials + +

    +

    + + by Ananya P +   + | +   + January 28, 2021 +

    +

    + Metamaterials are engineered materials or artificially structured composite materials that are made to possess properties absent in conventional materials. The internal microstructure of these materials is what makes these stand apart from naturally occurring materials. The properties of these materials... +

    + + +
    + + IEEE NITK + + Piston + + Materials + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + An intuition on how RNN and LSTM works + +

    +

    + + by Rakshit P +   + | +   + January 07, 2021 +

    +

    + An intuition on how Recurrent Neural Networks and LSTM works Let us first try to understand how RNNs work and how they are used to solve sequence modeling tasks that require the model to store the information seen before. Working... +

    + + +
    + + IEEE NITK + + CompSoc + + RNN + + LSTM + + Machine Learning + +
    +
    +
    + + + + +
    +
    + +

    + Elegant Algorithms using Randomization + +

    +

    + + by Chaithanya Shyam D +   + | +   + January 07, 2021 +

    +

    + Elegant Algorithms using Randomization Randomized algorithms are those algorithms that make use of something random (for example a random permutation of an array, a random number generator, etc) to calculate the answer fast with certainty or it gives the approximate... +

    + + + +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/page9/index.html b/blog/page9/index.html new file mode 100644 index 0000000..9972bbd --- /dev/null +++ b/blog/page9/index.html @@ -0,0 +1,1068 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Blog

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + +
    + + + + +
    + +
    +
    + +

    + The Elliptic Curve Cryptography + +

    +

    + + by Rakshita Varadarajan +   + | +   + January 05, 2021 +

    +

    + Introduction Elliptic Curve Cryptography (ECC) is one of today’s most powerful but least understood public-key encryption methods which is found upon the mathematical concept of elliptic curves. Compared to other algorithms serving the same purpose, ECC allows for smaller, faster... +

    + + + +
    +
    + + + + +
    +
    + +

    + Why Python Shouldn't be your First Programming Language + +

    +

    + + by Nishant Nayak +   + | +   + January 03, 2021 +

    +

    + Introduction Python is a programming language that has found its way into practically every field of software development. With its immense collection of openly available libraries, easy to learn syntax, and a plethora of available resources to learn from, both... +

    + + +
    + + IEEE NITK + + Python + + Programming + +
    +
    +
    + +
    + + + + +
    + +
    +
    + +

    + How are researchers and their research rated? + +

    +

    + + by Shivansh Joshi +   + | +   + November 12, 2020 +

    +

    + A lot of research is continuously happening around us. While the word research seems fascinating to most of us, we seldom know how impactful the research is or how the actual impact of any research is measured. While there are... +

    + + +
    + + Research + + Researchers + +
    +
    +
    + + + + +
    +
    + +

    + An Introduction to PyTorch + +

    +

    + + by Shruthan R +   + | +   + October 14, 2020 +

    +

    + An Introduction to PyTorch PyTorch was released in early 2017 by Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan and has been making a pretty big impact in the deep learning community. It's is a Python-based scientific computing package targeted... +

    + + + +
    +
    + +
    + + + + +
    + +
    + +
    + + + + +
    +
    + +

    + EKRANOPLAN + +

    +

    + + by Abhishek R +   + | +   + April 15, 2020 +

    +

    + Here’s a closer look at the Ekranoplan Often referred to as the Caspian monster, the ekranoplan is one of the most freakish designs that were actually brought to life in a period where people were peaking at innovation in military... +

    + + +
    + + Ekranoplan + +
    +
    +
    + +
    + + + +
    + + + + + +
    +
    + +
    +
    + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/paradox-free-time-travel/index.html b/blog/paradox-free-time-travel/index.html new file mode 100644 index 0000000..5aace15 --- /dev/null +++ b/blog/paradox-free-time-travel/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    “People like us, who believe in physics, know that the distinction between past, present, and future is only a stubbornly persistent illusion.” – Albert Einstein.

    +
    + +

    It’s a worry of physics enthusiasts who believe in the notion of “Time Travel” everywhere. What if they go back in time and alter the course of time, like preventing one’s parents from meeting or killing their grandfather? Such a time-traveling act could prevent them from ever being born or divert them from ever attempting to go back in time. Therefore, they would have never existed or gotten the opportunity to travel back in time in the first place. This is called a Paradox…The solution you ask for?? Well, there is none, that’s why it’s a Paradox. Before diving deep into the various Paradoxes in Time Travel and their possible solutions let’s look at the two broad categories of Time Travel Paradoxes:

    + +
      +
    1. Closed Causal Loops, such as the Predestination Paradox and the Bootstrap Paradox, involve a self-existing time loop in which cause and effect run in a repeating circle but is also internally consistent with the timeline’s history. Assuming the one in the show “Dark” where each character goes into the past with the intent of stopping an action from happening but ends up being a part of why that was caused.
    2. +
    3. Consistency Paradoxes, such as the Grandfather Paradox, and other similar variants such as The Hitler paradox, and Polchinski’s Paradox, generate several timeline inconsistencies related to the possibility of altering the past. Take the example of the movie “Back to the Future” where the protagonists repeatedly travel to the past and the future to alter the course of time and actions made by certain people at certain points in time and can return to their new future.
    4. +
    + +

    One way to solve a paradox is by stating “Time travel isn’t possible at all”. Although the very notion of traveling to the past violates one of the most fundamental premises of physics, and that of causality, there is still nothing in Einstein’s Theories to rule out the possibility of Time Travel. So why not ponder over such a reality as an exercise in logical reasoning?

    + +
      +
    1. The Predestination Paradox occurs when the actions of a person traveling back in time become part of past events, and may ultimately cause the event he is trying to prevent to take place…….. This results in a ‘temporal causality loop’ wherein assuming there is an Event 1 in the past which influences Event 2 in the future (time travel to the past) which then causes Event 1 to occur, with this circular loop of events ensuring that history is not altered by the time traveler proving our previously stated point that any attempts to stop something from happening in the past will simply lead to the cause itself, instead of preventing it from happening. This paradox inferences that things are always destined to turn out the same way and that whatever has happened must happen. But this also raises questions as to can there be Free Will when it comes to becoming a Time Travel or if you are just a part of an enormous predetermined Time Loop.
    2. +
    3. The Bootstrap Paradox is when an object, person, or piece of information sent back in time results in an infinite loop where the object has no discernible origin and exists without ever being created. A materialistic thing may degrade post several cycles or Time Loops and may wither off the loop but a piece of information is always an excellent constant to picture a scenario like this. It is also known as an Ontological Paradox, as ontology is a branch of philosophy that deals with the nature of being, or existence. Now Assume A Scientist traveling back in time and giving himself the knowledge of how to build a machine that can allow him to travel through time and space which he then goes on to use to return to the past and pass on the information to himself again for would create a bootstrap paradox involving information, as the information would have no true point of creation or origin.
    4. +
    5. Now the Paradox you’ve been waiting for: The Grandfather Paradox concerns ‘self-inconsistent solutions’ to a timeline’s history caused by traveling back in time. For example, if you traveled to the past and killed your grandfather, you would never have been born and would not have been able to travel to the past –That is a paradox. Assuming you did decide to kill your grandfather because he created a dynasty that destroyed the world. You figure if you ended his life before he meets your grandmother then the whole family line .including you. will cease to exist and the world will be saved from the heinous acts of tyranny but that wouldn’t work considering you wouldn’t have been born to travel back in time to commit the murder.
    6. +
    + +

    Now Solution: Assuming You go back in time, walk up to your Grandfather before he met your grandmother, and point a revolver at his head and pull the trigger……and Boom! The deed is done. You return to what you think is “The Present” but you never existed here. Everything about you has been erased, including your family, friends, home, possessions, bank account, and history. You’ve entered a timeline where you never existed. Scientists put forward the possibility that you have now created an alternate timeline or entered a parallel universe.

    + +

    The Parallel Universe Theory states that every time you attempt to Travel forwards or backward in time you are not really traveling to a reality on your earth but a parallel reality where things are absolutely identical to actions taken on your world. This can answer a lot many questions and rule out the later mentioned Butterfly effect from the equation. Consider it’s a parallel universe and it can open up the possibility of Coexistence where you can live in a world where your parents or any memory of you doesn’t exist or in other words the effect lives on even after removing the cause.

    + +

    Butterfly Effect: Perhaps the most important theory in time travel states that a small change in one state of a deterministic nonlinear system can result in large differences in a later state. Let’s see the story of one Paleontologist:

    + +

    A Paleontologist, with the help of a Time Machine, travels back to the Jurassic Period to get photographs of the various dinosaurs and species. He knows he can’t take samples so he just takes magnificent pictures from the fixed platform that is positioned precisely to not change anything about the environment. His assistant is about to pick a long blade of grass, but he stops him and explains how nothing must change because of their presence. They finish what they are doing and return to the present, but everything is gone. They reappear in a wild world with no humans, and no signs that they ever existed. They fall to the floor of their platform, the only man-made thing in the whole world, and lament “Why? We didn’t change anything!” And there on the heel of the scientist’s shoe is a crushed butterfly.

    + +

    Thus, Even changing anything as small as moving a leaf or killing one small butterfly can cause drastic ripples in the fabric of time and the overall effect of decision it has on the lives of the people let alone be the action of killing one’s Grandparents before their parents are conceived.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/particlesjs-config.json b/blog/particlesjs-config.json new file mode 100644 index 0000000..e29a685 --- /dev/null +++ b/blog/particlesjs-config.json @@ -0,0 +1,110 @@ +{ + "particles": { + "number": { + "value": 53, + "density": { + "enable": true, + "value_area": 800 + } + }, + "color": { + "value": "#000000" + }, + "shape": { + "type": "circle", + "stroke": { + "width": 0, + "color": "#000000" + }, + "polygon": { + "nb_sides": 5 + }, + "image": { + "src": "img/github.svg", + "width": 100, + "height": 100 + } + }, + "opacity": { + "value": 0.5, + "random": false, + "anim": { + "enable": false, + "speed": 1, + "opacity_min": 0.1, + "sync": false + } + }, + "size": { + "value": 3, + "random": true, + "anim": { + "enable": false, + "speed": 40, + "size_min": 0.1, + "sync": false + } + }, + "line_linked": { + "enable": true, + "distance": 112.2388442605866, + "color": "#0f0e0e", + "opacity": 0.4, + "width": 1.2827296486924182 + }, + "move": { + "enable": true, + "speed": 6, + "direction": "none", + "random": false, + "straight": false, + "out_mode": "out", + "bounce": false, + "attract": { + "enable": false, + "rotateX": 600, + "rotateY": 1200 + } + } + }, + "interactivity": { + "detect_on": "canvas", + "events": { + "onhover": { + "enable": false, + "mode": "grab" + }, + "onclick": { + "enable": true, + "mode": "push" + }, + "resize": true + }, + "modes": { + "grab": { + "distance": 400, + "line_linked": { + "opacity": 1 + } + }, + "bubble": { + "distance": 400, + "size": 40, + "duration": 2, + "opacity": 8, + "speed": 3 + }, + "repulse": { + "distance": 200, + "duration": 0.4 + }, + "push": { + "particles_nb": 4 + }, + "remove": { + "particles_nb": 2 + } + } + }, + "retina_detect": true +} \ No newline at end of file diff --git a/blog/password-security-techniques-and-challenges/index.html b/blog/password-security-techniques-and-challenges/index.html new file mode 100644 index 0000000..7432a23 --- /dev/null +++ b/blog/password-security-techniques-and-challenges/index.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Let me preface this article with something: There’s a very good chance that your password is not secure. In fact, if it’s anything less than nine characters long, any attacker could crack it in seconds if he had a decent GPU. Most of us know that ‘password’ is a very weak choice for a password, but there are some of us who think we’re smart and keep our passwords something like ‘p@$$w0r6’: It’s a terrible idea. Change it right now. ‘Hello123’ is probably safer than that. So what exactly is a safe password? And how do you even store passwords securely? Let’s try to answer these questions. Also, let’s do some password cracking along the way to see if what we come up with is actually secure.

    + +

    Storing Passwords Securely

    + +

    Usually the data on a server is protected only by the web security measures in place. When these fail, the server is compromised and the data is available to the attacker. For sensitive data like passwords, this becomes a huge problem. Password security provides an added layer of security. It ensures that no kind of usable data can be extracted from the password data stored on the server. Let’s discuss certain techniques for storing passwords:

    + +

    1. Plaintext:

    +

    This is the naive approach to storing passwords. So for example, if a password is something like ‘p@ssword1234’, it would be stored as is in the web server. It makes logical sense: The username and password are stored along with each other on the server and when the user wants to authenticate, the backend code checks the data they gave as input with the data on the server. But obviously, this is a terrible idea. Any attacker who gains access to the server, basically has access to all the passwords.

    + +

    2. Encryption:

    +

    Let us go one step further and encrypt all the passwords with a symmetric key (keys which can both encrypt and decrypt data) before storing them. When a user needs to authenticate, the password in the server is decrypted using the key and checked with the entered password. This is a little better since an attacker cannot just read all the passwords by gaining access to the server. But if he finds the encryption key somehow, the passwords can be decrypted easily. So to eliminate this problem, we need a kind of encryption which cannot be reversed. This is where hashing comes in.

    + +

    3. Hashing:

    +

    In simple words, a hash function generates a unique, fixed length string signature for an input data of any arbitrary length. The keywords to note here are unique and fixed length. Unique means that there exists only one hash for a specific input data. Fixed length implies that significant data loss has occurred during hashing, which means that the original data cannot be obtained from the hash string.

    + +

    We can use these properties of a hash to our advantage while storing passwords. So, instead of storing the passwords themselves, we store their hashes. During authentication, we hash the password input from the user and compare it with the hash stored in the database. Since hashes are unique to a string, comparing them is equivalent to comparing the original strings. Thus we can perform authentication without really knowing the actual password of the user.

    + +

    This sounds good. The attacker has no way of obtaining the original password from the hash. So it should be secure right? Wrong. Instead of just explaining why, I’ll demonstrate how to crack hashes.

    + +

    Password Cracking

    + +

    For this exercise, we will be using hashcat. Hashcat is an open source password recovery tool which uses GPU hardware acceleration to crack passwords.

    + +

    I have downloaded a leaked password database called hak5.txt containing 2351 passwords and converted all the passwords to their MD5 hashes for the sake of this exercise. This means that these are real passwords that real people have used, which is significant because it puts into perspective how weak passwords in real life actually are. This is the file containing the hashes, ‘hashes.txt’:

    + +

    File Containing Hashes

    + +

    There are a lot of ways of cracking hashes. But for this demonstration, we will use three of some of the most used cracking techniques: Brute force attacks, Dictionary attacks and Rule-based Dictionary attacks. In general, there is only one approach to cracking a hash: keep guessing strings and compare their hashes with the hashes to be cracked. The different techniques are merely ways of guessing strings.

    + +

    1. Brute force attack:

    +

    This is a naive approach but it works surprisingly well. We basically guess every combination of characters of every length, hash each one of them and compare. At some point, the hashes match and we have the password. This, however, is only practical for passwords of small length since the number of combinations to guess goes exponentially higher as the length of the string increases. Below is an example of a brute force attack:

    + +

    Command: $ hashcat -m 0 -o <output_file> <hashes> <guess_params> --force -O

    + +

    Running the Command:

    + +

    Running the Command

    + +

    Stats after completion:

    + +

    Stats after completion

    + +

    Cracked Passwords:

    + +

    Cracked Passwords

    + +

    So let’s go about this process step by step:

    + +

    First, the command:

    +
      +
    • hashcat is the program that we’re using.
    • +
    • -m 0 tells the program that the hash that we want to crack is md5.
    • +
    • -a 3 tells the program that the attack type is brute force.
    • +
    • -o cracked.txt sends all the cracked passwords to a file with name cracked.txt.
    • +
    • hashes.txt is the file containing the md5 hashes.
    • +
    • ?a?a?a?a?a is the main thing here: It tells hashcat to guess strings of length exactly 5 and containing lowercase alphabets, uppercase alphabets and digits.
    • +
    • --force and -O are device specific options to override some driver issues.
    • +
    + +

    After the process is done, we check the contents of the file cracked.txt. We see that there were a good amount of passwords of length 5 and containing only alphanumeric characters.

    + +

    The more important aspect to consider is that the process took 4 mins and 39 seconds, which is pretty fast considering the fact that the machine needs to hash and check every possible alphanumeric string of five characters. But any password length greater than seven or eight characters would need days to crack. So this technique is highly impractical for longer passwords.

    + +

    2. Dictionary attack:

    +

    The bigger problem with brute force is that most of the strings it guesses are very random. An average user would never think of keeping something like ‘hSN3Lp67sUe’ as their password since it is hard to remember. So, most of the passwords that are guessed in brute force attacks are pretty much useless and a waste of time. To eliminate this problem, we use dictionary attacks. Instead of trying every possible combination, we guess strings that are most likely to succeed. This is done using ‘wordlists’ or ‘dictionaries’. These are files containing common passwords obtained from online password leaks. We consider these strings as the basis of our guesses. We first check the existing strings in the wordlist and then small variations of them (Like converting them to uppercase or adding a period in between). Let me demonstrate:

    + +

    Command: $ hashcat -m 0 -o <output_file> <hashes> <path_to_wordlist> --force -O

    + +

    Running the Command:

    + +

    Running the Command

    + +

    Stats after completion:

    + +

    Stats after completion

    + +

    Cracked Passwords:

    + +

    Cracked Passwords

    + +

    This time, we get a lot more passwords. Everything in the command remains the same except we change the attack type from 3 to 0 to denote dictionary attack and specify the path to the wordlist, which, in this case is rockyou.txt. Certain points to note:

    + +

    We get a lot more passwords than brute force. On counting, we find that we have cracked 558 passwords with the dictionary attack which is massive compared to the 27 passwords that we cracked using brute force.

    + +

    The more important thing to note is that the time taken is just 11 seconds which is a phenomenal improvement over brute force. So, the number of passwords cracked per second is much higher in a dictionary attack.

    + +

    There is only one downside to basic dictionary attacks: the wordlist has to be really good. The success of a dictionary attack depends heavily on the wordlist used.

    + +

    Let us take this one step further. Though we obtained 558 passwords with dictionary, there are over 2000 hashes in the hashes.txt file. So we need a way to crack more passwords.

    + +

    3. Rule-based Dictionary attacks:

    +

    When we usually think of guessing someone’s password, we usually think about the most common passwords like ‘password’ and then we try to perform variations on that like ‘p@$$word’ or ‘PaSsWoRd’ or ‘wordpass123’. Though dictionary attacks can check some of these variations, they don’t go far enough since they are programmed to check for common things like adding a period somewhere in between the string or substituting spaces with underscore. To really exhaust all the possible variations, we can write custom rulesets based on which the program can check for a huge number of variations on every string in a wordlist. To demonstrate:

    + +

    Command: $ hashcat -m 0 -o <output_file> <hashes> <path_to_wordlist> -r <path_to_ruleset> --force -O

    + +

    Running the Command:

    + +

    Running the Command

    + +

    Stats at the end of execution:

    + +

    Stats at the end of execution

    + +

    Cracked Passwords:

    + +

    Cracked Passwords

    + +

    I terminated the process at 0.77% completion. It would take hours for hashcat to complete the process with the computing power that my computer can provide. Let me put up an image to compare how many passwords we have obtained with each technique:

    + +

    Comparison

    + +

    The differences between the techniques are apparent. Even though the rule-based attack completed only 0.77% of its procedure, it got more passwords than basic dictionary attack which completed 100% of its procedure. This should put into perspective how powerful rule-based dictionary attacks are, while being sufficiently fast.

    + +

    In terms of the command, everything remains same except that we include a ruleset with -r \<pathtoruleset\>. With a enough of computing power, it is possible to crack almost all hashes in the hashes.txt file in minutes.

    + +

    There are many more password cracking techniques like rainbow table attacks, combinator attacks, etc, but they work on similar principles while being slightly faster.

    + +

    While we only cracked md5 hashes, these techniques remain same for every other hashing algorithm with the only difference being changes in computation time for each hash operation depending on the hashing algorithm used.

    + +

    So, now we have proved that just hashing won’t make the passwords secure. Then what is the best way of storing passwords?

    + +

    The Best we can do: Hashing and Salting, Hash Stretching

    + +

    Conventionally, we store just the hash of the password in the database. This has one major problem: Same passwords don’t have different hashes. This is called determinism. Using salting, we can give an illusion of non-determinism.

    + +

    If the password is ‘password’, it can be converted into it’s MD5 hash and stored as ‘5f4dcc3b5aa765d61d8327deb882cf99’ in the database. This can easily be cracked with either a basic or a rule based dictionary attack. To prevent this, we ‘salt’ the original password, that is, we add some random characters at the end or the beginning of the original password like ‘passwordjUIGhs2g7ah’. The hash of this salted password ‘6610878e2c3fd864fd47a72a677fec4b’ is stored in the database. The salt would vary from user to user. During authentication, the salt for the particular user would be appended to the password input, hashed and then checked with the hash in the database.

    + +

    Now, this hash is impossible to brute force since the length of the string is pretty huge. It is borderline impossible to crack it using basic or rule based dictionary attack it since the salt is completely random. The only scenario where this password would be compromised is if the attacker miraculously finds the salt for a particular user and performs a rule based dictionary attack with the rule being every guess has the salt appended to the end of it. Even in this scenario, he can only crack one password since different users have different salts.

    + +

    There is another possibility for attacking salted passwords. With enough computing power, one could technically perform a rule based dictionary attack in combination with a brute force attack. Basically for every guess made by the rule based dictionary attack, represented by, ‘pwd’, we brute force strings, represented by ‘slt’. We then append pwd and slt to obtain a string which is then hashed and checked.

    + +

    It sure sounds complicated. But anybody having a decent number of GPUs can do these operations fairly quickly. And this eliminates the problem that the attacker had with different users having different salts since whatever strings he generates are random anyway. So how can we make something truly impossible to crack?

    + +

    We can’t. The only thing that we can do is slow the attacker down. We use a technique called hash stretching to achieve this. Instead of hashing the salted passwords just once, we run it through a loop and repeatedly hash it thousands of times.

    + +

    This has a lot of advantages. Firstly, with normal hashing, as we have seen, when a good number of passwords are stolen from a web server, and stored offline, it becomes very easy to crack. This is because the attacker has no limit on the number of guesses he can make to get the password. With a sufficiently powerful GPU setup the attacker has the ability to generate billions of guesses per second. Unless a user has a really good password, the attacker would be successful in cracking almost everything that he stole from the server. Hash stretching slows down this process considerably, since for each guess, the machine has to perform the hash algorithm multiple number of times. So, the speed of cracking goes down from billions of passwords per second to a few million, which is a huge difference.

    + +

    A lot of things have to go right for an attacker to crack a salted password stored after hash stretching. So this is generally agreed as the best way to store passwords. But every organization cannot afford to allocate so many resources for this. Most organizations just stick with whatever they have even though it is obsolete. These outdated systems are what black hats target and exploit. This what happened to Adobe in 2013. They stored their passwords in an encrypted form with every password having the same key. This central point of failure led to around 150 million passwords being compromised.

    + +

    If an organisation cannot afford to spend enough resources to store passwords securely, they can avail the services of bigger companies like Google or Facebook to handle all authentication. This would be the most secure and cost effective way.

    + +

    In conclusion, it’s tricky business to store passwords. So either one should not do it or do it properly since password leaks basically strengthen password cracking dictionaries and wordlists. Every compromised password grants extra power to malicious hackers. Hence it is very important to store passwords securely.

    + +

    References:

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/phase-change-material/index.html b/blog/phase-change-material/index.html new file mode 100644 index 0000000..55f1fe2 --- /dev/null +++ b/blog/phase-change-material/index.html @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A Phase Change Material (PCM) is a substance with a high heat of fusion which, on melting and solidifying at a certain temperature, is capable of storing and releasing large amounts of energy. In the most basic terms, a PCM is a substance which can store and release large amounts of energy, typically in the form of heat. Although phase changes can occur among any combination of the three phases of a substance - gas, liquid, or solid - the most commercially viable transition is between the liquid and solid phases.

    + +

    Working of a PCM

    +

    A PCM in its’ solid phase absorbs heat as the external temperature rises. The temperature of the PCM will mirror the external temperature until the PCM’s melt point is reached. When the external temperature reaches the melt point of the PCM, the PCM will begin to melt, i.e. “change phase”. During the phase change process, the PCM will absorb large amounts of heat with almost no change in temperature. During this time period, the PCM is providing a cooling effect. The reverse cycle occurs as the external temperature cools. The PCM, now in its’ liquid phase, can release the heat it absorbed as the external temperature decreases. During this time period, the PCM solidifies and provides a warming effect.

    + +

    Phase Change Material

    + +

    Advantages of using PCM

    +

    No electricity or power of any kind is necessary to create a real reduction or increase in temperature. In addition, PCMs have the advantage that they can be used over and over again. Also, unlike the ice storage system, however, the PCM systems can be used with any conventional water chiller both for a new or alternatively retrofit application. The positive temperature phase change allows centrifugal and absorption chillers as well as the conventional reciprocating and screw chiller systems or even lower ambient conditions utilizing a cooling tower or dry cooler for charging the TES system.

    + +

    Usage of Phase Change Alloys for Memory Applications

    + +

    PCM has been successfully used in optical memory devices such as DVD-RAM since the 1990s and recently commercial production of electronic non-volatile phase-change random memory (PC-RAM) has been launched by two of the world’s leading memory makers Samsung and Micron.

    + +

    The basic idea of PCM is to utilize the property contrast between the crystalline and amorphous phases. When a material is cooled down slowly, a crystalline phase is formed, when it is cooled down rapidly, an amorphous (glassy) phase is formed. In the phase-change process, a short intense pulse melts the material that is subsequently transformed into the amorphous phase. A longer pulse of lower intensity reverts the material to the crystalline phase. The underlaying phase-change mechanism is generally believed to have a purely thermal origin making use of either Joule heating in electrical memories or the heat released during non-radiative recombination in optical memories.

    + +

    References:

    +
      +
    1. https://www.youtube.com/watch?v=BG2w4wb4Q5w&t=122s
    2. +
    3. https://en.m.wikipedia.org/wiki/Phase-change_material
    4. +
    5. https://engineering.jhu.edu/materials/research-projects/phase-change-alloy-for-memory-applications/#.W7eoMWgzZPZ
    6. +
    7. https://www.nature.com/articles/srep13698#ref2
    8. +
    9. http://microteklabs.com/how-do-pcms-work.html
    10. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/photocatalytic-decomposition/index.html b/blog/photocatalytic-decomposition/index.html new file mode 100644 index 0000000..8ce4858 --- /dev/null +++ b/blog/photocatalytic-decomposition/index.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Photocatalytic Detoxification

    +

    The water bodies around the world are regularly dumped with waste water effluents. These contain various organic and inorganic molecules that affect the aquatic life and overall water quality, which is called water pollution. +The surprising fact is that quite a lot of purification is caused naturally by the breakdown of these molecules by sunlight. This process can be assisted with colloidal semiconductors to speed up the reaction process and increase the efficiency. The photocatalytic detoxification of wastewater is a process that combines heterogeneous catalysis with solar technologies. +Organic compounds such as alcohols,carboxylic acids,amines, herbicides and aldehydes, have been photocatalytically destroyed in laboratory and field studies. The photocatalytic process can mineralize the hazardous organic chemicals to carbon dioxide, water and simple mineral acids. +Many processes have been proposed over the years and are currently used to remove organic toxins from wastewaters. Current treatment methods for these contaminants, such as adsorption by activated carbon and air stripping, merely concentrate the chemicals present, by transferring them to the adsorbent or air, but they do not convert them into non-toxic wastes. Thus, one of the major advantages of the photocatalytic process over existing technologies is that there is no further requirement for secondary disposal methods. +Another advantage of this process is that when compared to other advanced oxidation technologies, especially those using oxidants such as hydrogen per-oxide and ozone, expensive oxidizing chemicals are not required as ambient oxygen is the oxidant. Photocatalysts are also self-regenerated and can be reused or recycled. +During the photocatalytic process, the illumination of a semiconductor photocatalyst with ultraviolet (UV)radiation activates the catalyst, establishing a redox environment in the aqueous solution (Zhang et al.,1994a). Semiconductors act as sensitizers for light-induced redox processes due to their electronic structure, which is characterized by a filled valence band and an empty conduction band. The energy difference between the valence and conduction bands is called the band gap. The semiconductor photocatalyst absorbs impinging photons with energies equal to or higher than its bandgap or threshold energy. Each photon of the required energy (i.e. wavelength) that hits an electron in the occupied valence band of the semiconductor atom, can elevate that electron to the unoccupied conduction band leading to excited +state conduction band electrons and positive valence band holes (Schiavello, +1989).The fate of these charge carriers may take different paths (refer to Figure +1). Firstly, they can get trapped, either in shallow traps (ST) or in deep traps (DT). +Secondly, they can recombine, non-radiatively or radiatively, dissipating the +input energy as heat. Finally, they can react with electron donors or acceptors +adsorbed on the surface of the photocatalyst. In fact, it was recently shown that +any photoredox chemistry occurring at the particle surface, emanates from +trapped electrons and trapped holes rather than from free valence band holes, +and conduction band electrons.

    + +

    These semiconductors when used in the size range if 1-100 nanometers give exceptional results due to changes in several physical and chemical properties that come along with quantum size range. Thus, the study of these particles will surely give us permanent and effective solutions of ridding the environment of harmful pollutants and advancing towards a cleaner tomorrow.

    + +

    untitled.jpg

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/piezoelectricity-and-piezoelectric-sensors/index.html b/blog/piezoelectricity-and-piezoelectric-sensors/index.html new file mode 100644 index 0000000..2e9c0f1 --- /dev/null +++ b/blog/piezoelectricity-and-piezoelectric-sensors/index.html @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    PIEZOELECTRICITY AND PIEZOELECTRIC SENSORS

    +

    Piezoelectricity

    +

    The accumulation of electric charge in solid materials in response to applied mechanical stress is called the piezoelectric effect or piezoelectricity, and those types of solid materials are called piezoelectric materials. Quartz, Berlinite (AlPO4), Sucrose (table sugar), Topaz, Tourmaline-group minerals, Lead titanate, etc. are some examples of naturally occurring piezoelectric materials. Some of the biological materials exhibiting piezoelectricity include silk, wood, enamel, tendon, etc. Barium titanate, Lead zirconate titanate, Potassium niobate, Sodium tungstate, Zinc oxide, etc., fall under the category of Synthetic ceramics that exhibit the piezoelectric effect. Piezoelectric effect is also exhibited by some polymers like polyvinylidene fluoride (PVDF), polyvinylidene chloride (PDVC), etc. +The piezoelectric effect is a result of the linear electromechanical interaction between the electrical and mechanical states in crystalline materials. The internal generation of mechanical strain resulting from an applied electric field is called the reverse piezoelectric effect. The materials which exhibit the piezoelectric effect also exhibit the reverse piezoelectric effect. +We can say that a crystal can exhibit the piezoelectric effect if:

    +
      +
    1. The crystal lattice should contain polar bonds. For example, Quartz exhibits the piezoelectric effect because of the oxygen-sulfur bond which is a polar bond.
    2. +
    3. The crystal structure should not have inversion symmetry/point symmetry. If point symmetry exists in the crystal then the center of charge will not be displaced even if there is some mechanical stress on the crystal, as a result, there would be no piezoelectric effect in this case. +

      Uses

      +

      Piezoelectricity has a number of useful applications. Piezoelectric materials are used in the detection and production of sound, high voltage power sources, sensors, actuators, piezoelectric motors, electronic frequency generation, etc. The piezoelectric material quartz is used as a time reference in Quartz watches. These materials also find some daily life applications such as acting as a source of ignition in lighters, for amplification pickups in some guitars.

      +

      Modes of operation of piezoelectric materials:

      +

      The piezoelectric material has three main modes of operation which depend on the way it has been cut.

      +

      1.Transverse Effect:

      +

      A force applied along a neutral axis(let’s say y-axis), displaces the charge along an axis perpendicular to the neutral axis(x-axis) and the amount of charge displaced is proportional to the applied force and the dimensions of the crystal along the respective axes. +Qx = dxy * Fy * (b/a) +Where ‘Qx’ is the charge displaced along the x-axis, ‘a’ is the dimension of the crystal parallel to the neutral axis(y-axis), ‘b’ is the dimension of the crystal along the x-axis and ‘dxy’ is the corresponding piezoelectric coefficient in that plane(XY-plane).

      +

      2. Longitudinal Effect:

      +

      The amount of electric charge that gets displaced in the direction of the applied force(let’s say x-axis) is only proportional to the applied force and does not depend on any of the dimensions of the crystal.
      +Qx = dxx * Fx +Where ‘Qx’ is the charge displaced along the x-axis, ‘Fx’ is the force applied along the x-axis and ‘dxx’ is the corresponding piezoelectric coefficient along the x-axis

      +

      3. Shear Effect:

      +

      The amount of charge produced in the plane(YZ-plane) normal to the direction of the applied force(along the x-axis) is only proportional to the applied force and does not depend on any of the dimensions of the crystal and is twice the amount of the charge produced in the direction of the force. +Qyz = 2 * dxx * Fx +Where ‘Qyz‘ is the amount of charge produced in the YZ-plane, ‘Fx’ is the force applied along the x-axis and ‘dxx’ is the corresponding piezoelectric coefficient.

      +

      Piezoelectric Sensors

      +

      A piezoelectric sensor utilizes the piezoelectric effect to measure the change in physical quantities like acceleration, pressure, temperature, strain, force, etc by converting them into electric charge.

      +

      Equivalent circuit

      +

      The voltage produced at the source ‘V’ is directly proportional to the applied force, pressure, strain, or the magnitude of acceleration (in accelerometers). The Equivalent circuit of the piezoelectric sensor is as shown. +Equivalent Circuit +
      +V - Voltage produced by piezoelectric material +Ce - represents the mechanical elasticity of the material +Lm - due to seismic mass and inertia of sensor +Co - static capacitance of the sensor i.e. capacitance due to base plates +Ri - insulation leakage reactance +We attach a load(which depends on our application) parallel to the leakage reactance.

      +

      Graph

      +

      The graph of the sensitivity i.e. ratio of the electric output and the applied force/acceleration denoted by s(w) and frequency(frequency of the crystal due to applied force, stress or acceleration ) will be as shown below.

      +
    4. +
    + +

    Graph

    + +

    To make use of piezoelectric material as a sensor, the flat region of the frequency plot(the part of the graph which is in between wmin and wmax) is used. To accommodate low frequencies of interest the load resistance and leakage reactance should be quite large.

    +

    Working

    +

    So a typical piezoelectric sensor has a base plate, seismic mass, and the piezoelectric crystal. When the force/ stress is applied or the sensor experiences motion (this happens in accelerometers), the seismic mass loads up the elements. The voltage corresponding to the physical parameter is generated at the source as shown in the circuit above. This can be seen as if the voltage generated drives the equivalent circuit and we get an output signal (which is generally voltage across the load/current through the load), which is processed to determine the physical parameter.

    +

    Advantages and Disadvantages of piezoelectric sensors

    +

    Due to their inherent advantages, piezoelectric sensors are used in various fields. They have a high modulus of elasticity and high natural frequency. They are insensitive to electromagnetic fields and radiation, enabling measurements even under harsh conditions. +One major disadvantage of piezoelectric sensors is that they cannot be used for truly static measurements because a static force causes a fixed amount of charge, so there would not be any output signal.

    +

    Applications of piezoelectric sensors

    +

    The piezoelectric sensors are used to measure physical parameters, for example, they are used in accelerometers, etc. They are used as touch sensors and tilt sensors in mobile phones and other consumer electronics. Piezoelectric sensors are used to measure inside internal combustion engines to monitor combustion inside them. Piezoelectric sensors also find applications in aerospace, medical, nuclear instrumentation.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/playing-blackjack-optimally-with-reinforcement-learning/index.html b/blog/playing-blackjack-optimally-with-reinforcement-learning/index.html new file mode 100644 index 0000000..352c62a --- /dev/null +++ b/blog/playing-blackjack-optimally-with-reinforcement-learning/index.html @@ -0,0 +1,610 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction to Reinforcement Learning

    + +

    Reinforcement learning(RL) is a branch of machine learning which draws from the way humans learn to do tasks. For anyone unfamiliar with Pavlov, he is a physicist popularly known for his work in conditioned response. He trained a dog such that every time he rang a bell, he would immediately give the dog food. The dog soon learned to salivate at the sound of the bell. The same foundation to Jim’s mint prank in The Office for those who get the reference xD.

    + +

    Pavlov's Experiment

    + +

    Reinforcement learning (or RL) takes Pavlov’s experiment one step further. Suppose the new experiment was that when Pavlov rang each bell out of a set of them, the dog would have to perform some corresponding trick to receive his treat. The dog, through trial and error, would eventually observe and learn the correct action to take for each bell to get as many treats as he can. This is essentially how dog-training and, you guessed it, RL in its basic form works!

    + +

    For a quick insight into the technical basics of RL, it is a setup where an agent (our dog) takes an action in some environment and then receives observations (the different ringing bells) and reward (yummy treats) from that environment. The environment consists of states (in this case, what bell is ringing), and in each state, the agent takes an action to get to another state. While the next state and reward received are out of the agent’s control or full prior knowledge, what it can do is learn from those findings to take better actions. The fundamental objective is to maximize the cumulative expected reward, also called expected return. Depending on the factor γ, also called the discounting factor, the amount of importance given to future rewards may be reduced. γ decides how short-sighted or far-sighted the agent is, i.e: how much it prioritizes reward it receives in the near future compared to what it would receive later.

    + +

    RL basic idea

    + +

    What is referred to as the agent’s policy can be thought of as a strategy while playing a game. More formally, it’s a function that maps a state to an action or a distribution over actions. We also define an action-value function, Q that gives us a measure of how good it is to take a particular action in each state, or to know how favorable each action is in a state of the game. There is also a state-value function which tells you how good it is to be in each state. It is the expected reward that is obtained by following a given policy, starting from that state.

    + +

    All this sounds very similar to a human playing a game, and you’re right, it really is. The usual concept of points conveniently plays the role of reward. So, let’s understand it better by playing the casino card game of blackjack.

    + +

    Blackjack rules

    + +

    Here are the basic rules

    + +

    Here all face cards have the value of 10. The game begins with two cards dealt to both dealer and player. One of the dealer’s cards is face up and the other is face down. If the player has 21 immediately (an ace and a 10-card), he wins unless the dealer also has the same, in which case the game is a draw. If the player does not have 21, then he can request additional cards, one by one (hits), until he either stops (sticks) or exceeds 21 (goes bust). If he goes bust, he loses; if he sticks, then it becomes the dealer’s turn. The dealer hits or sticks according to a fixed strategy without choice: he sticks on any sum of 17 or greater, and hits otherwise. If the dealer goes bust, then the player wins; otherwise, the outcome — win, lose, or draw — is determined by whose final sum is closer to 21. Note that in the game, an ace could count as either a 1 or 11, you generally count it as 11 unless your sum exceeds 21 in which you reduce it to 1 which prevents you from going bust. If the player holds an ace that he could count as 11 without going bust, then the ace is said to be usable.

    + +

    Model free methods

    + +

    Before we get into actually playing the game, more like watching the agent learn to play, bear with some more technical aspects that will give us a better understanding of what’s happening under the hood.

    + +

    Here model-free essentially means that you, or rather, the agent doesn’t know the exact dynamics (state-transition probabilities) of the environment. What that means here is that you don’t have prior knowledge in Blackjack what the next state will be when you choose to hit or stay. If you did, then playing wouldn’t really be much of a task and casinos world-wide would go bankrupt. All you’d need to do is look through this knowledge to figure out what to do in each state to go to the most favorable next state to essentially find the optimal policy, one of the ways this can be done is through dynamic programming. But in blackjack, and most other interesting applications, you don’t know what could happen next so you need to play and figure it out with experience. To kick off this experience we follow some arbitrary policy, but one that lets us explore states so that we don’t overlook some advantageous ones that we may deem unfavorable at first. This is often referred to as the exploration-exploitation dilemma. Exploitation is the right thing to do to maximize the expected reward on the one step, but exploration may produce the greater total reward in the long run. There are algorithms that deal with this. We accomplish this through ϵ-greedy policies, ones that will mostly take the optimal action and learn from what happens next, but with a probability of ϵ, will explore the consequences of a random action so as to learn more about each state eventually and ensure that we reach the global optimum solution.

    + +

    Our task really comes down to two tasks we can repeat over and over again to reach our optimal policy: we should be able to evaluate the current policy we are following and secondly, use this evaluation to improve our current policy. Formally, this is known as Generalized Policy Iteration (GPI).

    + +

    GPI

    + +

    Let’s Play!

    + +

    Monte Carlo method

    + +

    The term Monte Carlo is often used more broadly for any estimation method that relies on repeated random sampling. In RL Monte Carlo methods allow us to estimate values directly from experience, from sequences of states, actions and rewards. +We use this as a way to evaluate the policy. Here we sample sequences of episodes: State, action, reward generated by following the policy till termination of the episode and the back propagate from the end to update the value of each state in the episode. The value of each state is the expected return from that state which can be calculated incrementally.

    + +

    As an example, this is the evaluation of a policy that chooses to stick only on values of 20 or 21 (source: Sutton and Barto)

    + +

    Monte Carlo evaluation

    + +

    The game plan is to initialize our policy such that it’s stochastic which means that all actions have a possibility of being selected (here we just assign all probabilities to the same value or randomly initialize the policy). We evaluate the current policy using Monte Carlo evaluation and then we can easily improve this current policy but acting greedy with respect to it (we actually act ϵ greedily). Basically, look at the values corresponding to the current state in the Q-function and choose the action that maximizes the value. With this new policy, we re-compute the Q-table and the process goes on. +Mathematically, going in reverse from the time step of termination of the episode, the return for each state-action pair is computed according to the following formula, with future rewards being discounted by a factor of γ raised to the power of how much later they are received. +\(G_t=R_{t+1} + \gamma R_{t+2}+...+ \gamma ^{T-1}R_T\) +Now the values are updated according to : +\(Q(S,A)=Q(S,A)+ \alpha (G_t-Q(S,A))\) +So the value is moved alpha (learning rate) times the error between what was previously computed to be the expected return and the return we actually received. To compute the returns, the value must be computed in reverse from the end of each episode. The backup diagram looks something like this:

    + +

    MC backup

    + +

    The optimal policy learnt by this algorithm is as follows:

    + +

    Optimal policy from Monte Carlo +(source: Sutton and Barto)

    + +

    The agent we trained for 500,000 episodes with decaying epsilon value learnt the following policy:

    + +

    Monte Carlo policy

    + +

    At a glance, it seems in the case of a usable ace, our agent learns a policy very similar to the HIT17 policy of our dealer. Since we can’t outright judge the quality of the policy, we observe the player playing 1000 rounds against the dealer and note the statistics.

    + +

    wins = 434.0
    +draws = 89.0
    +losses = 477.0

    + +

    However, we still can’t manage to beat the dealer but that isn’t too concerning here, since HIT17 is a pretty great policy to begin with and blackjack, like most casino games, is rigged to be in favor of the dealer. Regardless, if our agent learned a policy even slightly better than HIT17, it would have had more wins than losses.

    + +

    DRAWBACKS OF MC

    + +

    Monte Carlo methods inherently assume that the task you are using it on is episodic since it does wait till termination to update the Q-values. So, this algorithm can’t be applied to continuing tasks (for example, a personal assistant robot, its task doesn’t really have finite episodes and never ends). Additionally, say eventually on termination you got a big negative reward; this would affect the Q-values of all the states that came before in the episode, so the credit or blame isn’t assigned properly to certain states. While this may be fine for short episodic tasks like blackjack, for longer-horizon ones, it would be better to use temporal difference methods. Of these methods, here we will discuss Q-learning.

    + +

    Before moving on, do note that blackjack is one of the cases where Monte Carlo works well given the nature of the environment. The game is episodic, each episode is short and the reward only appears at the end of the episode.

    + +

    TEMPORAL DIFFERENCE METHODS

    + +

    Temporal Difference (TD) methods bootstrap. What that fancy term means is that at each time step, it updates the values of each state by looking at the value of the next state (TD(0)) and working its way back. There are 3 methods under this: sarsa, Q-learning and expected-sarsa, of which we will assess Q-learning here. +Here is a visual of what state or action values each method considers for backups

    + +

    backup diagrams

    + +

    Q-learning

    + +

    Here we use a similar initialization for Q-values for each state and action. We sample episodes and at each time step, the agent chooses an action ϵ-greedily, observes the reward from the next state and backs up the value for the current state-action pair. In Q-learning, in each step of each episode we sample, after choosing the action A and observing the reward R and next state S’, the action-value corresponding to S,A is updated according to the formula: +\(Q(S,A)=Q(S,A)+ \alpha [R+ \gamma max(Q_a(S',a))-Q(S,A)]\) +The difference between this and our previous monte carlo update is in the target for update. Previously it was the sampled return which was calculated in reverse from episode termination. Here the target is the reward received + the discount factor times the maximum value from the next state, out of all the possible actions from that state. This way, for each update, what is considered is the maximum over the action values of the next state. The backup diagram looks like this:

    + +

    Q-learning backup

    + +

    We once again train our agent on 500,000 episodes and it learns the following policy:

    + +

    Q-learning policy

    + +

    After 1000 games based on the above policy:

    + +

    wins = 420.0
    +draws = 92.0
    +losses = 488.0

    + +

    From these statistics, it does seem that our Q-learning policy didn’t perform as well as Monte Carlo; that could perhaps benefit from more rounds of training or tweaking the parameters. +Regardless, temporal difference methods are usually more efficient and converge quicker since it updates the Q-values at every step and not just when an episode ends.

    + +

    DRAWBACKS OF TD

    + +

    Temporal difference learning is faster but less stable and may converge to the wrong solution. We estimate the Q-values only from the current reward, and use our own estimate of the values of the next state to predict the future reward. While this is faster, our targets are based on our estimation itself, making it unstable. Moreover, our estimate starts off arbitrarily wrong, so we might train toward wrong targets and might converge to a wrong solution.

    + +

    What next?

    + +

    There’s much more to learn of reinforcement learning and here we have seen a bit of the basics and watched the algorithms learn to play a relatively simple game. Achievements like AlphaGo were accomplished through even more complex methods and also using the brilliant idea of letting the agent play against itself to get better (self-play), which has played an important part in beating human level performance.

    + +

    There are other similar applications where things get more complex, for instance, the number of states itself could be massive and computing values is infeasible. There are many methods to deal with this and various other situations. A lot of the work done in RL is relatively recent and much research is still on-going into the possibilities of its application.

    + +

    There’s loads to explore (and exploit :p). Here are some resources to get you started:

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/pow-consensus-blockchain/index.html b/blog/pow-consensus-blockchain/index.html new file mode 100644 index 0000000..6a8df3e --- /dev/null +++ b/blog/pow-consensus-blockchain/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Disclaimer: This article is not an introduction to blockchain, it does try to cover some basics of blockchain, but it’s focus is more on the proof-of-work as an approach to solving consensus problem.

    + +

    Terminologies and breakdown

    + +

    The title of the article contains “consensus mechanisms in blockchain”, which sounds like a title with heavy words. So let’s try to first breakdown this title and understand each term separately.

    +
      +
    • Consensus : “Consensus” in simple terms means reaching an agreement amongst a set of parties about a specific thing like an event or a data value. Consensus is collaborative and cooperative in nature by the parties seeking agreement. So one word mapping, consensus = global agreement
    • +
    • A Consensus mechanism is an algorithm or approach through which a multi-party system can reach consensus/agreement.
    • +
    • Blockchain : Now coming to the system under discussion today which is blockchain. Blockchain has really been in a huge buzz for a long time and mostly because of its application in the implementation of the bitcoin network which as its creators call it “A peer to peer electronic cash network”. Blockchain as a piece of tech is being studied standalone now in a neutral manner to leverage its strengths that have been used in the bitcoin network. In simple terms blockchain is kind of chain of blocks or a ledger(of blocks) that can keep a record of transactions of any sort, whether it is financial transactions( bitcoin network being the example) or transactions about ownership of assets, documents or even storing the state of computer code(used in “programmable” blockchains like ethereum). This ledger allows us to keep a history of all the transactions that were carried out. In simple terms a blockchain = A ledger/chain of blocks that represent a set of transactions/events and thus record a history of all transactions.
    • +
    + +

    Distributed nature of blockchain

    +

    Now let’s take a step back, if this ledger were just any ledger that a person/computer system can keep a “local” copy of, then it is not very interesting, the real use of this ledger comes when it becomes “distributed” in nature, i.e, all the parties involved in recording the history of transactions/events participate in maintaining a shared global copy of the ledger that they all should agree to. Again when we say a global copy, there is no one copy uploaded on a centralized server to which each person reads and writes, but rather each party in the network holds one local copy that they try to keep in sync with the rest of the network and if majority of people have the same copy of ledger then we consider that most people are in “consensus” with the history of transactions/events or in other words most people have a common “global view” of the ledger. Maybe for now this seems a simple task, let’s explore the workings of such a distributed ledger system and what sort of problems it can encounter trying to reach the consensus about the state of ledger.

    + +

    Byzantine’s Generals and Consensus problem

    + +

    Byzantine's problem

    + +

    Let’s first setup a very simplified version of a problem called “Byzantine’s Generals Problem”. This is a classic problem modeled in computer networks and distributed systems. The problem is as follows:

    +
      +
    • There is a group of generals each commanding a portion of Byzantine’s army, encircling a city they are planning to attack. In simplest form the generals must decide upon either to “attack” or “retreat”.
    • +
    • The generals are separated by sizeable distance and hence can communicate only via some messengers.
    • +
    • Some of the generals have to send message to other generals about their view on “attack” or “retreat” and then all of them in the end have to agree somehow to either attack or retreat.
    • +
    • The attack can succeed only if a majority of generals attack at the same time. Else it has high chances of failure. Hence it is crucial to attain agreement on the issue.
    • +
    • This sets up a series of problem. This situation has an issue of trust and consensus. First problem,whatever information the messenger has given is it untampered or not. Second, also after receiving the information, whatever decision a general has made is it in agreement with all other or at least a majority of generals or not. How to know what is the global view of all the generals about attacking the city. The problem can be made complicated by having traitors in the system.
    • +
    + +
    + +

    The above problem can be modelled in the context of blockchain:

    +
      +
    • The generals map to the nodes in the blockchain’s network
    • +
    • The messengers map to the network of communication
    • +
    • The problem of agreeing to an attack strategy maps to the problem of having a consensus on the global state of transactions of the network.
    • +
    + +

    This problem can be solved in blockchain through various consensus mechanism of which we will focus on something called “proof-of-work”. +This consensus mechanism was first outlined in a paper by Satoshi Nakamoto(who is still not known) and in a list of emails in his conversations with his peers. +We will first look at what is involved in proof-of-work and then how it solves the consensus problem.

    + +

    Proof-of-work: The consensus machine behind blockchain

    +
      +
    • This is the meat of the article, so buckle up.
    • +
    • In a blockchain network, any transaction/event is broadcasted to all the nodes of the network.
    • +
    • The nodes take up these transactions. They form a block of data containing the transaction details, the hash of the previous block(parent) and have to add something called “nonce” and generate a hash value.
    • +
    • The difficult part is the hash value to be generated has to follow a certain pattern. In case of bitcoin blockchain, the hash should have specific number of leading zeroes in the value. More the number of leading zeroes more intensive the task is and less the zeroes less intensive it is. Thus they can adjust nonce value to find this hash.
    • +
    • The way to look for the right nonce is simply brute force which is a very computationally intensive task
    • +
    • A set of nodes that received the transaction start “mining” a block whose hash value will be accepted by the blockchain.
    • +
    • More the compute power higher is the chance of getting the work done. Hence if nodes form a pool and a majority of nodes start working on a block, they will get the required hash first. This shows that majority of people (sort of) stand behind that particular transaction and “agree” on it. Here we start seeing the beginnings of reaching agreement/consensus on the event that has occured.
    • +
    • But if multiple transcations take place at same time, any node can receive any transaction. The key here is whichever transcation is received by “majority” of nodes has a higher chance of forming a valid block first and is being agreed upon by a majority of nodes.
    • +
    • Thus in blockchain network, the nodes show their vote/agreement via the compute power. The more the compute power behind an event/transcation, more nodes agree on it.
    • +
    • But the next question is how is the local copy of the ledger that is formed by nodes update to be in sync with what the other nodes have.
    • +
    • Whenever a block is successfully mined, it is broadcasted to the network. The nodes who are honest have to accept this mined node after verifiying it and add it to their local copy. Thus this synchronizes the local ledger copies. Also if multiple blocks are broadcasted then the blocks that form a “larger chain” are to be accepted. This is also called the longest chain rule. The larger chain bascially shows that it has more compute power backing its formation, thus majority agreeing to it.
    • +
    • Now if we consider a set faulty nodes who are trying to introduce false blocks, then they need more compute power than rest of the network to form a longer chain by racing against the network. If majority of nodes are honest this is not possible.
    • +
    • Also if a faulty node tries to change the transcations before, they have to “re-mine” the blocks ahead since they are cryptographically linked by the hashes of previous blocks and the cost of re-mining is very large, it is next to impossible to change the order of events or even the events itself.
    • +
    • Thus blockchain network works by reaching a consensus on the set of events/transactions and the order of those events as well by the nodes casting their votes in terms of compute power. Here the nodes need not trust each other to agree, but just follow the rules of work and they can automatically reach a consensus.
    • +
    + +

    Conclusion and Ending remarks

    +

    Thus proof of work is a consensus mechanism where the nodes vote to back a transaction/record in the ledger by providing their compute power as a vote. The more the votes or “compute power” behind a particular copy of blockchain/ledger, means more parties “agree” on that particular ledger and history of transactions. Thus all the parties can always agree and trust the other nodes by possessing the longest proof-of-work chain and can know for sure that their copy is in sync with the common global view of the ledger.

    + +

    The proof-of-work chain is how different synchronization, distributed database +and global view problems can be solved.

    + +

    Blockchains can have other consensus mechanisms as well, like Proof-of-stake, Federated-Byzantine-Fault-Tolerance, Proof-of-activity and so on. But proof-of-work is the earliest of the mechanisms trying to solve the Byzantine Agreement and develop a Byzantine fault tolerant system. It certainly has drawbacks but is one of the most robust mechanisms and many mechanisms still draw the concepts from proof-of-work.

    +

    Proof of work outlined by Satoshi Nakamoto

    +
    +

    The proof-of-work chain is a solution to the Byzantine Generals’ Problem. I’ll +try to rephrase it in that context.

    + +

    A number of Byzantine Generals each have a computer and want to attack the +King’s wi-fi by brute forcing the password, which they’ve learned is a certain +number of characters in length. Once they stimulate the network to generate a +packet, they must crack the password within a limited time to break in and +erase the logs, otherwise they will be discovered and get in trouble. They +only have enough CPU power to crack it fast enough if a majority of them attack +at the same time.

    + +

    They don’t particularly care when the attack will be, just that they all agree. +It has been decided that anyone who feels like it will announce a time, and +whatever time is heard first will be the official attack time. The problem is +that the network is not instantaneous, and if two generals announce different +attack times at close to the same time, some may hear one first and others hear +the other first.

    + +

    They use a proof-of-work chain to solve the problem. Once each general +receives whatever attack time he hears first, he sets his computer to solve an +extremely difficult proof-of-work problem that includes the attack time in its +hash. The proof-of-work is so difficult, it’s expected to take 10 minutes of +them all working at once before one of them finds a solution. Once one of the +generals finds a proof-of-work, he broadcasts it to the network, and everyone +changes their current proof-of-work computation to include that proof-of-work +in the hash they’re working on. If anyone was working on a different attack +time, they switch to this one, because its proof-of-work chain is now longer.

    + +

    After two hours, one attack time should be hashed by a chain of 12 +proofs-of-work. Every general, just by verifying the difficulty of the +proof-of-work chain, can estimate how much parallel CPU power per hour was +expended on it and see that it must have required the majority of the computers +to produce that much proof-of-work in the allotted time. They had to all have +seen it because the proof-of-work is proof that they worked on it. If the CPU +power exhibited by the proof-of-work chain is sufficient to crack the password, +they can safely attack at the agreed time.

    + +

    The proof-of-work chain is how all the synchronisation, distributed database

    +
    + + +

    Here is the link to the mails that very exchanged between “satoshi nakamoto” and his peers discussing the idea of “bitcoin and blockchain”:

    + + +

    Here is the link to the original paper published:

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/prof-matching-envision/index.html b/blog/prof-matching-envision/index.html new file mode 100644 index 0000000..f5622d2 --- /dev/null +++ b/blog/prof-matching-envision/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Idea

    +

    Finding research/internship opportunity under a professor’s guidance is exceedingly difficult because the professors are very busy and students are not well aware of the professors who are ready to give internship opportunities. The professor has to shortlist the resumes and the student has to find out and send a resume to every professor offering a research opportunity. Obviously, this is a time consuming and tiresome process for both students and the professors.

    + +

    We came up with a idea which not only speeds up this process but also makes it hassle-free. The idea is to create a platform which comprises of students and professors and then, try to create a match from their preferences. The professor and student both login into this platform and set their preferences (for example professor sets his minimum cgpa as 8 while the student can set the cgpa he secured as 8.2). A recommender system works in the background which takes up each professor, one at a time and tries to create a match with the students in the platform. It then generates a list of students which match the criteria and the professor can just pick the students from the list.

    + +

    Implementation

    + +

    The front-end of the project comprises of an Android app and a Website. Android app is developed on Android Studio using libraries such as Volley and Gson and with Java as the primary language. The Web Frontend is built using the standard web technologies like HTML, CSS , JavaScript , libraries and Frameworks of JavaScript. Login and signup system is implemented using the OAuth standards via Google/Facebook.

    + +

    The back-end of project used python as a primary programming environment and Django framework. It uses MySQL database. The algorithm tries to create an overlap in the student profile and professor requirements and make a ranked list of recommended candidates.

    + +

    How did IEEE benefit us?

    + +

    IEEE envision project helped us to learn different programming languages and technologies. In the process we also learned how to use GitHub effectively. We also learned how to work as a team, how to devise a plan and how to go about developing such projects. Also, helped us in getting along with a better peer group with like minded people! Basically, IEEE mentors helped us whenever we had any problem, hence we could develop such a good platform even though we were first years’.

    + +

    Why should you take this up?

    + +

    Taking up this project in your first year is a good idea as it helps you in learning new stuff. It makes you do something productive. You would be learning so many new things while developing this project which makes it worth the time you spend on it. One will get to meet seniors and get to know about their project, hence a great exposure. Also… Club recruitments. :P

    + +

    Team

    +
      +
    • Prajwal S Belagavi
    • +
    • Vaibhav G
    • +
    • Ranjana K
    • +
    • Nisarg S. Joshi
    • +
    + +

    The Team +The Team

    + +

    Mentors

    +
      +
    • Mahim Agrawal
    • +
    • Ashwin Joisa
    • +
    • Praveen Gupta
    • +
    • Moksh Jain
    • +
    + +

    Images form the App

    + +

    Login Screen +Login Screen

    + +

    List of Students +List of students who match a Professor’s Criteria

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/promises-closures-and-potatoes/index.html b/blog/promises-closures-and-potatoes/index.html new file mode 100644 index 0000000..60a6e6f --- /dev/null +++ b/blog/promises-closures-and-potatoes/index.html @@ -0,0 +1,589 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Promises, Closures and Potatoes.

    + +

    Well this article is mainly about Promises and Closures, two concepts that +most of us don’t really care about in the beginning, but in reality, we have been +using it a lot. “Promises and Closures” wouldn’t sound cool so I thought of slightly innovative title.

    + +

    So what are promises?

    +

    They are not new, and they are pretty popular for a long time. +image1 +Promises gives you this feature of asynchronous nature in the code. It actually lets a third agent interact with your code: let’s take a small example. +Assume that we are doing a function getTextFromFile() which will take unpredictable time.

    +
        function getTextFromFile(fileEvent){
    +                var input = fileEvent.target;
    +
    +                var reader = new FileReader();
    +                reader.onload = function(){
    +                    var text = reader.result;
    +                    return text;
    +                };
    +                reader.onerror = function(){
    +                    console.log(Error(reader.error));
    +                }
    +                reader.readAsText(input.files[0])
    +            }
    +
    +

    This method would not let you really specify the actions to be done on file read externally. It just returns the text, and it could actually take unpredictable time, +such that the following snippet may not work the right way:

    +
        var myText = getTextFromFile(fileEvent);
    +    console.log(myText);
    +
    +

    The same applies for AJAX requests or any other asynchronous event. +So we have a much better way of dealing this: using a promise. +All promises need not be fulfilled, it could be resolved or it could be rejected. +It could take some time to resolve/reject a promise, and either way it would be settled :). +Let’s rewrite the getTextFromFile() :

    +
        function getTextFromFile(fileEvent){
    +        return new Promise(function(resolve,reject){
    +            var input = fileEvent.target;
    +            var reader = new FileReader();
    +            reader.onload = function(){
    +                resolve(reader.result);
    +            };
    +            reader.onerror = function(){
    +                reject(Error(reader.error));
    +            }
    +            reader.readAsText(input.files[0])
    +        });
    +    }
    +
    +

    now we can use this function to handle file read much better way:

    +
        getTextFromFile(fileEvent).then(function(text){
    +        // yaay! I did it!
    +        console.log(text);
    +    }).catch(function(error){
    +        // oops! something went wrong.
    +        console.log(error);
    +    })
    +
    +

    So you have the anonymous functions in .then and .catch to work asychronously, ie they will wait for the promise to resolve/reject. +Promises are much more flexible, and they could be chained.

    +
        function middleGuy(text){
    +        return new Promise(function(resolve){
    +            console.log("Hello from the middle guy!");
    +            // just to show that this could be done.
    +            resolve(text);
    +        });
    +    }
    +
    +

    and boom! we can do this:

    +
        getTextFromFile(fileEvent)
    +        .then(middleGuy)
    +        .then(function(text){
    +            // yaay! I did it!
    +            console.log(text);
    +        }).catch(function(error){
    +            // oops! something went wrong.
    +            console.log(error);
    +        });
    +
    +

    This is a simple demo of promises with the above code.

    + +

    There are plenty of resources out there for Promises, +and my favourite ones are:

    + + +

    Closures

    + +

    Closures were this one tricky thing in the beginning for me, and quoting Rohit Varkey, batch of ‘16,

    +
    +

    It (closures) guarantees you no side effects. Plus this way you have everything you need that is used in the function wrapped along with it. No ugly global changes that could ** everything up. This leads to interesting things like lazy evaluation, loop fusion and even easier process migration.

    +
    + +

    This was about closures in a general perspective, but from the view of a js developer like me, this offers a scope that persists just for my function. +An example would be, (from w3Schools)

    +
        var add = (function () {
    +        var counter = 0;
    +        return function () {
    +            return counter += 1;
    +            }
    +    })();
    +
    +    add(); // prints 1
    +    add(); // prints 2
    +    add(); // prints 3
    +    // counter is not accessible here.
    +
    + +

    a good set of resources would be:

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/pslv-to-mars/index.html b/blog/pslv-to-mars/index.html new file mode 100644 index 0000000..c1598aa --- /dev/null +++ b/blog/pslv-to-mars/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    PSLV to Mars

    +

    (Mars Orbiter Mission)

    +

    Marking the series of events in the world history, November 5,2013 is recognized to be a day of great significance all over the world. On this day, ISRO launched MOM(Mars Orbiter Mission) also called Mangalyaan,a space probe orbiting Mars since September 24,2014.This made India the first Asian nation to reach Martian Orbit and the first nation in the world to do so in its first attempt.The launch took place from Satish Dhawan Space centre in Sriharikota.Indian scientists in ISRO proposed to launch the Mars satellite using PSLV(Polar Satellite Launch Vehicle) rocket. First, they thought to launch MOM with GSLV but it failed twice in 2010 and was continuing to experience issues with cryogenic engine.It was planned to launch MOM when Mars is closest to the Earth which happens once in about 26 months.Only few months were left to launch and in such a short time they couldn’t make a new rocket for MOM launch.They decided to launch MOM using PSLV-XL C-25 rocket knowing that it has low fuel capacity.

    + +

    Mars Orbiter Mission Spacecraft

    + +

    Challenges involved :

    +
      +
    • The PSLV has low load and fuel capacity which was insufficient to reach Mars. So they had to reduce the fuel and overall weight.
    • +
    • To overcome earth’s gravitational force to move satellite away from earth’s orbit.
    • +
    • To cover a large distance with less fuel. +

      Objectives:

      +
    • +
    • To develop technologies required for design,Mars orbit insertion and on orbit phase around Mars.
    • +
    • Deep space communication and navigation.
    • +
    • Incorporate autonomous features to handle contingency situations. +The total load was of 1350 kg including 850 kg of fuel. The satellite weighed 15 kg with 5 instruments to study Martian surface, morphology, mineralogy and Martian atmosphere. One of the instrument used was Methane detector since specific research of methane could tell the possibility and past existence life on Mars. +

      Trajectory

      +

      There were three phases involved:

      +
      1)Geo centric phase
      +

      The basic idea was based on Hohmann Transfer Orbit, a minimum energy transfer orbit. Since PSLV couldn’t take the satellite all the way but could leave satellite in earth’s orbit easily. When satellite reached the perigee, they fired the satellite engine with a little fuel then switched off the engine.The firing force increased the speed of the satellite and propelled it further away from the Earth into a higher orbit.When it came back at perigee, they kept doing the same and at last when the satellite was at perigee again, the speed of the satellite was so much that a final strong firing force threw it out of the Earth’s gravitational sphere.

      +
      2)Helio centric phase
      +

      The satellite left the Earth’s orbit tangentially and met Mars tangentially to its orbit.

      +
      3)Martian phase
      +

      The satellite arrived at the Mars sphere of influence in a hyperbolic trajectory and finally captured into planned orbit around Mars on September 24,2014.

      +
    • +
    + +

    Mars Orbiter Mission Profile

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/public-key-cryptography/index.html b/blog/public-key-cryptography/index.html new file mode 100644 index 0000000..c499dbd --- /dev/null +++ b/blog/public-key-cryptography/index.html @@ -0,0 +1,546 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The inherent need for human beings has always been to communicate and share information,albeit selectively. For this purpose, the information is to be coded in such a way that it can be deciphered only by the recipient, regardless of whether the recipient is right next to the sender or on the other side of the world. The communication channel is assumed to be plagued with adversaries..These adversaries have access to this coded information and are constantly trying to pry.So, the basic problem has always been to: +transfer secure information over such insecure channels.

    + +

    So, how DO you communicate when everyone is an adversary and nobody is trustworthy? +The answer is simple.

    + +

    Cryptography

    + +
    +

    “Cryptography is the art and science of making a crypto system that is capable of providing information security.”

    +
    + +

    The primary objective of cryptography is to provide basic security services like data integrity, confidentiality, user-authenticity and non-repudiation.

    + +

    Crypto-systems

    + +

    Given below is a simple model of a crypto-system

    + +

    Crypto-system

    + +

    There are two types of crypto-systems,based on how the encryption is carried out.

    + +

    1.Symmetric key encryption

    + +

    Here, a single key is used for both encryption and decryption of the messages and such a key is established in advance by both the sender and the recipient.Thus,there has to exist “trust” between both sender and receiver, so as to not divulge the key.This was the most common method of encryption before the 1970’s.

    + +

    Symmetric key

    + +

    Suppose Alex wants to send a message to Carl using symmetric key encryption , then both of them will have to agree upon a key beforehand and use it to encrypt and decrypt the messages.

    + +

    2. Asymmetric key encryption/Public Key Cryptography

    + +

    Here, two different keys are used for both encryption and decryption purposes and there exists some mathematical relation between the keys and thus decryption is possible.One of them is the private key and the other one is the public key.It is assumed that the private key is kept secret by a particular individual.

    + +

    An individual(recipient) makes one of his keys public.A sender can encrypt a message with the help of this public key and such an encrypted message is transmitted over the insecure channel. Only the recipient can decrypt this message with the help of his private key, since he alone possesses it. This is clearly a more elegant solution than symmetric key encryption, that relies on “trust”.

    + +

    Asymmetric key

    + +

    The crux of this system is to ensure that it is computationally infeasible to deduce the private key from the public key and the encrypted message.Obviously, it is important to ensure that the public key actually belongs to the recipient. This is usually accomplished with the help of a trusted third party, that hands out digital certificates.These parties are called Certificate Authorities(CA’s).The public key is usually huge and is stored on such digital certificates whereas, the private key is stored on the system itself.

    + +

    Also with public-key encryption systems, authenticity of digital systems or documents can also be ascertained with the help of Digital signatures. The content is signed with an individual’s private key , and since the public key is easily available, the identity of the user is easily verified.

    + +

    Suppose Alex sends a message(Using Carl’s public key) and a digitally signed document to Carl, using a public-key encryption system, these are the advantages,in a nutshell:

    + +

    1. It is possible to ascertain Alex’s identity from his public key and digital signature on the document.

    + +

    2. Only Alex could have signed the document,since he alone possesses the private key. Therefore it is not plausible for him to deny sending it.

    + +

    3. Only Carl possesses the private key for decrypting the message. He,alone can decrypt the message.

    + +

    4. When the signature is verified by Carl, it checks that the contents of the document or message match what was in there when the signature was applied. Thus, integrity of the data is preserved.

    + +

    The SSL Protocol

    + +

    One of the major applications of public key cryptography is it’s use in Secure Sockets Layer(SSL) protocol to ensure secure transactions between web browsers and servers.The protocol uses a CA to identify one or both end of the transactions.This,in short, is how it works:

    + +

    1. A browser requests a secure page (usually https://).

    + +

    2. The web server sends its public key with its certificate.

    + +

    3. The browser checks that the certificate was issued by a trusted party (usually a trusted root CA), that the certificate is still valid and that the certificate is related to the site contacted.

    + +

    4. The browser then uses the public key, to encrypt a random symmetric encryption key and sends it to the server with the encrypted URL required as well as other encrypted http data.

    + +

    5. The web server decrypts the symmetric encryption key using its private key and uses the symmetric key to decrypt the URL and htp data.

    + +

    6. The web server sends back the requested html document and http data encrypted with the symmetric key.

    + +

    7. The browser decrypts the http data and html document using the symmetric key and displays the information.

    + +

    Thus, as long as the CA is trustworthy, it is possible for the web browsers and servers to communicate securely and that is how all the information that is continuously exchanged on the internet stays safe and secure.

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/qemu-virtualization/index.html b/blog/qemu-virtualization/index.html new file mode 100644 index 0000000..870a3cd --- /dev/null +++ b/blog/qemu-virtualization/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A “virtual machine” or “VM” is a virtual computer system. It is a tightly isolated software container with an operating system and application inside. Putting multiple VMs on a single computer enables several operating systems and applications to run on just one physical server, or “host.”

    + +

    A thin layer of software called a “hypervisor” decouples the virtual machines from the host and dynamically allocates computing resources to each virtual machine as needed.

    + +

    Introduction

    +

    QEMU and KVM

    +

    QEMU or Quick Emulator is an open-source machine emulator and virtualizer. It can be used for full-system emulation, user-mode emulation as well as virtualization. We’ll be using the full-system emulation capabilities here.

    + +

    KVM or Kernel-based Virtual Machine on the other hand is a virtualization infrastructure which turns Linux into a hypervisor. It is part of the Linux kernel mainline since 2007. KVM when activated along with Qemu, speeds up the emulation several times.

    + +

    Virtualization architecture showing QEMU sitting between the Guest OS and KVM

    + +

    To demonstrate QEMU’s capabilities we’ll create a Debian VM (for potential use as a SSH server)

    + +

    Setting up the environment

    +

    Installing QEMU

    +

    QEMU is available as a PPA for Ubuntu, which can be downloaded using

    +
    $ sudo apt-get install qemu
    +
    +

    QEMU isn’t one single program, rather it is a large set of tools and utilities each of which serve a different purposes.

    + +

    Downloading the iso image

    +

    We need a Debian installation image before we can get started with QEMU. A simple wget command can download the image from the Debian’s online repositories.

    +
    $ wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.2.1-amd64-netinst.iso
    +
    + +

    Creating a virtual hard-disk

    +

    The first step in creating the VM is to create storage space to install the operating system on. We’ll create something called a virtual hard drive (VHD). A virtual hard drive is a hard drive image with its own partition table, onto which operating systems can be installed. We can create one using the qemu-img utility which comes bundled with QEMU.

    +
    $ qemu-img create -f qcow2 debian.qcow2 6G
    +
    +

    The command takes the location and size of the VHD as arguments. The -f option specifies the format for the disk-image as qcow2 - QEMU’s proprietary format - and the last argument is for the size of the disk to be created.

    + +

    Installing the ISO and Booting Up VM

    +

    Installation

    +

    To install the Debian iso image onto the virtual hard-drive we just created, we can use the QEMU utility for x86_64 emulation. QEMU provides a variety of commands as qemu-system-{system-architecture} for use with different architectures. We’re here emulating a 64-bit machine and hence make use of the qemu-system-x86_64 command.

    +
    $ qemu-system-x86_64 -enable-kvm -hda debian.qcow2 -cdrom ../Downloads/debian-9.1.0-amd64-netinst.iso -net user -net nic -m 4G -boot d 
    +
    +

    The command takes as input options - most of which are self-explanatory - and boots up the machine from the iso image mounted as a CD drive. From here on the time taken to install depends on the amount of ram allocated and whether the iso needs to download any packages.

    + +

    Once the install is complete, QEMU reboots automatically. We can then close the window and go back to the terminal.

    + +

    Booting up

    +

    Now to boot up the virtual machine, we use

    +
    $ qemu-system-x86_64 -enable-kvm -hda debian.qcow2 -boot c -net user -net nic -m 2G
    +
    +

    The -boot c option lets the machine boot up from the hard-drive image.

    + +

    QEMU also gives us a cool amount of options to tweak our machine to our liking.

    +

    Options in QEMU

    +

    Using SSH to login to the machine

    +

    One way to use the machine in headless mode is to SSH into it using a terminal on our host. For this we need to add -redir tcp:5022::22 to our machine startup command. What this does is that it redirects the port 22 of our guest machine into port 5022 of our host. Thus letting us use the machine via SSH. Another option which comes in use is -display none which tells QEMU not to open up an emulator window, since we don’t need it if we are logging into the machine using SSH. Now, to login using SSH, the usual procedure can be followed on the host machine.

    +
    $ ssh -p 5022 <user>@<hostname>
    +$ <user>@<hostname>'s password:
    +
    +

    Where user and hostname are the username and hostname for the machine we created.

    + +

    To power the machine down, we need to login as root using root’s password, and then type in into the terminal

    +
    # poweroff
    +
    + +

    Sharing Files Between Host and Guest

    +

    Viewing host’s files on the guest is one problem that arises quite often while using virtual machines. QEMU solves this by providing an in-built Samba file server. +It can be started by adding -smb {shared directory path} to the command for starting the VM. On the guest machine, smbclient needs to be installed in order to access the shared folders. On the guest machine run,

    +
    $ apt-get install smbclient
    +$ smbclient //10.0.2.4/qemu/
    +$ Enter user's password:
    +
    +

    Now we can browse the shared directory. If we need to share files, we can copy them into the shared directory on the host, and then access them through the guest, using smbcleint.

    + +

    Emulating specific CPUs

    +

    While being used for system emulation QEMU can emulate specific CPUs as well. This can be achieved by using the -cpu option. To bring up a list of CPUs QEMU can emulate, use -cpu ?. And then use that CPUs name in the command. Here I emulated an Intel i7.

    +
    $ qemu-system-x86_64 -m 4G -hda debian.qcow2 -enable-kvm -cpu Nehalem -net nic -net user -redir tcp:5022::22 -redir tcp:9080::80 -smb ~/c-prog
    +
    +

    This can come in especially useful when using the virtual machines for cross-compiling for a specific architecture.

    + +

    Preventing Cursor Capture

    +

    Cursor capture happens when the guest machine prevents the cursor from being used on the host, i.e. the cursor becomes local to the guest machine. To release the cursor, we need to press Alt + Ctrl. Having to do this can be annoying at times. So, we can prevent the cursor from being captured by using the -show-cursor option. This works well when used along with the -enable-kvm option being enables. +Enabling KVM speeds up emulation, and hence leads to a lower chance of the cursor being captured. Whereas -show-cursor ensures that the cursor is shown at all times, even if the guest machine doesn’t have a GUI.

    + +

    Conclusion

    +

    We’ve just created a simple VM running Debian. I aim to use it as an isolated environment for programming, and maybe learning a few networking concepts while I’m at it. Qemu is also available on Windows so this VM can be accessed from Windows as well, providing a consistent programming environment regardless of which host OS it’s run on top of. Another interesting use case for QEMU VMs is to build updated Linux images, download and install packages and install an operating system on a SD card for raspberry pi or other such embedded boards so that you can directly get to working on the board without having to worry about network issues and having to connect to a monitor.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/quantum-computers/index.html b/blog/quantum-computers/index.html new file mode 100644 index 0000000..14bb874 --- /dev/null +++ b/blog/quantum-computers/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Background:

    + +

    Quantum Mechanics a realm of physics where the tiny subatomic particles reside and whose physics is beyond the perception of the classical physical world.

    + +

    1] What makes this realm so weird and different in working?

    + +

    The behaviour working of these particles was resolved by proposing of a mathematical model governed by the principle of Superposition, entanglement and tunnelling.

    + +

    Quantum Computers makes use of these physical phenomena to do it calculation and this is where the speciality of the futuristic computing machines lies.

    + +

    quantum computer +The first ever made quantum computer

    + +

    Breaking The Myth of Superposition Theorem

    + +

    Before dwelling into the topic, I would like to make one thing clear the superposition as taught by many is not a particle being at different position at a given time but it is the probability of the particle wave density being distributed at different positions in space time but does exists at only one found position at that given time.

    + +

    Qubits

    + +

    A quantum computer maintains a sequence of qubits. A single qubit can represent a one, a zero, or any quantum superposition of those two qubit states a pair of qubits can be in any quantum superposition of 4 states, and three qubits in any superposition of 8 states. In general, a quantum computer with N qubits can be in an arbitrary superposition of up to 2^N{\displaystyle 2^{n}}different states simultaneously.

    + +

    The qubits can be made of quantities which obey the principles of Quantum Mechanics i.e. an electron spin or a proton spin can be considered as qubits where spin up represents a 0 state and spin down represents a 1 state or they can also be represented using polarised light meeting its applicability.

    + +

    qubits

    + +

    What Makes Quantum Computers so Special?!

    + +

    The ability of these machines to perform tasks in seconds or minutes that would require years and years or wait!! Sometimes impossible to perform with even the so called present day super computers makes them special.

    + +

    Speed Of Quantum Computers And Shor’s Algorithm

    + +

    The enhanced speed of quantum computers in relative to the classical computers is the way that the problems are being solved i.e. using the basic laws that govern the realm of Quantum Mechanics.

    + +

    I will try and give an analogy for the methods.

    + +

    1} The Football Analogy For Shor’s methods

    + +

    Suppose say we need to calculate the height from which a soccer player needs to kick the ball with certain force at a fixed distance from the goal, so that he scores a goal.

    + +

    What Would Our Classical Computer Basically Do?

    + +

    It takes in the specified value of the force applied at specific angle and the distance from the goal. Each time the ball is placed at different values of height and checks whether it would reach the goal or not. So, say there are heights from 0-500 and assuming it does calculations only for integers (just to simplify), computing needs to be done for 500 cases and the sample out the right one to give the output, that means it takes 500 steps to complete the task give.

    + +

    What Would Our Quantum Computers Do?

    + +

    Say the same initial condition are given to the quantum computers, because of its speciality of handling properties like superposition, it would distribute the probability of football being at various places from 0-500 simultaneously and checks whether it would reach the goal or not and give the output in just one step.

    + +

    This is a simple case consideration, what if have 100000000 positions to check our classical computers would take a back seat, this is where the computational difference.

    + +

    2} The Maze Analogy Grover’s Algorithm

    + +

    Consider a problem at hand is say the computer needs to find the way out

    + +

    What Would Classical Computers Do?

    + +

    Present computer puts a person or any object at the centre and tries all different ways to come out of the maze until it finds the right path out, so it need to run these steps several times.

    + +

    What Would Our Quantum Computers Do?

    + +

    The quantum computers would work on superposition it would consider the object as if its probability density is spread all over the 3D space and it would consider them as different state probabilities and send it different path to check whether that (ball) object would reach out or not, in this case the computation would also involve the property of entanglement and tunnelling to determine the final out put in a single step.

    + +

    maze

    + +

    A] Shor’s algorithm - exponential speedup of factoring – Depends on fast quantum technique for finding the period of a periodic function

    + +

    B] Grover’s algorithm – quadratic speedup of search – works by gradually focusing an initially uniform superposition over all candidates into one concentrated on the designated element. Speedup arises from the fact that a linear growth of the amplitude of the desired element in the superposition causes a quadratic growth in the element’s probability.

    + +

    encryption

    + +

    Encryption : Is Quantum Computing A Threat To Encryption

    + +

    Encryption is the conversion of electronic data into another form, called ciphertext, which cannot be easily understood by anyone except authorized parties.

    + +

    When Encryption Meets Quantum Computation

    + +

    Communication security today is almost universally ensured by the use of RSA encryption. This method relies on the inaccessibility of large prime factors of a large composite number. The problem is an artificial one: The encrypter takes two (or more) large primes and multiplies them. The decrypter tries to work backwards from the product to the factors. It is hard work. The largest number factored so far RSA-640 had 193 decimal digits and took approximately 30 2.2GHz-Opteron-CPU years, over five months of calendar time. At that rate a 1024-bit number, the size currently recommended by a commercial, would take many years bit is short for binary digit each additional bit contributes a factor of 2 to the size of the calculation). The site adds For more security or if you are paranoid, use 2048 or even 4096 bits.

    + +

    A quantum computer of suitable size could factor these large numbers in a much shorter time. For a 1024-bit number, Shor’s Algorithm requires on the order of 1024 cube, about one billion, operations. I do not have any information on how quickly quantum operations can be executed, but if each one took one second our factorization would last 34 years. If a quantum computer could run at the speed of todays electronic computers (100 million instructions per second and up) then factorization of the 1024-bit number would be a matter of seconds.

    + +

    The most interesting quantum algorithm as far as cryptography is concerned is Shor’s algorithm, called “one of the major scientific achievements of the late 20th century” by renowned complexity theorist Scott Aaronson.

    + +

    Shor’s algorithm brings an exponential speed-up for solving the factoring, discrete logarithm (DLP) and elliptic-curve discrete logarithm (ECDLP) problems that are widely used in cryptographic applications. Be it TLS, SSH or IPSec, most secure communication protocols rely one way or another on Diffie-Hellman key agreements (which rely on DLP or ECDLP’s hardness), on digital signatures (DSA, ECDSA, or RSA-PSS signatures), or on public-key encryption (ElGamal, RSA-OAEP). Shor’s algorithm thus potentially breaks all these algorithms and with them all the public-key cryptography mechanisms deployed on the Internet.

    + +

    So is our today’s information at threat!

    + +

    For now, it would be a yes as present encryption techniques are vulnerable to the unmatched speed of quantum computers.!!!!

    + +

    Quantum For A Quantum

    + +

    Of course, the threat isn’t there yet. More importantly, people are beginning to pay attention, including the NSA. The threat to encryption posed by quantum computing isn’t unsolvable. The same mechanism that makes it vulnerable can also turn it “quantum computing-proof” so to speak.

    + +

    There is such a thing as quantum cryptography, which uses photon-based qubits to securely transmit information encoded into the quantum states of particles. This quantum communication makes it possible for the recipient to detect attempts to intercept incoming messages. And it isn’t exactly new.

    + +

    Its applications include what’s called the quantum key distribution(QKD). Basically, it uses quantum communication to share keys securely, which will be used to decrypt messages sent over conventional networks. Unfortunately, low bandwidth makes the system currently untenable, despite having been demonstrated to work in several cities.

    + +

    This is just one possible work around. Other methods are being developed, including code-based cryptography and lattice-based cryptography. In any case, there’s time to improve it. In the same way that quantum computing is still being refined, network infrastructure can be improved to allow for quantum secure cryptography.

    + +

    cryptography

    + +

    For The Interested Ones (Resources)

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/quantum-supremacy/index.html b/blog/quantum-supremacy/index.html new file mode 100644 index 0000000..3085b4b --- /dev/null +++ b/blog/quantum-supremacy/index.html @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The term “quantum computer” has been buzzing around in recent years. But what is a quantum computer? Have they been built? How are they different from a classical computer? What kind of problems do they solve? Do I need to be an expert in physics to understand them?(Not really!). These may be some of the questions arising in your mind when you hear someone say “quantum computer”. In this article, I will address these questions by giving a basic understanding of quantum computer and what makes it so special.

    + +

    Fundamentals

    + +

    All the electronic devices that we use in our daily lives are classical. They work on streams of classical bits. These classical bits are represented mathematically in binary digits, 0 and 1. The basic building blocks of a quantum computer, however, is something known as a qubit. A classical bit is either 0 or it is 1, it cannot be both at the same time. But a qubit can be in states 0 and 1 simultaneously. This property of being in multiple states simultaneously is called superposition.

    + +

    Difference between classical bit and qubit ([image credit](http://qoqms.phys.strath.ac.uk/research_qc.html))

    + +

    In a classical computer, a bit is represented physically as two distinct states of a system. It could be two distinct levels of voltage or current, two stable states of a flip-flop, two directions of magnetizations, etc. A qubit can also be represented physically. Qubit is not just a theoretical concept. Some of the physical realizations of a qubit are using polarization of photon and electron spin, there are many more ways. In fact each quantum computer that is being built today uses a different type of physical representation.

    + +

    The process of finding out the value of a bit is called measurement of the bit. Classical measurement is very obvious, you simply find out the value of the bit. If the bit turns out to be 0 then you know that it is 0 for sure, if it is 1 then you know that it is 1 for sure. There is no problem with classical measurement. However, this is not the case with qubit measurement. Measuring a qubit forces the qubit to take the state of 0 or 1, but not both. Hence the superposition is lost once a qubit is measured. Upon measuring, the qubit is said to have “collapsed” to either state 0 or 1. If you measure this same qubit for the second time it gives the same result as first measurement. You can say that measurement process has converted the qubit to a classical bit. There is something even more interesting. A qubit in superpostion has some probabilities of being in state 0 or 1. When this qubit is measured it collapses to 0 or 1 based on these probabilities. The only way of finding these probabilities is to measure infinite copies of the same qubit and counting how many times it gives 0 and 1. To better understand measurement, think about a coin toss as analogy. When the coin is in air, it is in superposition of two states – head and tail. Probability of getting head or tail depends on the inherent property of the coin. Here, a coin is said to be “measured” when it falls flat and shows either head or tail. “Superposition” of the coin is lost when it is “measured”.

    + +

    Measurement of qubit ([image credit](https://www.clerro.com/mobile/guide/580/quantum-computing-explained))

    + +

    What makes it special

    + +

    Parallelism:

    +

    Lets go beyond a single qubit to multiple qubits. If there are two qubits then there are four states (00, 01, 10, 11) in superposition. So a two qubit state can represent all possible 2-bit states (which are 4 in number). A 100 qubit state can represent all possible 100-bit states, which is 2100 states, at once. That is a very very very huge number! A quantum computer can parallelly compute all these states. It is this power of parallel computation that greatly sets it apart from a classical computer. Parallel computation in classical computers requires that number of hardware components be in the order of (N). While for quantum computers, the number of qubits required is of order (log(N)).

    + +

    This property of parallelism can be used to solve problems that classical computers cannot solve. For example, the problem of finding factors of an integer is a hard problem. Currently, there exists no classical algorithm that can solve the factorization problem in polynomial time. 1994, a mathematician named Peter Shor devised a quantum algorithm to solve the factorization problem in polynomial time (polynomial in log N, which is the size of the input). This algorithm is called Shor’s algorithm. Another problem is the search problem – search for an element among N elements. The best classical algorithm has complexity - order of N. However, there exists a quantum algorithm named Grover’s algorithm which can solve the search problem in order of N.

    + +

    Cryptography

    +

    Quantum computers play an important in cryptography. The security of existing cryptographic algorithms depend on the hardness of problems like integer factorization and discrete-log problem. But quantum computers can solve these problems in polynomial time and hence can break systems like RSA encryption, Diffie-Hellman key exchange protocol easily. This is scary! However, on the brighter side, quantum computers open up a new area of cryptography where private keys can be exchanged with perfect secrecy. Using the property of superposition, it is easy to generate truely random keys and it is also possible to send these keys across a public channel with perfect secrecy. Perfect secrecy is the ultimate goal of cryptography which can be fulfilled by a quantum computer.

    + +

    Simulations

    +

    The most important advantage of a quantum computer is that it can be used to simulate quantum mechanical experiments. No classical computer can simulate these experiments with 100% accuracy. Remember, the whole world is quantum, not classical! Hence quantum computers will help in the progress of scientific research and greater understanding of our universe.

    + +

    Challenges

    + +

    Building a quantum computer is certainly not easy. The field of quantum computation is still in its infancy, just like how classical computers were a few decades ago. There are many challenges to overcome before one can build a true quantum computer that can be made available for general use. Quantum computers are extremely sensitive to the environment. This is because interaction with the environment causes the state of qubits to collapse. Isolating quantum computers is a very difficult engineering problem. Just like classical gates, there are quantum gates. The implementation of these quantum gates physically are likely to cause errors. The registers storing qubits may have already been affected by the environment before the computation even begins. Also greater the number of qubits in quantum computer, greater is the “noise” present in it, which leads to incorrect computations.

    + +

    We take copying data for granted in classical computer. However, in quantum computation copying unknown data is not possible. In fact there is a theorem to prove it called no-cloning theorem. So any specific unknown state cannot be determined. This means that unless the state is specifically created, we have limited ability to control it.

    + +

    Race for supremacy

    + +

    Humans have never given up when it comes to overcoming challenges. This applies to quantum computation as well. Extremely great computation power to solve unsolved problems is the driving motivation for ongoing research and engineering in this field. Hence there is lot of competition among companies to build a quantum computer that surpasses the computation capabilities of classical computers. This potential ability of a quantum computer to solve problems that classical computers cannot solve is called quantum supremacy. The term “quantum supremacy” was coined by John Preskill, a theoretical physicist at the California Institute of Technology.

    + +

    Companies like IBM, D-Wave, Google, Intel, Microsoft are the major players in this field now. D-Wave is the first company to sell quantum computers commercially. In January 2017, D-Wave released a 2048-bit quantum computer named D-Wave 2000Q. But this is not a true quantum computer. “The Holy Grail of quantum computing to build a ‘universal’ quantum computer—one that can solve any computational problem—but at a vastly higher speed that today’s computers,” Hilton told EE Times. “That’s the reason some people say we don’t have a ‘real’ quantum computer—because D-Wave’s is not a ‘universal’ computer.”

    + +

    Google's Bristlecone ([image credit](https://ai.googleblog.com/2018/03/a-preview-of-bristlecone-googles-new.html))

    + +

    Google has been claiming recently that it would achieve quantum supremacy in the near future. Google’s latest quantum processing chip with 72 qubits, called Bristlecone, has been predicted to achieve quantum supremacy. There are still a lot of tests to be conducted though, to claim this achievement. IBM has also been investing a lot in building a universal quantum computer and boasts of a 50 qubit processor. IBM has created an online platform, named IBM Q Experience, which allows access to their 5-bit quantum computer for free and 16-qubit computer for some cost. They have good documentation to help you get started with using them.

    + +

    But should quantum supremacy be the main objective of building a quantum computer. Does the concept of quantum supremacy make sense? +“You’ll struggle to find any [researcher] who likes the term ‘quantum supremacy,’” says Simon Benjamin, a quantum expert at Oxford University. “It’s very catchy, but it’s a bit confusing and oversells what quantum computers will be able to do.” +“I don’t believe that quantum supremacy represents a magical milestone that we will reach and declare victory,” says theorist Jay Gambetta at IBM. “I see these ‘supremacy’ experiments more as a set of benchmarking experiments to help develop quantum devices.” +Some researchers have suggested that there should be focus on “quantum advantage” instead. Quantum advantage refers to the specific tasks that only quantum computers can do. Other terms used for this are “quantum ascendancy” and “quantum inimitability”. +Even John Preskill, who coined the term “quantum supremacy” published a paper in January 2018 published a paper in which he said quantum computing was about to enter a phase he called NISQ, or “noisy intermediate stage quantum,” where machines will have 50 to a few hundred qubits. “‘Noisy,’” he wrote, “means that we’ll have imperfect control over those qubits; the noise will place serious limitations on what quantum devices can achieve in the near term.” Preskill said he’s still convinced quantum computers will have a transformative effect on society, but that transformation, he concedes, “may still be decades away.”

    + +

    Resources

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/random-number-generator/index.html b/blog/random-number-generator/index.html new file mode 100644 index 0000000..d83e853 --- /dev/null +++ b/blog/random-number-generator/index.html @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Random numbers have been used for many thousands of years. +Roll a dice. +Flip a coin. +Pick a card from a deck. +Whatever the result may be in these three situations, it’s completely random each time and there’s no way of predicting it by looking at the previous outcomes. +In other words, the end result is left to random chance.

    + +

    Dice

    + +

    Random number generators in a computer are similar: they’re an attempt to achieve an unpredictable, random result. +From creating random keys for data encryption to random shuffling cards in a poker website, generation of random numbers is vital.

    + +

    Gambling

    + +

    Now, to generate random numbers we might use the traditional import random (python), randn (MATLAB) and other packages and functions in other platforms.
    +And what do they do? They present to us a randomly picked number. +Simple. +But have you ever pondered how the computer picks that particular number?

    + +

    We all know that a computer is good at following instructions. +It cannot create, or think for itself (until fully functioning Artificial Intelligence becomes a reality). +If a computer is asked to pick a random number it won’t be able to do so, until and unless it’s told how to do it and this way, the true purpose of randomness is lost.

    + +

    Moment of Truth: Majority of the random number generators used by computers are not truly random. +The number generated is usually a result of an algorithm.

    + +

    The random numbers generated by such a way are termed pseudo-random i.e it appears random but is actually just a predetermined sequence of numbers. +The sequence is determined by an initial value known as seed. +The Lehmer’s Random Number Generation algorithm is one such example of pseudo random generation.

    + +

    What defines randomness is uncertainty. +One can never know what will happen next. +By using algorithms to generate random numbers this property is lost. +Anyone who gets hold of the algorithm can easily figure out the number.

    + +

    If random numbers are really generated by a deterministic algorithm, how on earth can we use it for applications as important as cryptography?

    + +

    In order to generate numbers that are truly random, computers must find a seed that is truly random. +This is done by measuring a physical occurrence, or reaction, which happens naturally at random.

    + +

    Most secure random number generators have an entropy gathering service continously running on a machine. +Its job is to harvest entropy from multiple sources over time. +In other words, it gathers random information from the environment, stores this information, and then returns it when asked to generate a random number. +For example, the computer can measure white noise, or can measure the timing of various events like keystrokes and packet arrivals, and combine these in a theoretically valid way to generate numbers randomly.

    + +

    Comic

    + +

    At the end of the day, randomness isn’t limited to securing information and gambling. +It’s so much more. +Look around you. +The electronic noise in our devices is random. +Radioactive Decay is random. +The world is governed by chance. +Randomness stalks us every day of our lives.Its what keeps us curious, intrigued and excited all along the way!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/raspberry-pi-bluetooth/index.html b/blog/raspberry-pi-bluetooth/index.html new file mode 100644 index 0000000..d36b083 --- /dev/null +++ b/blog/raspberry-pi-bluetooth/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    At first, I thought I would write about the wonder creation of yesteryear-Bluetooth. Give you a little insight into how it works, the various layers of Bluetooth, it’s profiles and so on.

    + +

    But I guess Wikipedia would do a much better job at it. So, I decided to share something I learned during my internship- how we can make use of the inbuilt Bluetooth controller in Raspberry Pi 3 to implement some of the profiles of Bluetooth.

    + +

    First, you need to know that Raspberry Pi is nothing but a Linux machine and can be governed by some commands that you can type in the terminal. Also, there will be a repository associated with each Raspbian version (Raspbian is an OS), from which you can download software packages and perform various tasks on your Pi.

    + +

    Second, though the latest model of Raspberry Pi, the 3B model, is equipped with an inbuilt bluetooth controller, you need to carry out some steps to enable it. The most widely used package to carry this out is bluez.

    + +

    With a sudo apt-get install bluez command, you can install it in your Pi.

    + +

    There is another package called bluetooth which also needs to be installed and then you are good to go. This offers a tool called bluetoothctl and once this is launched, you can scan, pair, trust or connect any Bluetooth device to the Pi just like you can in a mobile phone.

    + +

    Now, I hope you know what a Bluetooth profile is. It is nothing but a specification concerning a particular aspect of Bluetooth-based wireless communication between devices. For example, transferring files is associated with the profile FTP, hearing quality music is associated with A2DP, VoIP calls or using a bluetooth headset to make handsfree calls is associated with HSP/HFP and so on.

    + +

    So basically, if you connect a Bluetooth device to your Raspberry Pi, you can transfer files to and from the device, or play music on your device and hear it through speakers connected to your Pi, or play a music on the Pi and hear it through the bluetooth headset connected to your Pi. The applications are endless.

    + +

    I am going to just give you a sneak-peek on how to get started on doing all this. We will start with the easiest one, the A2DP profile which is an acronym for Advanced Audio Distribution Profile. Using this profile, you can play high quality music both on the Pi output (speakers or HDMI analog out) or on a bluetooth headset connected to it.

    + +

    For this, you need to install a sound server package called Pulseaudio which deals with all the sound streams passing via Bluetooth. Pulseaudio provides you with the option to select a source (from where the audio is taken) or a sink (to where the audio must be played). It also allows you to select the Bluetooth profile in which you want your Bluetooth device connected to the Pi work and can even do the same for Pi as well.

    + +

    That is, if you are connecting a bluetooth headset to the Pi, it can either be used as an A2DP sink or can be used to attend calls for HSP/HFP (Headset/Handsfree) purposes. Once you configure the source and sink to route your audio through the Pi, you are done. Now, the Pi can act like a music player and all you have to do is feed in your playlist into the Pi.

    + +

    Coming to transfer of files, which is namely the FTP or File Transfer Protocol, again, you have readily available packages like ussp-push and obexpushd which are once again armed with ready-to-go commands to enable easy transfer of files from Raspberry Pi to your bluetooth device and vice-versa.

    + +

    A small glitch, however, occurs when you try to use the Raspberry Pi as a handsfree device. By handsfree device, I mean the exact handsfree device you have in your cars, using which you can attend calls coming to a device connected via bluetooth to it. Our Pi too can perform the same task, but since we require live transmission of audio or more precisely voice data, the inbuilt bluetooth controller faces trouble and is not feasible owing to its huge latency and difference in the sampling rates of the two devices.

    + +

    But you can always go for a Bluetooth dongle in that case. Using the inbuilt bluetooth you can, however, place calls or answer them and do other related operations using a software for telephony called ofono.

    + +

    A joint effort of Intel and Nokia, this package is available for download in the repository and provides test files which you can run to do any call related operations, provided your connected device supports it. While implementing this, the problem I faced was that audio could be heard neither through the Pi nor through the connected mobile phone.

    + +

    I guess I have introduced you to a plausible aspect of Bluetooth usage in Raspberry Pi. It is a fun field to explore and the possibilities are plenty. Please do check these sites out for more details.

    + +

    Bluetooth file transfer

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/regenerative-braking/index.html b/blog/regenerative-braking/index.html new file mode 100644 index 0000000..fb4bc43 --- /dev/null +++ b/blog/regenerative-braking/index.html @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Idea:

    + +

    Regenerative Braking is an energy recovery mechanism which slows a vehicle or object by converting its kinetic energy into a form which can be either be used immediately or stored until needed. We have implemented this RBS in bicycles for generating electricity which can be used for different purposes like charging phones. For this we constructed a circuit to convert Mechanical energy to Electrical energy.

    + +

    pic1

    + +

    Implementation

    + +

    RBS is based on the principle of electromagnetic induction. On the application of brakes, the gears on the brakes come in contact with the rim of the wheel. These gears are connected to a DC Dynamo. This dynamo converts mechanical energy to electrical energy which can be used directly or stored in a battery. We have used this energy directly to charge a phone.

    + +

    pic2 +pic3 +pic4

    + +

    Mentors

    + +

    RBS project was under the supervision of assigned mentors Anand Pathak and Ayush Srivastava. Anand Pathak mentored the project by providing insights on the Mechanical structure and Casing. Ayush Srivastava mentored the design and building the electronic circuit. RBS was implemented under the ENVISION initiative by IEEE which funded for the same and assigned mentors who were IEEE Executive members.

    + +

    Why should such activities be undertaken?

    + +

    RBS is one of those projects which does not require digital analysis, software simulation, high level technical knowledge and experience. Taking up such projects in the first year improves technical knowledge and experience, develops team spirit and management skills.

    + +

    pic5

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/reinforcement-learning/index.html b/blog/reinforcement-learning/index.html new file mode 100644 index 0000000..05cc9bb --- /dev/null +++ b/blog/reinforcement-learning/index.html @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    An Introduction to Reinforcement Learning

    + +

    Imagine you are trying to train a dog to do fetch a ball. What you’d normally do is that you would reward it a snack every time it fetched the ball. The dog would then associate the snack with the act of fetching and would do it every time in the hope of a treat. Ladies and gentlemen, this is Reinforcement Learning. Cue the curtains. We’re done here. ;)

    + +

    Wait what? You didn’t tell me what Reinforcement Learning actually is.

    +

    All jokes aside, Reinforcement Learning is the area of machine learning which resembles how we humans learn something. Attempt, Make mistakes, Learn, Master. The agents or the models learn for themselves to achieve successful strategies that lead to the greatest long-term rewards. This is a paradigm of learning from trial-and-error, solely from rewards or punishments.

    + +

    Surely, you must have heard of DeepMind’s AlphaGo program? Yes, the one who beat the world No.1 ranked player in Go. This was built using RL. +AlphaGo

    + +

    So what does the model consist of?

    +

    Here we normally refer to the model as the agent. The agent is presented with an environment. This environment consists of states. In each state, an agent can take several actions. For each state-action pair, there is an associated reward which is collected when the agent takes this action in this state. For example, an agent playing a racing game would be rewarded every time it took the correct turn. This environment is represented by something known as the Markov Decision Process (MDP).
    +Markov Decision Process

    + +

    The job of the agent is to maximize the total reward as it interacts with the environment and moves through the states.

    + +

    What are the applications of this?

    +

    Reinforcement Learning is on the rise right now. I have already mentioned AlphaGo. A lot of current research focuses on using bots trained using RL to play video games. The same company DeepMind designed a Deep Q Network to play Atari games (paper link here). +Also, OpenAI an AI research company founded by Elon Musk currently has a platform named Gym which is a toolkit for creating RL algorithms. Take a look if you’re interested.

    + +

    In the industry, RL can be used to solve many problems requiring optimization. For example, when a modified e-commerce website has to be tested against its previous version to see which UI sells products better, A/B testing is used. Here, half of the users see the original website and the other half see the modified one. If the modified version of the site turns out to be doing better, this version is chosen. However, the website makes a small loss due to the fact that half of the users saw a suboptimal version of the site, hence losing a few purchases. +This issue can be solved using Bandit Testing. This is based on the Multi Armed Bandit problem. Here, the division of users is only initially 50/50. A reinforcement learning model initially explores the two possibilities and after it figures out the better performing version, it exploits it. It starts reducing the percentage of the users who see the poorer performing version of the site so as to increase its reward, i.e. more purchases. By the end, the model will eliminate the poorer version completely.

    + +

    How do I make a reinforcement learning agent?

    + +

    First, you will need to define your environment. You should be able to define your problem as a MDP. You’ll need to define what the states are, what actions you can take in each state. Also, you’ll need to define a numerical reward for each state-action pair. Then if you’re using Q-Learning, you need to construct a Q-table consisting of Q values. These Q values corresponding to each state-action pair represents the discounted sum of rewards from the initial state to the current state. +Using a table can cause data storage problems if there are many state and action pairs. We can instead use a neural network to estimate the Q value and determine the most optimal play. DeepMind used a Deep Q-Network to play Atari games. If you wanted to get started with Reinforcement Learning, Gym by OpenAI is a great place to start. Here are a few more resources to help understand the theory and get started with Reinforcement Learning:

    + + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/researchers-and-rating-their-research/index.html b/blog/researchers-and-rating-their-research/index.html new file mode 100644 index 0000000..c924b6e --- /dev/null +++ b/blog/researchers-and-rating-their-research/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A lot of research is continuously happening around us. While the word research seems fascinating to most of us, we seldom know how impactful the research is or how the actual impact of any research is measured. +While there are many techniques for adjudging researchers, journals, and research papers, none is absolute.

    + +

    There are four main ways that google scholar uses to rate a researcher. These are papers, citations, h-index, and i-10 index. +Papers mean the number of research papers published by a researcher. More number of papers would mean a higher volume of research. +Citations are the number of times the given research paper is cited or referenced in other papers. Usually, more the number of citations, better is the valuation of that research paper.

    + +

    A researcher’s number of citations is the summed number of citations of all his research papers. A good citation number not only depends on the research field but also on the region. +In 2005, statistician JE Hersch defined h-index (after his name Hersch) to provide “an estimate of the importance, significance, and broad impact of a scientist’s cumulative research contributions.” +It gives an excellent estimate of the research going on in the given field. While a single good paper with a large number of citations means that the quality of research is impeccable, though the number needs to increase, a large number of research papers with low citations mean that lot of mediocre, low bearing research is going on. Hersch combined both of these and put forward the concept of the Hersch index. +While the actual h-index definition might be very complicated, it merely means the number of papers with citations more than the number of papers one has published. An h-index of 40 means out of n papers the researcher has published, 40 have more than n citations. A score of 40 after 40 years of age would mean good research. It is so good a measure that an h-index of 80 would mean exceptional research, and more than 80% of noble laureates in Chemistry and Physics have an h-index at around 80.

    + +

    Finally, the i-10 index is another criterion used by Google, which means the number of research papers with citations more than 10. +A scientific journal is rated based on the impact factor. The impact factor is a measure of the frequency of average citations of an article in a journal in a particular year. It measures the importance or rank of a journal by calculating the citations of articles. +Two of the highest impact journals are Science and Nature. With over twelve thousand journals, the average impact factor of a scientific journal is less than one. More than three is considered a good, and an impact factor of over ten is exceptional. Nature and Science lead this list with an impact factor of 42.778 and 41.778, respectively.

    + +

    However, similar to chess ratings, none of these is absolute. These are all based on other research, region, and recognition. These measure the research about its relevance in contemporary time and industry requirements.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/revolutionising-the-wheel/index.html b/blog/revolutionising-the-wheel/index.html new file mode 100644 index 0000000..a799cc0 --- /dev/null +++ b/blog/revolutionising-the-wheel/index.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    With scientific advancements in space technologies, the need for more robust and efficient components is on the rise. To meet the demands of smoother and more stable rides in exoplanet missions such as Mars exploration, scientists are on the verge of reinventing our very concept of tires. Enter Superelastic Tires - a new research domain that inherits from the idea of Spring Tires, presented by NASA Glenn and Goodyear - inspired by the Apollo lunar tires.

    + +

    Spring tires introduced a new concept of airless tires from what we see every day. These off breeds consist of several coiled steel wires woven into a flexible mesh providing the tires with the capabilities to support high loads while also conforming to the terrain, making it suitable for operations in unknown and complicated terrains we might expect from Martian or Lunar missions.

    + +

    But what differs between Spring tires and the superelastic tires developed by NASA? To answer this, we’ll need to look into the revolutionizing concept of “Shape Memory Alloys.”

    + +

    A Metal that remembers - NITINOL

    + +

    NiTiNOL is an alloy of nickel and titanium, developed by William Beuhler in the laboratories of the US Navy in the 1960s. The exact ratio between nickel and titanium is 55% and 45%, respectively. Apart from their excellent superelasticity, durability, and corrosion-resistant properties, these alloys feature a very peculiar shape memory concept.

    + +

    These alloys can be deformed when cold but return to their pre-deformed shape when heated to a specific cutoff temperature. This property is in virtue of the temperature-induced phase transformation that reverses deformation. When Nitinol is below a particular temperature, it has a crystal structure called martensite. Its crystal structure is arranged in such a way that it can accommodate deformation very easily. When stress is applied, the grains deform and align to absorb the pressure best.

    + +

    Like the dislocation movement in other metals, this deformation is permanent in Nitinol, without external energy providing the energy needed to revert backward. Still, Nitinol can get that energy from heat. Upon heating, the Nitinol forms austenite, an ordered and regular crystal structure, which effectively resets the crystal structure, and when the Nitinol cools again, the Nitinol remembers its original.

    + +

    It is this use of shape memory alloys which results in a tire that can withstand excessive deformation without permanent damage due to their abilities of undergoing high strain as load-bearing components, instead of typical elastic materials.

    + +

    Nitinol en route

    + +

    Using shape memory alloy as stiffening elements can also increase the load-carrying capacity of the tire. The Superelastic Tire fabricated from these allows traction superior to conventional pneumatic tires. It also eliminates both the possibility of puncture failures and running “under-inflated,” thereby improving automobile fuel efficiency and safety. Furthermore, the tire design does not require an inner frame that simplifies and lightens the tire/wheel assembly.

    + +

    To reduce the amount of energy transferred to the vehicle during high deformation events, the Glenn Superelastic Tire can be made to soften causing increased deflection. Besides, the use of shape memory alloys in radial stiffeners instead of springs provides even more load-carrying potential and improved design flexibility. This type of compliant tire would allow for increased travel speeds in off-road applications paving way for a safer and better tomorrow.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/rfid/index.html b/blog/rfid/index.html new file mode 100644 index 0000000..20e3ac3 --- /dev/null +++ b/blog/rfid/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    RFID technology has been in circulation for many years now. You may have encountered it first-hand while borrowing library books, or while swiping for attendance in school. Recently, the government issued RFID chips to be installed in cars so that we can zoom through toll booths instead of waiting in long queues. RFID technology has also got a fair share of screen time. Remember Casino Royale? Her Majesty’s Secret Service injects Bond with a glass-enclosed, rice-sized RFID chip, so that, in M’s words, “they’ll know where he is”. Here is a little insight into the technology that is taking the world by storm.

    + +

    What is RFID?

    + +

    Radio-frequency Identification is an Automated Data Collection (ADC) technology that uses radio-frequency waves to transfer data between a reader and an object with an RFID chip. It is used to track, categorise, and uniquely identify objects. The main advantage of RFID over other ADC technologies like barcode, Optical Character Readers etc., is that the object need not be in the line of sight of the reader. It uses tags which act as labels for the object to be identified. Tags generally have an integrated circuit for processing and storing information that modulates and demodulates the RF signals and antenna for receiving and transmitting the signals. Passive tags have a device that collects DC power from the reader. Active tags are powered by a locally connected battery, and have a much longer read range than passive tags. The reader, or interrogator, is a two-way radio transmitter-receiver which +sends signals to the tags and reads their response.

    + +

    RFID

    + +

    Real World Applications of RFID

    + +
      +
    1. +

      Supply Chain Management, Manufacturing and Processing industry: RFID is used to take inventory and track manufactured products, tools and other assets.

      +
    2. +
    3. +

      Race Timing: Timing marathons and races are one of the most popular uses of RFID. The runners wear tags which are read by readers placed alongside the tracks. This is a huge advantage while timing marathons and other races with a large number of participants because participants don’t need to start as batch.

      +
    4. +
    5. +

      Access Control: Certain areas require a higher level of security. From doors to parking lots, RFID access control tags restrict access to only those pre-approved.

      +
    6. +
    7. +

      Library systems: RFID tagged books improve the efficacy of the borrowing process. While barcodes require line of sight, RFID tags can be read from multiple angles which means the checkout and check-in process is significantly faster. Also, taking inventory of books on the shelf is dramatically faster.

      +
    8. +
    9. +

      Smart Groceries: RFID Tags are added to all grocery items. While leaving the store, the customer walks through an RFID interrogator which rings up the items in the cart. This greatly reduces the checkout wait time.

      +
    10. +
    11. +

      Smart Fridges: By recognising what is being put in and what is being taken out, smart fridges can make their own shopping lists and can even suggest recipes based on what is present in the fridge.

      +
    12. +
    + +

    Likewise, RFID can be used to make several things “smart” such as smart currency, for anti-counterfeiting and tracking, or smart airline tickets which indicate the location of the airport. In recent years, with the advent of the Internet of Things, the scope of RFID technology has increased by manifolds. However, as it is with most new, disruptive technologies, it can be abused in ways that have generated breach of privacy concerns, as tags can easily be used to track people instead of just objects. But if used smartly, this technology can go a long way in making the world around us smarter.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/robots-can-see-in-3d/index.html b/blog/robots-can-see-in-3d/index.html new file mode 100644 index 0000000..cbf17db --- /dev/null +++ b/blog/robots-can-see-in-3d/index.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Autonomous robots can inspect nuclear power plants, clean up oil spills in the ocean, accompany fighter planes into combat and explore the surface of Mars.

    + +

    Yet for all their talents, robots still can’t make a cup of tea.

    + +

    That’s because tasks such as turning the stove on, fetching the kettle and finding the milk and sugar require perceptual abilities that, for most machines, are still a fantasy.

    + +

    Among them is the ability to make sense of 3-D objects. While it’s relatively straightforward for robots to “see” objects with cameras and other sensors, interpreting what they see, from a single glimpse, is more difficult.

    + +

    Now researchers have developed a new computer vision algorithm that gives a robot the ability to recognize three-dimensional objects and, at a glance, intuit items that are partially obscured or tipped over, without needing to view them from multiple angles. For instance, objects with flat square tops tend to have legs. If the robot can only see the square top, it may infer the legs. All pots are hollow in the middle. When the algorithm was being trained to recognize pots, it didn’t spend time analyzing the hollow parts. Once it knew the object was a pot, it focused instead on the depth of the pot or the location of the handle. It sees the front half of a pot sitting on a counter and guesses there’s a handle in the rear and that might be a good place to pick it up from.

    + +

    Visualisation

    + +

    The researchers trained their algorithm on a dataset of roughly 4,000 complete 3-D scans of common household objects: an assortment of bathtubs, beds, chairs, desks, dressers, monitors, nightstands, sofas, tables and toilets.

    + +

    Each 3-D scan was converted into tens of thousands of little cubes, or voxels, stacked on top of each other like LEGO blocks to make them easier to process.

    + +

    The algorithm learned categories of objects by combing through examples of each one and figuring out how they vary and how they stay the same, using a version of a technique called probabilistic principal component analysis.

    + +

    Researchers have been teaching robots to recognize 3-D objects for a while now. What’s new is the ability to both recognize something and fill in the blind spots in its field of vision, to reconstruct the parts it can’t see.

    + +

    That has the potential to be invaluable in a lot of robotic applications.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/robots.txt b/blog/robots.txt new file mode 100644 index 0000000..ef9d9f6 --- /dev/null +++ b/blog/robots.txt @@ -0,0 +1,3 @@ +# robotstxt.org/ + +User-agent: * \ No newline at end of file diff --git a/blog/rock-paper-scissors/index.html b/blog/rock-paper-scissors/index.html new file mode 100644 index 0000000..ad45710 --- /dev/null +++ b/blog/rock-paper-scissors/index.html @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    If you have ever played the game of rock, paper scissors I bet that the best strategy you had was trying to predict your opponent’s move which is a pretty appealing idea. But given that it is nigh impossible to do that (unless, of course, you can read minds), is that really a sound strategy to adopt? If you think about it in a rational way there is no method to predict your opponent and basing your strategy on such an unpredictable thing is kind of dumb. I think the best approach to this problem is to make sure your opponent doesn’t beat you more than half the time. If both players play random moves, then both have an equal probability of winning. If there’s a pattern in your moves, in a large number of matches your opponent can easily figure it out and increase his winning chances considerably. So the obvious thing to do is to randomize your moves. This, you can do, in a number of ways and I leave it to you to find them out: P

    + +

    Now the situation changes entirely when you introduce a third party in the game and all three of you play simultaneously. Try to think of a strategy which you can use here.

    + +

    One strategy would be to play rock all the time and tell this to them. If the other two play rock, then it is a draw. If one of them plays scissors, then they lose to the rock. If they play paper, then there’s always a chance that the other plays scissors and wins but in turn the other player would lose to the rock. This makes it obvious that there is no way for one to beat both you and the other person at the same time.

    + +

    This is what Game Theory is all about. Popularized by Nobel laureate John Nash (notice the name of the article 😉) game theory deals with forming strategies to get the best possible moves you can make without ignoring the self-interests that human beings have. Despite its name it not only deals with games but with any form of strategic decision making including politics, defence, economics, trade, traffic control etc.

    + +

    A look at a real world problem

    + +

    As a real world example I present to you the following problem on traffic lanes.

    + +

    Suppose you are in a heavy traffic and want to change lanes (you cannot do that in my country India though, because we don’t have many lanes ☹). When do you switch lanes? When the lane beside you are faster than the current one? Which is a good approach in the long run?

    + +

    Traffic

    + +

    Let us first make the simple assumption that a lane is faster only because it has fewer number of vehicles. Suppose you are impatient and switch to the fast lane. If there aren’t many who think like you, then it is your lucky day. If not, the fast lane will get crowded and become the slow lane. If everyone thinks in this way and stays in the same lane, then the lanes maintain their speed and you have to waste your time. So, either way, you can only do a successful thing provided the others don’t think of the same strategy as you.

    + +

    There is, in fact, a way out of this pickle. Pick a random amount of time (say t). After time to check the lane speeds. If the lane beside you are faster, then switch. Else stay in your lane. Repeat the process after time t.

    + +

    Mathematicians have shown that if everyone adopted this strategy we would achieve an equilibrium state with both lanes having the same speed. Though this may not suit your individual preference (you would rather have the entire lane or even all the lanes to yourself) this is the best we can do while being fair to everyone.

    + +

    The problem here is, of course, that it requires everyone on the road to have read game theory.

    + +

    References

    + +
      +
    1. Read Rock, Paper, Scissors: Game Theory in Everyday Life by Len Fisher.
    2. +
    3. PittsBurgh Post-Gazette
    4. +
    5. Reference 1
    6. +
    7. Coursehero - Prisoner’s Dilemma
    8. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/rocker-bogie/index.html b/blog/rocker-bogie/index.html new file mode 100644 index 0000000..1e9d4b5 --- /dev/null +++ b/blog/rocker-bogie/index.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Everyone might know what a rover is. It is a space exploration device designed to move across the surface of celestial bodies. Have you ever wondered how these rovers are capable of traversing the rough and rocky terrains of a planet? Different kinds of suspension systems are employed to help them achieve this task. Rocker-Bogie is one such suspensionsystem which is very popular and widely used. It is currently NASA’s favoured design for wheeled mobile rovers. NASA’s Curiosity rover uses this mechanism.

    + +

    Design & Features

    + +

    Rocker Bogie

    + +

    The largest link on each side is called rocker. It has two joints: one connected to the drive wheel and the other connected to the second link called Bogie. Bogie has drive wheel on each end.

    + +

    The primary feature of rocker bogie is its simple and reliable design. It uses no springs or stub axles. It is thus capable of climbing over obstacles that are upto twice the size of wheel’s diameter. It offers good stability along its travel by keeping all the six wheels on the ground.

    + +

    Each side of suspension moves independently allowing the rover to traverse terrains where the left and right rockers have to go over different sizes of obstacles. By proper design, the rover can be made to sustain tilt upto 50 degrees. Power is given to both front and back wheels enabling the rover to traverse obstacles without slip.

    + +

    Rocker Bogie

    + +

    One major disadvantage is regarding the travel speed of the rover. At present, the speed is limited to about 10 cm/s to minimize dynamic shocks and damage upon impact.

    + +

    There is still a lot to study and explore in this field. The design can be optimized to make it more cost effective and improve its strength and rigidity. One major concern would be to increase the travel speed so that it can be utilised to a greater extent.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/rpi-tutorial/index.html b/blog/rpi-tutorial/index.html new file mode 100644 index 0000000..bcb2b16 --- /dev/null +++ b/blog/rpi-tutorial/index.html @@ -0,0 +1,637 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    If you have just started exploring microcontrollers and experimenting with development boards like Arduino and Raspberry Pi, you might have had struggles with configuring the board and interfacing them with the hardware that you used to build your little fascinating circuits. I too, faced some issues when I had to set up my Raspberry Pi B+ model.

    + +

    Most of the instructables available online give instructions for working with a separate monitor connected to RPi using a HDMI cable. However, to make things convenient, you can use your laptop display itself to work with your Rpi. This requires a few additional steps which I will be covering in the last section of this tutorial. So, this article is a step by step tutorial to help you kick start your Raspberry Pi and dive into the Internet of Things!

    + +

    Unlike an Arduino, you need to have an operating system to start working with your RPi. The most famously used OS for RPi is Raspbian, based on Debian, a Linux distribution.

    + +

    I - Steps to format SD card to flash the Raspbian image later

    + +

    A 16GB SD card should suffice for flashing the Raspbian image onto it.

    + +

    1) Download SD Formatter 4.0 for Windows from here

    + +

    2) Insert your SD card into the computer or laptop’s SD card reader and make a note of the drive letter allocated to it, e.g. F:/

    + +

    3) In SD Formatter, select the drive letter for your SD card and format it.

    + +

    4) Under Option > choose Format Type as Full (Erase) > set Format Size Adjustment as ON +to format the full space present in SD card if formatting the SD card for the first time. Otherwise, Quick format type should also be fine.

    + +

    ==> Now we have a formatted SD card on to which the Raspbian image can be flashed later.

    + +

    II - Steps to flash Raspbian image on to SD card

    + +

    1) On your Windows laptop, go here

    + +

    2) Click on Raspbian (so as to flash the Raspbian image on to SD card).

    + +

    Note: NOOBS can be used for installation if we have HDMI cable and display monitor. +Raspberry

    + +

    3) Download RASPBIAN STRETCH WITH DESKTOP so that we can have a desktop to work on, if necessary. +Download Torrent (it is faster )

    + +

    4) Extract the files from the zip file downloaded in Step 3 to extract the Raspbian image (.img file).

    + +

    5) From here, download and install the Etcher SD card image utility.

    + +

    6) Run Etcher and select the Raspbian image you unzipped (.img file) on your computer or laptop.

    + +

    7) Select the SD card drive. Note that the software may have already selected the right drive

    + +

    8) Follow the instructions of Etcher to flash the Raspbian image on to SD card.

    + +

    9) Open the root folder in the SD card and create a file (SSH). Note that the filename should not have any extension.

    + +

    This is required to make Raspberry Pi enable SSH so that we can connect later from PuTTY through SSH. Here, your laptop will later serve as the SSH client and your RPi will be the SSH server.

    + +

    ==> Now the SD card contains the Raspbian image with SSH enabled.

    + +

    Follow the below mentioned steps if you are working in the comfort of your home network. If not, skip 3(a) and move ahead to 3(b).

    + +

    III(a) - Connecting the SD card to Raspberry Pi and setting up (home network)

    + +

    1) Take your Raspberry Pi and connect to the router (for example, DLink router) directly using a LAN cable.

    + +

    2) By typing ipconfig (in Windows) in your command prompt, find out the IP address of the machine you are using.

    + +

    Check the Active Client Table of your router configuration. There will be an IP address allocated for your RPi. Note the IP address (e.g. 192.168.0.12).

    + +

    ActiveClientTable

    + +

    3) Using PuTTY, connect to the IP address, 192.168.0.12(this is just an example).

    + +

    4) It will get connected to Raspberry Pi and will ask for username/password.

    +
    +

    Provide username as pi and password as raspberry (Pi is the default username and raspberry is the default password)

    +
    + +

    We can see the RaspberryPi prompt getting displayed and we are connected to the Raspberry Pi through SSH.

    + +

    Putty

    + +

    III(b) - Connecting the SD card to Raspberry Pi and setting up (to connect to mobile hotspot or any other WiFi network)

    + +

    Connecting to a WiFi network when you are on the go can be a hassle as finding the IP address of your RPi can be difficult. Here’s a YouTube video if you are facing similar issues.

    + + + +

    IV - Configuring WiFi for Raspberry Pi

    + +

    Raspberry Pi Configuration Documentation

    + +

    1) In the SSH terminal of PuTTY, give the command

    + +
    sudo iwlist wlan0 scan
    +
    + +

    You will be able to see the list of WiFi connections available.

    + +

    2) If you want to connect to a specific WiFi network, for example, rpi, give the following command so that it generates the WiFi configuration information which needs to be updated at the bottom of the file -

    + +
    +

    /etc/wpa_supplicant/wpa_supplicant.conf

    +
    + +
    wpa_passphrase "rpi" "wifipassword"
    +
    + +

    The output will be as follows:

    + +
    network={
    +
    +ssid = <rpi>
    +
    +#psk = <wifipassword>
    +
    +psk=c84f3033b09512fbd632a0510ba0cf0f9b8f7a8f8e3e075cdfa76b8036bab9e8
    +
    +}
    +
    + +

    Note: This is just an example. You need to specify your network name in place of rpi and the password for it in place of wifipassword.

    + +

    3) The above output needs to be copied to bottom of the file

    + +
    /etc/wpa_supplicant/wpa_supplicant.conf 
    +
    + +

    after removing the line containing #psk for security purpose as we do not want to store the WiFi password in plain text.

    + +

    4) Command to open the file and copy the network settings at the bottom on the file -

    + +
    sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
    +
    + +

    5) Automatically, WiFi will be configured after sometime. We can also make sure it happens by issuing the following command

    + +
    sudo wpa_cli reconfigure
    +
    + +

    6) You can verify whether it has successfully connected, using the command

    + +
    ifconfig wlan0
    +
    + +

    If the inet addr field has an address beside it, the Raspberry Pi has connected to the network.

    + +

    For example, the IP address may be 192.168.0.5. This is the IP address of Raspberry Pi through WiFi connection rpi (example).

    + +

    Now, if you are equipped with a HDMI cable, a monitor, a keyboard and a mouse, you are all set to go and discover the capabilities of the credit card sized computer that you possess. However, if you do not have a monitor, do not worry as the last step of this tutorial is aimed to eliminate that need. You can use your laptop display and remotely access your RPi using SSH. So, do not give up hopes after coming this far! One final step and you are done!

    + +

    V - Setting up the Raspberry Pi to connect to laptop display

    + +

    DIY Hack - Connect RPI to Laptop’s Display

    + +

    1) To start VNC, enter the following command in the SSH terminal:

    + +
    vncserver :1
    +
    + +

    2) In the client side laptop, Download VNC Viewer from here

    + +
    +

    Make sure to select Windows if installing VNC Viewer for Windows laptop

    +
    + +

    3) Now click on VNC Viewer. A dialog box will be displayed. If the Raspberry Pi’s IP address is say 192.168.0.5, in the VNC Server field, provide the value as 192.168.0.5:1 and click OK. For password, enter Raspberry’s username and password.

    + +

    ==> Now the Raspberry Pi’s display will be shown on the laptop display.

    + +

    RaspberryPi

    + +

    And finally, you are done! Without further ado, enjoy exploring!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/safety-issues-in-ai-systems/index.html b/blog/safety-issues-in-ai-systems/index.html new file mode 100644 index 0000000..b3e5d23 --- /dev/null +++ b/blog/safety-issues-in-ai-systems/index.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    I am pretty sure the title will flood the reader’s mind with images of Skynet and Matrix, but this post focuses on the shortcomings of AI technologies that are currently in vogue. It’s much more productive to contemplate on the loopholes in technologies like Neural Networks, as we are still a far cry from building systems that are at least as intelligent as earthworms.

    + +

    AI has made several inroads into diverse fields such as NLP, Computer Vision, Autonomous Vehicles, Personal Assistants, and Game playing bots. AI has become truly ubiquitous. This magnifies the impact of security loopholes on the society. Accidents, in the context of AI, are defined as unintended or unexpected actions of the system, that might be harmful to human beings, and might cause irreversible damage to the environment. These may be caused due to reasons like incorrect objective function, errors in the implementation or the systems not being robust to outlier inputs. Many of ML problems are solved by designing algorithms that optimise a particular function - this function is known as the objective function. An objective function can be specified either as a cost functions(that gives us the error in the predictions, and hence has to be minimised) or as utility function(used to specify rewards for Reinforcement Learning agents, which try to maximise this reward). Another reason, that augments research in this area is that, the Value Alignment problem shares a major intersection of ideas with the security concerns.

    + +

    So what exactly is the Value Alignment problem? Suppose that our system consists of n variables, and we define our objective / utility function in terms of k variables, where k is a subset of n. So, there are chances of the system optimising the utility function by setting the other variables to extreme values. This might cause a lot of permanent damage. Suppose we design genuine AGI(Artificial General Intelligence) for getting us medicines. Now, we wouldn’t want it to imfringe upon others’ rights when we want it to get medicines in the most optimal way right? Like, it shouldn’t break the trafffic rules, it should stand in a queue, it must not steal the medicines,etc. The paperclip maximiser is a funny, but instructive example that demonstrates this problem.

    + +

    Most of the alignment problems initially show up as security issues itself. The value alignment problem isn’t born out of the spooky fears of evil-intent and consciousness arising out of super-intelligent machines, but because of the following reasons:

    + +
      +
    1. It’s very hard to clearly define the cost/utility functions of agents which align perfectly with that of the human race.
    2. +
    3. Any sufficiently intelligent AI will try to acquire more physical and computational resources, not to take over the world, but to succeed in its task more efficiently.
    4. +
    + +

    Let’s explore some of the ways in which AI systems can malfunction:

    + +

    Incorrect Reward Functions

    + +

    We are quite familiar with Sorcerer’s Apprentice or King Midas’ story - “We all get what we ask for, not what we want”. For instance, consider the case when google photos tagged a person as Gorrilla - Google apologises for Photos app’s racist blunder +This was not because the AI system wanted to hurt the sentiments of particular section of society. It might be because, the cost function for misclassification of inanimate objects is the same as that of misclassifying people as animals/objects. On the contrary, greater cost should have been associated with misclassification of humans. This illustrates the unintended effects of faulty reward functions.

    + +

    Negative side effects

    + +

    The AI system may try to maximise its reward function, without heeding to the other environment variables. For instance, consider the example of a robot used to clean office spaces: The robot must not break an expensive vase in it’s way, and must search for an alternative path, although the cleaning process might be faster in the former approach.

    + +

    Reward Hacking

    + +

    The system may find out a clever/easy way of increasing the reward, but might be against the spirit with which it was designed. Continuing with the same analogy, the robot might purposefully shut it’s vision system so that it cannot ‘see’ any dirt, or it might hide the existing dirt with objects, so that the dirt is not visible to others. Take a look at this AI bot, that’s designed to play the speedboat game of CoastRunners. Here, the boat that finishes first gets the maximum points. So, when this RL agent was given reward function of obtaining maximum points, it does not participate in the race, but rather tries to obtain higher points by perfecting it’s timing of going around in the circle as shown. Indeed, the number of points obtained by the bot was 20% higher than an average human player, but this was not what the designer had in her mind. More on this by OpenAI - Faulty Reward Functions

    + +

    Hence many attempts have been made at evaluating a system’s performance and solving the “reward engineering problem”. For instance consider, Cooperative Inverse Reinforcement Learning(CIRL) - here, a robot observes a human being in an open environment and ‘infers’ the reward function by itself, rather than being explicitly specified. This is a paper on CIRL from researchers at BAIR - Cooperative Inverse Reinforcement Learning . OpenAI has also released Universe, which makes it easier to compare a machine’s performance in a game with that of a human being.

    + +

    Adversarial Examples

    + +

    As the name suggests, we are trying to create inputs that bypass an ML algorithm. This is probably one of the segments that is receiving a lot of focus in the recent years. Neural Networks have been immensely popular for computer vision tasks, but of late they have been prone to a lot of adversarial loopholes. Initially, a ML algorithm will have correctly classified an input. But a very slight perturbation is added to the original input, which is so subtle that it is nearly imperceptible to humans, but this often “fools” the classifier and results in an incorrect output. Consider this,

    + +

    Misclassification of Panda

    + +

    On the LHS, the image is classified as a panda with 57% confidence. Although the middle image appears as random noise, it’s obtained by maximising the prediction error of the classifier, but this surprisingly results in the wrong classification as a “gibbon”. As we can observe, the difference between RHS and LHS images is quite imperceptible. It is true that, an attacker may not have access to directly input data into a classifier, so experiments were done to take input from camera devices, but similar results were obtained. Epsilon refers to the extent of perturbation added. In the below image, the image classifier is fooled into classifying the washing machine as a safe + (34% probability) and as a loudspeaker(24% probability).

    + +

    Misclassification of pictures from cameras

    + +

    Further, it was believed that since Autonomous vehicles take many pictures from varied angles, perspectives and scales they would not be deceived very easily. But researchers were able to generate scale-invariant and transformation-invariant adversarial inputs also - Synthesizing Robust Adversarial Examples. Scale invariance implies, even if all the dimensions of input are multiplied by a common factor, the output is still misclassified. Similarly, the results won’t change much, even if tranforms(like geometric/morphological transforms) are applied onto these images. Hence, Adversarial Examples is one of the critical research areas in ML Security. The cleverhans library is used to benchmark and evaluate the vulnerability of ML models against adversarial inputs.

    + +

    I think that Safety of ML models is a very exciting and crucial area in the coming years. It is quintessential to resolve these issues for the realization of products like Autonomous Driving Vehicles and Personal Robots. As AI systems make deeper inroads into our lives, ensuring the safety and reliability of these systems is of paramount importance. Please do put in your comments/suggestions regarding this article below.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/search-engine-optimisation/index.html b/blog/search-engine-optimisation/index.html new file mode 100644 index 0000000..583adfe --- /dev/null +++ b/blog/search-engine-optimisation/index.html @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    Guess how many websites come up each day.
    + Any ideas?

    +
    + +
    +

    A survey by Netcraft in 2012 showed that total number of websites launched in 2012 were 51 million i.e. ~140,000 per day.

    +
    + +

    This flood makes it necessary for your website to stand out from the rest. But , how can this be done ?

    + +

    This is where SEO i.e. Search Engine Optimisation comes into play.

    + +

    SEO and Ranking

    + +

    In a world where over 90% of online experiences start with a search engine, showing up on the front page of Google Search can be the deciding factor for a business’ growth.

    + +

    What does SEO mean ?

    +

    Quite simply, SEO is the term used for all the steps that can be used to ensure the visibility of your website and its content on search engine results pages (SERPs). Visibility here means how high it appears in the SERP in the Organic Results i.e. the naturally appearing results, not the paid sections.

    + +

    The methods vary from technical practices you can use behind the scenes on your website (on-page SE) to all the promotional (off-page SEO) approaches you can use to raise your site’s visibility (link-building, social media marketing).

    + +

    Here’s a short video that will give you a clear picture about SEO.

    + + + +

    What do Search Engines look for ?

    + +

    1) How Relevant is the page w.r.t the user’s search. Search Engines makes use of the keywords , user location , history, time period and many other factors to show the user results which is accurate and relevant.

    + +

    2) Content Quality is as important as the keywords. Websites publishing regular, fresh and helpful articles and videos are usually ranked higher.

    + +

    3) User Experience : Webpage should be easily navigable, should have internal linkings and should be searchable.

    + +

    4) It should be optimised to take less Time to Load. +Check out this Google tool for checking your website’s speed and fixes to make it faster.

    + +

    5) Webpage should be Responsive. Sites optimised for cross-device compatibility will have a higher rating. +Check if your website is mobile friendly using this Google tool.

    + +

    6) The website should be Trustworthy. Proper certified websites are always preferred.

    + +

    7) Webpage having more Backlinks from popular websites rank higher. SE’s give more weight to backlinks from trustworthy and popular sites to avoid bogus linkings.

    + +

    8) Title and Meta tags matter. These are used by Search Engines to filter out results.

    + +
    <html>
    +<head>
    +<title>Baseball Cards - Buy Cards, Baseball News, Card Prices</title>
    +<meta name="description" content="Brandon's Baseball Cards provides a
    + large selection of vintage and  modern cards for sale.  We also offer 
    + daily baseball news and events in">
    +</head>
    +</html>
    +
    + +

    Tags

    + +

    Use separate description meta tags for each page.

    + +

    9) HTML tags used should have the required attributes (e.g alt attribute in img tag).

    + +

    10) Simple to understand URL’s is another plus.

    + +

    11) Simple website directory makes it easier for GoogleBots to crawl your website.

    + +

    SEO is no longer an option in today’s crowded online world. +Today, making it to the first page of Google Search has become the deciding factor for a website’s success.

    + +

    References

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/search.json b/blog/search.json new file mode 100644 index 0000000..1851bde --- /dev/null +++ b/blog/search.json @@ -0,0 +1,2363 @@ +[ + + { + "title" : "Consensus Mechanism in Blockchain", + "category" : "compsoc", + "tags" : "IEEE NITK, CompSoc, and Blockchain", + "url" : "https://ieee.nitk.ac.in/blog/consensus-mechanism-in-blockchain/", + "date" : "11 Apr 2022", + "author" : "Tejas Sankpal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "I2C", + "category" : "Diode", + "tags" : "IEEE NITK and Diode", + "url" : "https://ieee.nitk.ac.in/blog/i2c/", + "date" : "23 Aug 2021", + "author" : "Bhaskar Vyas", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/bhaskar.jpeg" + } , + + { + "title" : "Cloud Computing in Detail", + "category" : "Diode", + "tags" : "IEEE NITK and Diode", + "url" : "https://ieee.nitk.ac.in/blog/cloud-computing-in-detail/", + "date" : "23 Aug 2021", + "author" : "Rohan Rao H J", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "A future called Quantum", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, and Quantum Computing", + "url" : "https://ieee.nitk.ac.in/blog/a-future-called-quantum/", + "date" : "23 Aug 2021", + "author" : "Manav Singhal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/manavsinghal.jpeg" + } , + + { + "title" : "DP on Trees", + "category" : "Compsoc/Diode/Piston", + "tags" : "IEEE NITK and CompSoc", + "url" : "https://ieee.nitk.ac.in/blog/dp-on-trees/", + "date" : "16 Aug 2021", + "author" : "Vaibhav Puri", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/vaibhav.png" + } , + + { + "title" : "From 1G to 5G", + "category" : "Diode", + "tags" : "IEEE NITK and Diode", + "url" : "https://ieee.nitk.ac.in/blog/from-1g-to-5g/", + "date" : "16 Aug 2021", + "author" : "Sujay Chuttar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Different Ways to console.log for Better Clarity", + "category" : "Compsoc", + "tags" : "IEEE NITK, CompSoc, Javascript, and Debugging", + "url" : "https://ieee.nitk.ac.in/blog/javascript-console-better-debugging/", + "date" : "16 Aug 2021", + "author" : "Tilak", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Amateur Radio", + "category" : "Diode", + "tags" : "IEEE NITK and Diode", + "url" : "https://ieee.nitk.ac.in/blog/amateur-radio/", + "date" : "16 Aug 2021", + "author" : "Moha Mankad", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Playing Blackjack Optimally with Reinforcement Learning", + "category" : "compsoc", + "tags" : "IEEE NITK, CompSoc, and Reinforcement Learning", + "url" : "https://ieee.nitk.ac.in/blog/playing-blackjack-optimally-with-reinforcement-learning/", + "date" : "09 Aug 2021", + "author" : "Shreya Namath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Shreya_Namath.jpg" + } , + + { + "title" : "Where's the Bot Now?", + "category" : "diode", + "tags" : "IEEE NITK, Diode, and Robotics", + "url" : "https://ieee.nitk.ac.in/blog/localization-robotics/", + "date" : "09 Aug 2021", + "author" : "P Ramyashri", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Brain-Machine Interfaces", + "category" : "diode", + "tags" : "IEEE NITK, Diode, and Medical Electronics", + "url" : "https://ieee.nitk.ac.in/blog/brain-machine-interfaces/", + "date" : "09 Aug 2021", + "author" : "Achintya K N", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Learning Fluid Mechanics: From Living Organisms to Machines", + "category" : "piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/fluid-mechanics-from-living-to-machines/", + "date" : "02 Aug 2021", + "author" : "Diptesh Banerjee", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "CPUs Vs GPUs: Allies or Foes?", + "category" : "diode", + "tags" : "IEEE NITK, Diode, and Computer Architecture", + "url" : "https://ieee.nitk.ac.in/blog/cpu-vs-gpu/", + "date" : "02 Aug 2021", + "author" : "Rahul Magesh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "An Introduction to Disjoint-set Data Structures", + "category" : "Compsoc", + "tags" : "IEEE NITK, CompSoc, Disjoint-set, and Data Structures and Algorithms", + "url" : "https://ieee.nitk.ac.in/blog/An-Introduction-to-Disjoint-set-data-structures/", + "date" : "02 Aug 2021", + "author" : "Sanjkeet Jena", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sanjkeet.jpg" + } , + + { + "title" : "Revolutionising the Wheel", + "category" : "piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/revolutionising-the-wheel/", + "date" : "30 Jul 2021", + "author" : "Monal Singh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Introduction to Kubernetes Architecture", + "category" : "Compsoc", + "tags" : "IEEE NITK, CompSoc, and Kubernetes", + "url" : "https://ieee.nitk.ac.in/blog/introduction-to-kubernetes-architecture/", + "date" : "30 Jul 2021", + "author" : "Sravani Katasani", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sravani.jpg" + } , + + { + "title" : "An Introduction to IoT", + "category" : "diode", + "tags" : "IEEE NITK, Diode, and Internet of Things", + "url" : "https://ieee.nitk.ac.in/blog/introduction-to-iot/", + "date" : "30 Jul 2021", + "author" : "V Kartikeya", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "To Infinity and Beyond", + "category" : "piston", + "tags" : "IEEE NITK, Piston, and Space", + "url" : "https://ieee.nitk.ac.in/blog/to-infinity-and-beyond/", + "date" : "17 Jul 2021", + "author" : "Pranshu Shukla", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "A beginner's guide to Cloud Computing", + "category" : "Compsoc", + "tags" : "IEEE NITK, CompSoc, and Cloud", + "url" : "https://ieee.nitk.ac.in/blog/intro-to-cloud-computing/", + "date" : "17 Jul 2021", + "author" : "Srujan Bharadwaj", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "CubeSats", + "category" : "diode", + "tags" : "IEEE NITK, Diode, Space, and Systems Engineering", + "url" : "https://ieee.nitk.ac.in/blog/cubesats/", + "date" : "17 Jul 2021", + "author" : "Nakshatra Gopi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Paradox Free Time Travel", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/paradox-free-time-travel/", + "date" : "11 Jul 2021", + "author" : "Viren Varma", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Bionics, Biomimetics and Robotics", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, Robotics, and Automation", + "url" : "https://ieee.nitk.ac.in/blog/bionics-and-biomimetics/", + "date" : "11 Jul 2021", + "author" : "Shobuj Paul", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Alpha Beta Pruning", + "category" : "Compsoc", + "tags" : "IEEE NITK, CompSoc, Artificial Intelligence, Algorithms, and Game Theory", + "url" : "https://ieee.nitk.ac.in/blog/Alpha-Beta-Pruning/", + "date" : "11 Jul 2021", + "author" : "Pranav DV", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/PranavDV.jpeg" + } , + + { + "title" : "Holographic Memory", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, and Data Storage", + "url" : "https://ieee.nitk.ac.in/blog/holographic-memory/", + "date" : "05 Jul 2021", + "author" : "Soma Anil Kumar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Concrete: The Way You've Not Seen It", + "category" : "Piston", + "tags" : "IEEE NITK and Concrete", + "url" : "https://ieee.nitk.ac.in/blog/concrete-the-way-youve-not-seen-it/", + "date" : "05 Jul 2021", + "author" : "Harshavardhan S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Introduction to Audio Processing in NLP", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, Audio Processing, and NLP", + "url" : "https://ieee.nitk.ac.in/blog/Introduction-to-audio-processing-in-NLP/", + "date" : "05 Jul 2021", + "author" : "Pratham Nayak", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/pratham.jpg" + } , + + { + "title" : "Trying-to-understand-Trie", + "category" : "CompSoc", + "tags" : "IEEE-NITK, CompSoc, Algorithms, and Data Structures", + "url" : "https://ieee.nitk.ac.in/blog/trying-to-understand-trie/", + "date" : "18 Jun 2021", + "author" : "Adithya Rajesh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/AdithyaRajesh.jpg" + } , + + { + "title" : "LSTM Models", + "category" : "Diode", + "tags" : "IEEE-NITK, Diode, Machine Learning, Deep Learning, and LSTM", + "url" : "https://ieee.nitk.ac.in/blog/lstm-models/", + "date" : "18 Jun 2021", + "author" : "Chandan Kumar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "The Impact of F1 on the World", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/impact-of-f1/", + "date" : "18 Jun 2021", + "author" : "Kaustubh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "State Management in Flutter", + "category" : "CompSoc", + "tags" : "Flutter, State Management, Development, and Good Practices", + "url" : "https://ieee.nitk.ac.in/blog/state-management-in-flutter/", + "date" : "04 Jun 2021", + "author" : "Ikjot Singh Dhody", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ikjotsingh.jpg" + } , + + { + "title" : "Image Steganography", + "category" : "Diode", + "tags" : "IEEE NITK, Steganography, and Encryption Techniques", + "url" : "https://ieee.nitk.ac.in/blog/image-steganography/", + "date" : "04 Jun 2021", + "author" : "Garvin Pokhra", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/garvin-pokhra.jpg" + } , + + { + "title" : "The First 20 Hours", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/first-20-hours/", + "date" : "04 Jun 2021", + "author" : "Yuvasankar B", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "An Introduction to Matrix Exponentiation", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, DP, Matrix Exponentiation, Competitive Programming, and Algorithms", + "url" : "https://ieee.nitk.ac.in/blog/An-Introduction-to-Matrix-Exponentiation/", + "date" : "28 May 2021", + "author" : "Anirudh Achal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/AnirudhAchal.JPG" + } , + + { + "title" : "The Revolution called DDR", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, DDR, RAM, and Digital Systems", + "url" : "https://ieee.nitk.ac.in/blog/the-revolution-called-ddr/", + "date" : "28 May 2021", + "author" : "Kruti Deepan Panda", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Neural Landers", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/neural-landers/", + "date" : "28 May 2021", + "author" : "Viba R Udupa", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/viba-r-udupa.jpg" + } , + + { + "title" : "Once upon a time in Fiction", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/once-upon-a-time-in-fiction/", + "date" : "21 May 2021", + "author" : "Varshini C", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/varshini_c.jpeg" + } , + + { + "title" : "CAN Bus Protocol", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, and Communication Protocol", + "url" : "https://ieee.nitk.ac.in/blog/can-bus-protocol/", + "date" : "21 May 2021", + "author" : "Sahaj Saxena", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Neural Style Transfer", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, Style Transfer, Deep Learning, and Unsupervised Learning", + "url" : "https://ieee.nitk.ac.in/blog/Neural-style-transfer/", + "date" : "21 May 2021", + "author" : "K Dharmick Sai", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/dharmick.jpg" + } , + + { + "title" : "What is the future of power generation?", + "category" : "Piston", + "tags" : "IEEE NITK, Piston, Power Generation, and Civil", + "url" : "https://ieee.nitk.ac.in/blog/future-of-power-generation/", + "date" : "14 May 2021", + "author" : "Pramod Sunil Parande", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "ConvNets: What, Why and How?", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, Machine Learning, and Deep Learning", + "url" : "https://ieee.nitk.ac.in/blog/convnets/", + "date" : "14 May 2021", + "author" : "M Shreyas Rao", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "A Beginner's Guide to Microservices", + "category" : "CompSoc", + "tags" : "Microservices, Cloud, and Systems", + "url" : "https://ieee.nitk.ac.in/blog/microservices/", + "date" : "14 May 2021", + "author" : "Gaurang Velingkar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/gaurang.jpg" + } , + + { + "title" : "My Two Snowflakes", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/my-two-snowflakes/", + "date" : "07 May 2021", + "author" : "Erin Sam Joe", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "What is Reinforcement Learning capable of?", + "category" : "CompSoc", + "tags" : "Reinforcement Learning, Games, Robotics, and Multi-Agent Systems", + "url" : "https://ieee.nitk.ac.in/blog/applications-of-RL/", + "date" : "07 May 2021", + "author" : "Aryaman M", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/aryaman.jpg" + } , + + { + "title" : "Gramophone Gaana - Old Is Gold", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, and Audio recording and reproduction", + "url" : "https://ieee.nitk.ac.in/blog/gramophone-gaana/", + "date" : "07 May 2021", + "author" : "Akash S Bharadwaj", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Water-Jet Guided Laser Cutting", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/water-jet-guided-laser-cutting/", + "date" : "11 Feb 2021", + "author" : "Mallikarjun G M", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Metamaterials", + "category" : "Piston", + "tags" : "IEEE NITK, Piston, and Materials", + "url" : "https://ieee.nitk.ac.in/blog/metamaterials/", + "date" : "28 Jan 2021", + "author" : "Ananya P", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "An intuition on how RNN and LSTM works", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, RNN, LSTM, and Machine Learning", + "url" : "https://ieee.nitk.ac.in/blog/an-intuition-on-how-RNN-and-LSTM-works/", + "date" : "07 Jan 2021", + "author" : "Rakshit P", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rakshit_p.jpeg" + } , + + { + "title" : "Elegant Algorithms using Randomization", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, Algorithms, and Randomization", + "url" : "https://ieee.nitk.ac.in/blog/Elegant-Algorithms-Using-Randomization/", + "date" : "07 Jan 2021", + "author" : "Chaithanya Shyam D", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "The Elliptic Curve Cryptography", + "category" : "CompSoc", + "tags" : "IEEE NITK, Theoretical Computer Science, ECC, and Cryptography", + "url" : "https://ieee.nitk.ac.in/blog/the-elliptic-curve-cryptography/", + "date" : "05 Jan 2021", + "author" : "Rakshita Varadarajan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rakshitavaradarajan.jpg" + } , + + { + "title" : "Why Python Shouldn't be your First Programming Language", + "category" : "CompSoc", + "tags" : "IEEE NITK, Python, and Programming", + "url" : "https://ieee.nitk.ac.in/blog/why-python-shouldnt-be-your-first-programming-language/", + "date" : "03 Jan 2021", + "author" : "Nishant Nayak", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/nishant_nayak.jpg" + } , + + { + "title" : "How are researchers and their research rated?", + "category" : "Piston", + "tags" : "Research and Researchers", + "url" : "https://ieee.nitk.ac.in/blog/researchers-and-rating-their-research/", + "date" : "12 Nov 2020", + "author" : "Shivansh Joshi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "An Introduction to PyTorch", + "category" : "CompSoc/Diode/Piston", + "tags" : "Deep Learning, Machine Learning, and Python", + "url" : "https://ieee.nitk.ac.in/blog/intro-to-pytorch/", + "date" : "14 Oct 2020", + "author" : "Shruthan R", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shruthan.jpg" + } , + + { + "title" : "An Introduction to Minimax Algorithm", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, Artificial Intelligence, Algorithms, Strategy, and Game Theory", + "url" : "https://ieee.nitk.ac.in/blog/minimax-algorithm/", + "date" : "14 Oct 2020", + "author" : "Shreeraksha R Aithal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shreeraksha.jpg" + } , + + { + "title" : "EKRANOPLAN", + "category" : "Piston", + "tags" : "Ekranoplan", + "url" : "https://ieee.nitk.ac.in/blog/updatedekranoplan/", + "date" : "15 Apr 2020", + "author" : "Abhishek R", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/raghunathabhishek.png" + } , + + { + "title" : "Communication Protocols Part 1", + "category" : "Diode", + "tags" : "Communication, Protocols, and Synchronous", + "url" : "https://ieee.nitk.ac.in/blog/communication-protocols-part1/", + "date" : "15 Apr 2020", + "author" : "Rahul M Hanchate", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rmhanchate.png" + } , + + { + "title" : "A Dive into Git Directory", + "category" : "CompSoc", + "tags" : "Git, Github, and Bash", + "url" : "https://ieee.nitk.ac.in/blog/a-dive-into-git-directory/", + "date" : "15 Apr 2020", + "author" : "Ameya Deshpande", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ameyanrd.png" + } , + + { + "title" : "Genome Editing", + "category" : "Piston", + "tags" : "IEEE NITK and Genome Editing", + "url" : "https://ieee.nitk.ac.in/blog/Genome-Editing/", + "date" : "14 Mar 2020", + "author" : "B. Sai Prasad", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/bsaiprasad.jpeg" + } , + + { + "title" : "Application of Neural Networks in Power Systems", + "category" : "Diode", + "tags" : "IEEE NITK, Power Systems, Neural Networks, and Machine Learning", + "url" : "https://ieee.nitk.ac.in/blog/Applications-of-Neural-Networks-in-Power-Systems/", + "date" : "14 Mar 2020", + "author" : "Aditya C", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/aditya-c.jpeg" + } , + + { + "title" : "What is machine learning?", + "category" : "Diode", + "tags" : "IEEE NITK and Machine Learning", + "url" : "https://ieee.nitk.ac.in/blog/What-is-Machine-Learning/", + "date" : "07 Mar 2020", + "author" : "Adithya Kannan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/AdithyaKannan250.jpg" + } , + + { + "title" : "An Overview of Tarjan's Algorithm", + "category" : "CompSoc", + "tags" : "IEEE NITK and CompSoc", + "url" : "https://ieee.nitk.ac.in/blog/TarjansAlgo/", + "date" : "07 Mar 2020", + "author" : "Aditya Sohoni", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/adityasoho.jpg" + } , + + { + "title" : "SLAM Coverage Algorithms", + "category" : "Piston", + "tags" : "IEEE NITK and Piston", + "url" : "https://ieee.nitk.ac.in/blog/SLAM/", + "date" : "07 Mar 2020", + "author" : "Jai Mandal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/JaiMandal250jpg" + } , + + { + "title" : "Solving a traffic problem using graph decomposition", + "category" : "CompSoc", + "tags" : "Algorithms and Graph Theory", + "url" : "https://ieee.nitk.ac.in/blog/Solving-a-traffic-problem-using-graph-decomposition/", + "date" : "21 Feb 2020", + "author" : "Varun Raghavendra", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/VarunRaghavendra.jpg" + } , + + { + "title" : "Web Vulnerabilities", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, web, and vulnerabilities", + "url" : "https://ieee.nitk.ac.in/blog/web-vulnerabilities/", + "date" : "15 Jan 2020", + "author" : "Vineeth Rajesh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Vineeth.jpg" + } , + + { + "title" : "PSLV to Mars", + "category" : "Piston", + "tags" : "IEEE NITK, Piston, PSLV, and Mars", + "url" : "https://ieee.nitk.ac.in/blog/pslv-to-mars/", + "date" : "15 Jan 2020", + "author" : "Ekta Ramnani", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/EktaRamnani.jpg" + } , + + { + "title" : "Piezoelectricity and Piezoelectric Sensors", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, Piezoelectricity, and Sensors", + "url" : "https://ieee.nitk.ac.in/blog/piezoelectricity-and-piezoelectric-sensors/", + "date" : "15 Jan 2020", + "author" : "Kaushik Alwala", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/KaushikAlwala.jpeg" + } , + + { + "title" : "A Comprehensive Guide to Li-Fi", + "category" : "CompSoc", + "tags" : "Li-Fi and Wireless Networks", + "url" : "https://ieee.nitk.ac.in/blog/A-Comprehensive-Guide-To-LiFi/", + "date" : "07 Jan 2020", + "author" : "Krithik Vaidya", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/krithikvaidya.jpeg" + } , + + { + "title" : "DS1: A demonstration spacecraft and its communication aspects", + "category" : "Diode", + "tags" : "RF transmission and Antennas", + "url" : "https://ieee.nitk.ac.in/blog/ds1-a-demonstration-spacecraft-and-its-communication-aspects/", + "date" : "07 Jan 2020", + "author" : "A Shrikant", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ashrikant39.jpg" + } , + + { + "title" : "Autopilot", + "category" : "Piston", + "tags" : "Autopilot and Modern Aircraft", + "url" : "https://ieee.nitk.ac.in/blog/autopilot/", + "date" : "07 Jan 2020", + "author" : "Sharayu Brahmankar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sharayu_brahmankar.jpg" + } , + + { + "title" : "Stem Cell Technology", + "category" : "Piston", + "tags" : "stem cells, Piston, and IEEE NITK", + "url" : "https://ieee.nitk.ac.in/blog/stem_cells/", + "date" : "30 Dec 2019", + "author" : "Ishita Goyal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ishita.jpeg" + } , + + { + "title" : "Bluetooth Low Energy", + "category" : "Diode", + "tags" : "low power, wireless communication, Diode, and IEEE NITK", + "url" : "https://ieee.nitk.ac.in/blog/Bluetooth-Low-Energy/", + "date" : "30 Dec 2019", + "author" : "Suraj Kulkarni", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/suraj.jpg" + } , + + { + "title" : "An Introduction To WebSockets", + "category" : "CompSoc", + "tags" : "Web, Web Sockets, and Networks", + "url" : "https://ieee.nitk.ac.in/blog/An-Intro-to-WebSockets/", + "date" : "30 Dec 2019", + "author" : "P Akshara", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/akshara.jpg" + } , + + { + "title" : "Why do Generative Adversarial Nets matter?", + "category" : "CompSoc", + "tags" : "Deep Learning, Generative Adversarial Networks, GANs, Generative Models, Machine Learning, CompSoc, and IEEE NITK", + "url" : "https://ieee.nitk.ac.in/blog/why-do-GANs-matter/", + "date" : "10 Nov 2019", + "author" : "Videh Raj Nema", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/videh.png" + } , + + { + "title" : "Who doesn't want to live on another planet?", + "category" : "Piston", + "tags" : "Piston and IEEE NITK", + "url" : "https://ieee.nitk.ac.in/blog/colonization-of-mars/", + "date" : "10 Nov 2019", + "author" : "Drishika Nadella", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/drishika.png" + } , + + { + "title" : "Bionics - The Gap between disability and ability", + "category" : "Diode", + "tags" : "Diode and IEEE NITK", + "url" : "https://ieee.nitk.ac.in/blog/bionics/", + "date" : "10 Nov 2019", + "author" : "Nikhil Nair", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/nikhil.png" + } , + + { + "title" : "Generate Strange Text with GPT-2", + "category" : "CompSoc", + "tags" : "NLP and ML/AI", + "url" : "https://ieee.nitk.ac.in/blog/generate-text-with-gpt2/", + "date" : "02 Nov 2019", + "author" : "Kinshuk Kashyap", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/kinshuk.jpg" + } , + + { + "title" : "Future of Drones", + "category" : "Diode", + "tags" : "", + "url" : "https://ieee.nitk.ac.in/blog/future-of-drones/", + "date" : "02 Nov 2019", + "author" : "Sai Kumar Dande", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Concorde: Why did it fail?", + "category" : "Piston", + "tags" : "", + "url" : "https://ieee.nitk.ac.in/blog/concorde/", + "date" : "02 Nov 2019", + "author" : "Kartik Udaya Nayak", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/kartik.jpeg" + } , + + { + "title" : "Forward Swept Wings", + "category" : "Piston", + "tags" : "Piston and Aeronautics", + "url" : "https://ieee.nitk.ac.in/blog/forward-swept-wings/", + "date" : "08 Oct 2019", + "author" : "Vehan Doshi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/vehan_doshi.jpeg" + } , + + { + "title" : "Space-based Solar Power", + "category" : "Diode", + "tags" : "Diode, Space, and Solar Power", + "url" : "https://ieee.nitk.ac.in/blog/space-based-solar-power/", + "date" : "08 Oct 2019", + "author" : "Jyotsna M", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/jyotsna.jpeg" + } , + + { + "title" : "Password Security: Techniques and Challenges", + "category" : "CompSoc", + "tags" : "Systems, Security, and Cryptography", + "url" : "https://ieee.nitk.ac.in/blog/password-security-techniques-and-challenges/", + "date" : "02 Oct 2019", + "author" : "Suhas K S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/suhas_ks.jpeg" + } , + + { + "title" : "Research, an informal testimony", + "category" : "Piston", + "tags" : "Requirements and Research", + "url" : "https://ieee.nitk.ac.in/blog/Requirements-and-Importance-of-Research/", + "date" : "22 Aug 2019", + "author" : "KV Krishna", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/krishnakv98.jpeg" + } , + + { + "title" : "Long Short Term Memory Neural Networks", + "category" : "CompSoc", + "tags" : "Recurrent Neural Networks, Long Short Term Memory Neural Networks, and Machine Learning", + "url" : "https://ieee.nitk.ac.in/blog/Long-Short-Term-Neural-Networks/", + "date" : "22 Aug 2019", + "author" : "Akash Nair", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/akashnair.jpeg" + } , + + { + "title" : "Radar Imaging", + "category" : "Diode", + "tags" : "RADARSs, Doppler Processing, and Image", + "url" : "https://ieee.nitk.ac.in/blog/Radar-Imaging/", + "date" : "22 Aug 2019", + "author" : "Rohit Manohar Kulkarni", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/RohitMKulkarni.jpg" + } , + + { + "title" : "ELF Files in Linux", + "category" : "CompSoc", + "tags" : "ELF, Linux, and Binary", + "url" : "https://ieee.nitk.ac.in/blog/ELF-Files-in-Linux/", + "date" : "09 Mar 2019", + "author" : "Arpitha Raghunandan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/arpitharaghunandan.jpeg" + } , + + { + "title" : "Solving Switch Riddle using RL", + "category" : "CompSoc", + "tags" : "Switch Riddle, Reinforcement Learning, DIAL, and RNN", + "url" : "https://ieee.nitk.ac.in/blog/Solving-Switch-Riddle-using-RL/", + "date" : "28 Feb 2019", + "author" : "Madhuparna Bhowmik", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Madhuparna.jpeg" + } , + + { + "title" : "How machine translation works", + "category" : "CompSoc", + "tags" : "Natural Language Processing, Supervised learning, and Machine translation", + "url" : "https://ieee.nitk.ac.in/blog/machine-translation/", + "date" : "02 Feb 2019", + "author" : "Tanmai H", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/tanmai.jpg" + } , + + { + "title" : "Machine Learning Magic", + "category" : "CompSoc", + "tags" : "Machine learning, Supervised learning, and tweets", + "url" : "https://ieee.nitk.ac.in/blog/machine-learning-magic/", + "date" : "26 Jan 2019", + "author" : "Kumar Saharsh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/saharsh007.jpg" + } , + + { + "title" : "INNOVATIONS IN THE DRONE INDUSTRY", + "category" : "Piston", + "tags" : "Drones", + "url" : "https://ieee.nitk.ac.in/blog/innovations-in-drone-industry/", + "date" : "26 Jan 2019", + "author" : "KushagraRawat", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/KushagraRawat.jpg" + } , + + { + "title" : "Social Engineering", + "category" : "CompSoc", + "tags" : "Social engineering and Security", + "url" : "https://ieee.nitk.ac.in/blog/social-engineering/", + "date" : "18 Jan 2019", + "author" : "Pranav P", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "The Missing Circuit Element", + "category" : "Diode", + "tags" : "Memresistor and Non Volatile Memory", + "url" : "https://ieee.nitk.ac.in/blog/the-missing-circuit-element/", + "date" : "15 Jan 2019", + "author" : "S.R. Sahith", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Heard of Smart Contracts yet?", + "category" : "CompSoc", + "tags" : "Blockchain 2.0 and Smart Contract", + "url" : "https://ieee.nitk.ac.in/blog/smart-contracts/", + "date" : "15 Jan 2019", + "author" : "Prajwal S Belagavi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/PrajwalSBelagavi.jpg" + } , + + { + "title" : "Self Healing Materials", + "category" : "Piston", + "tags" : "Biochemistry, Self Healing Materials, and Machines", + "url" : "https://ieee.nitk.ac.in/blog/self-healing-material/", + "date" : "15 Jan 2019", + "author" : "Smrithi S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Photocatalytic Detoxification", + "category" : "Piston", + "tags" : "Photochemical Reactions, Photo catalysts, Catalysis, Photo Catalysis, Nanotechnology, Semiconductors, and Colloidal semiconductors", + "url" : "https://ieee.nitk.ac.in/blog/photocatalytic-decomposition/", + "date" : "29 Dec 2018", + "author" : "Tirth Savla", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/tirthsavla.jpg" + } , + + { + "title" : "Intro To The MapReduce Programming Paradigm", + "category" : "CompSoc", + "tags" : "Parallel Computing, Big Data Processing, Distributed Systems, and Cloud Computing", + "url" : "https://ieee.nitk.ac.in/blog/an-intro-to-the-map-reduce-programming-paradigm/", + "date" : "29 Dec 2018", + "author" : "Abhinav P Y", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/abhinavpy.jpg" + } , + + { + "title" : "Thermal Imaging", + "category" : "Diode", + "tags" : "Computer Vision, Thermal Vision, Image Processing, IR, and Sensors", + "url" : "https://ieee.nitk.ac.in/blog/thermal-imaging/", + "date" : "29 Dec 2018", + "author" : "Kumar Alabhya", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/alabhya01.jpg" + } , + + { + "title" : "NanoMedicine", + "category" : "Piston", + "tags" : "NanoMedicine, Targeted drug delivery, Overlooked advancements, and EPR effect", + "url" : "https://ieee.nitk.ac.in/blog/nano-medicine/", + "date" : "22 Dec 2018", + "author" : "Manoj A B", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ManojAB.jpg" + } , + + { + "title" : "How Computers learn to play games!", + "category" : "CompSoc", + "tags" : "Computer Games, Reinforcement Learning, Monte Carlo Tree Search, and Alpha-Go", + "url" : "https://ieee.nitk.ac.in/blog/how-computers-learn-to-play-games/", + "date" : "22 Dec 2018", + "author" : "Madhuparna Bhowmik", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Madhuparna.jpeg" + } , + + { + "title" : "GaN: Gate to New era", + "category" : "Diode", + "tags" : "galliumnitride, GaN, transistors, wafers, silicon, newsilicon, and technology", + "url" : "https://ieee.nitk.ac.in/blog/GaN/", + "date" : "22 Dec 2018", + "author" : "Vishal Shukla", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Vishal.jpg" + } , + + { + "title" : "Why you should learn Flutter?", + "category" : "CompSoc", + "tags" : "Flutter, Android, Dart, and Cross platform mobile development", + "url" : "https://ieee.nitk.ac.in/blog/why-you-should-learn-flutter/", + "date" : "15 Dec 2018", + "author" : "Vaibhav G", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/gvaibhav1734.jpg" + } , + + { + "title" : "Nanosheets decorated with DNA", + "category" : "Piston", + "tags" : "Nanosheets, DNA, and Nanotechnology", + "url" : "https://ieee.nitk.ac.in/blog/nanosheets-decorated-with-dna/", + "date" : "15 Dec 2018", + "author" : "Aditi Marathe", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Electronic skin", + "category" : "Diode", + "tags" : "Electronic, Skin, Healthcare, Robotics, Embedded, Prosthetic, Sensor, Stretchable, and Nanoparticles", + "url" : "https://ieee.nitk.ac.in/blog/electronic-skin/", + "date" : "15 Dec 2018", + "author" : "Rakshana G", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rakshana_g.jpg" + } , + + { + "title" : "NanoMachines", + "category" : "Piston", + "tags" : "MEMS, NEMS, Nanotechnology, and Biomedics", + "url" : "https://ieee.nitk.ac.in/blog/nanomachines/", + "date" : "08 Dec 2018", + "author" : "Shaswata Bose", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ShaswataBose.jpeg" + } , + + { + "title" : "Gesture Controlled Robot", + "category" : "Diode", + "tags" : "Gesture controlled, accelerometer, RF transmitter, RF receiver, and motor driver", + "url" : "https://ieee.nitk.ac.in/blog/gesture-controlled-robot/", + "date" : "08 Dec 2018", + "author" : "Deepanshi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Cloud Gaming", + "category" : "CompSoc", + "tags" : "Gaming, Cloud, Google Project Stream, and Nvidia Now", + "url" : "https://ieee.nitk.ac.in/blog/cloud-gaming/", + "date" : "08 Dec 2018", + "author" : "Aakash Singh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/17aakashsingh1999.jpg" + } , + + { + "title" : "Zero Knowledge Proof", + "category" : "CompSoc", + "tags" : "ZKP and Cryptography", + "url" : "https://ieee.nitk.ac.in/blog/zero-knowledge-proof/", + "date" : "01 Dec 2018", + "author" : "Arpitha Raghunandan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/arpitharaghunandan.jpeg" + } , + + { + "title" : "MicroLED", + "category" : "Diode", + "tags" : "LED, Television, and Micro", + "url" : "https://ieee.nitk.ac.in/blog/microled/", + "date" : "01 Dec 2018", + "author" : "Suraj Jagannath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/suraj_jagganath.jpg" + } , + + { + "title" : "Ballistics", + "category" : "Piston", + "tags" : "Ballistics", + "url" : "https://ieee.nitk.ac.in/blog/ballistics/", + "date" : "01 Dec 2018", + "author" : "Rahul R L", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rahul_rl.jpg" + } , + + { + "title" : "Organic Photovoltaics", + "category" : "Diode", + "tags" : "Organic Photovoltaics, Excitons, and Photo-active layer", + "url" : "https://ieee.nitk.ac.in/blog/organic-photovoltaics/", + "date" : "10 Nov 2018", + "author" : "Iteesha Ashwath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "MEMS", + "category" : "Piston", + "tags" : "MEMS", + "url" : "https://ieee.nitk.ac.in/blog/mems/", + "date" : "10 Nov 2018", + "author" : "Avinash Kumar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/avinashkumar.jpg" + } , + + { + "title" : "Demystifying Deconvolutions", + "category" : "CompSoc", + "tags" : "Deep Learning, Convolution, Up-sampling, and Neural Networks", + "url" : "https://ieee.nitk.ac.in/blog/deconv/", + "date" : "10 Nov 2018", + "author" : "Deepak K", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/deepakkavoor.jpg" + } , + + { + "title" : "Supercapacitors", + "category" : "Diode", + "tags" : "Supercapacitors, Energy Storage, Futurology, Batteries, and Renewables", + "url" : "https://ieee.nitk.ac.in/blog/supercap/", + "date" : "03 Nov 2018", + "author" : "Naman Agarwal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/NamamAgarwal.jpeg" + } , + + { + "title" : "KMP Algorithm", + "category" : "CompSoc", + "tags" : "KMP, Strings, Competitive Programming, and C++", + "url" : "https://ieee.nitk.ac.in/blog/kmp-algorithm/", + "date" : "03 Nov 2018", + "author" : "TSS Chandana", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Chans321.jpg" + } , + + { + "title" : "Drive By Wire", + "category" : "Piston", + "tags" : "Drive by wire, Steer by wire, and Autonomous vehicle", + "url" : "https://ieee.nitk.ac.in/blog/by-wire/", + "date" : "03 Nov 2018", + "author" : "Smit Rambhiya", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/SmitRambhiya.jpg" + } , + + { + "title" : "Coronary Stents", + "category" : "Piston", + "tags" : "heart, disease, treatment, and surgeries", + "url" : "https://ieee.nitk.ac.in/blog/coronary-stents/", + "date" : "28 Oct 2018", + "author" : "Aravind G", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/aravindg.jpg" + } , + + { + "title" : "Electronic Aspirin", + "category" : "Diode", + "tags" : "electronics, neurostimulators, remote control, and SPG", + "url" : "https://ieee.nitk.ac.in/blog/electronic-aspirin/", + "date" : "28 Oct 2018", + "author" : "Deeksha M S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Web 3.0: The upcoming Web revolution", + "category" : "CompSoc", + "tags" : "Web 3.0, Ethereum, and Blockchains", + "url" : "https://ieee.nitk.ac.in/blog/web-3-0/", + "date" : "28 Oct 2018", + "author" : "Govardhan G D", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Vortices", + "category" : "Piston", + "tags" : "aerodynamics, vortex, formula 1, aviation, flight, airflow, and fluids", + "url" : "https://ieee.nitk.ac.in/blog/vortices/", + "date" : "21 Oct 2018", + "author" : "Darren Charles Fernandes", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/DarrenFernandes.jpeg" + } , + + { + "title" : "Light backscatter application", + "category" : "Diode", + "tags" : "light backscatter, fat content in milk, gerber method, and coagulating milk", + "url" : "https://ieee.nitk.ac.in/blog/light-backscatter-application/", + "date" : "21 Oct 2018", + "author" : "Rohit Khoja", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rohitkhoja.jpg" + } , + + { + "title" : "Why 'you' need GPU", + "category" : "CompSoc", + "tags" : "GPU and parallel computing", + "url" : "https://ieee.nitk.ac.in/blog/why-you-need-gpu/", + "date" : "21 Oct 2018", + "author" : "Rohit M P", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rohit-mp.jpg" + } , + + { + "title" : "Varistor", + "category" : "Diode", + "tags" : "IEEE NITK, Diode, resistors, capacitors, zener diode, voltage transients, and regulators", + "url" : "https://ieee.nitk.ac.in/blog/varistor/", + "date" : "14 Oct 2018", + "author" : "Prithvi Patil", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/PrithviPatil.jpg" + } , + + { + "title" : "Automate The Industries", + "category" : "Piston", + "tags" : "IEEE NITK, Piston, Automation, Industries, Robots, and Manufacturing", + "url" : "https://ieee.nitk.ac.in/blog/automate-the-industries/", + "date" : "14 Oct 2018", + "author" : "Nisarg B Shah", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/NisargBShah.jpg" + } , + + { + "title" : "Why Machine Learning Matters ?", + "category" : "CompSoc", + "tags" : "IEEE NITK, CompSoc, Machine Learning, and Artificial Intelligence", + "url" : "https://ieee.nitk.ac.in/blog/why-machine-learning-matters/", + "date" : "14 Oct 2018", + "author" : "Siddhartha M", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/siddhartha.jpg" + } , + + { + "title" : "Phase Change Material", + "category" : "Piston", + "tags" : "Storage Device and Material", + "url" : "https://ieee.nitk.ac.in/blog/phase-change-material/", + "date" : "08 Oct 2018", + "author" : "Anurag P K", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anurag.jpg" + } , + + { + "title" : "Avionics", + "category" : "Diode", + "tags" : "Drone, Hobbycraft, Avionics, and Flight Control", + "url" : "https://ieee.nitk.ac.in/blog/avionics/", + "date" : "07 Oct 2018", + "author" : "Chethan M", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/chethan.jpg" + } , + + { + "title" : "Segment Trees", + "category" : "CompSoc", + "tags" : "Competitive Programming and Segment Trees", + "url" : "https://ieee.nitk.ac.in/blog/segment-tree/", + "date" : "07 Oct 2018", + "author" : "Shantanu S Rai", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shanthanu.jpeg" + } , + + { + "title" : "Nanoparticle-Wonder Liquid", + "category" : "Diode", + "tags" : "nanotechnology, nanomedicine, magnetoserum, and panacea", + "url" : "https://ieee.nitk.ac.in/blog/nanoparticle-wonder-liquid/", + "date" : "16 Sep 2018", + "author" : "Rohit Manohar Kulkarni", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/RohitMKulkarni.jpg" + } , + + { + "title" : "Cloud Computing", + "category" : "CompSoc", + "tags" : "Cloud Computing and AWS", + "url" : "https://ieee.nitk.ac.in/blog/cloud-computing/", + "date" : "16 Sep 2018", + "author" : "Saurabh Agarwala", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/SaurabhAgarwala.jpg" + } , + + { + "title" : "Biomicry: Creating A Truly Sustainable Environment", + "category" : "Piston", + "tags" : "Biomicry", + "url" : "https://ieee.nitk.ac.in/blog/biomicry-creating-a-truly-sustainable-environment/", + "date" : "15 Sep 2018", + "author" : "KushagraRawat", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/KushagraRawat.jpg" + } , + + { + "title" : "BIO(logy and electro)NICS", + "category" : "Diode", + "tags" : "Biology, Electronics, and Bionics", + "url" : "https://ieee.nitk.ac.in/blog/biology-and-electronics/", + "date" : "09 Sep 2018", + "author" : "Anirudh Ashok Aatresh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/AnirudhAA.jpeg" + } , + + { + "title" : "THE NEW BIOMETRIC - BRAINPRINT", + "category" : "Piston", + "tags" : "biometrics and brainprint", + "url" : "https://ieee.nitk.ac.in/blog/the-new-biometric-brainprint/", + "date" : "09 Sep 2018", + "author" : "Preeti J Kalloli", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/PreetiKalloli.jpeg" + } , + + { + "title" : "Proof-of-work as a consensus mechanism in blockchains", + "category" : "CompSoc", + "tags" : "Blockchain, Consensus, Distributed systems", + "url" : "https://ieee.nitk.ac.in/blog/pow-consensus-blockchain/", + "date" : "08 Sep 2018", + "author" : "Nisarg Joshi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/nisargJ.jpg" + } , + + { + "title" : "Quantum Supremacy: Is it hyped?", + "category" : "CompSoc", + "tags" : "Quantum Computing", + "url" : "https://ieee.nitk.ac.in/blog/quantum-supremacy/", + "date" : "23 Jun 2018", + "author" : "Shashank P", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shashank_p.jpg" + } , + + { + "title" : "Evolving Strings with Genetic Algorithms", + "category" : "CompSoc", + "tags" : "Machine Learning, Genetic Algorithms, String, Genes, and Chromosome", + "url" : "https://ieee.nitk.ac.in/blog/string-genetic/", + "date" : "19 Jun 2018", + "author" : "Gurupungav Narayanan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/guru.jpg" + } , + + { + "title" : "Nanomotors", + "category" : "Piston", + "tags" : "Nanotechnology, Nano motors, Motors, ATP, and Biology", + "url" : "https://ieee.nitk.ac.in/blog/nanomotors/", + "date" : "18 Jun 2018", + "author" : "Sanath K.", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sanath.jpg" + } , + + { + "title" : "Earthing Systems", + "category" : "Diode", + "tags" : "heavy electronics", + "url" : "https://ieee.nitk.ac.in/blog/earthing-systems/", + "date" : "17 Jun 2018", + "author" : "Shreeram Hegde", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Chain of Things", + "category" : "Diode", + "tags" : "blockchain and IoT", + "url" : "https://ieee.nitk.ac.in/blog/chain-of-things/", + "date" : "10 Jun 2018", + "author" : "Mehak Arora", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/mehak.jpg" + } , + + { + "title" : "Diving into and Exploiting the Heap", + "category" : "CompSoc", + "tags" : "heap, exploitation, memory, and allocation", + "url" : "https://ieee.nitk.ac.in/blog/heap_exploitation/", + "date" : "06 Jun 2018", + "author" : "Suraj Singh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/suraj.png" + } , + + { + "title" : "Computational Approaches of Shock Waves", + "category" : "Piston", + "tags" : "Piston, Shock Waves, and CFD", + "url" : "https://ieee.nitk.ac.in/blog/computational-approaches-of-shock-waves/", + "date" : "06 Jun 2018", + "author" : "Shashank Ravichandir", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Charge Crowding", + "category" : "Diode", + "tags" : "CAS/SPS and electronic devices", + "url" : "https://ieee.nitk.ac.in/blog/charge-crowding/", + "date" : "06 Jun 2018", + "author" : "Sampath Koti", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Why 50Hz ?", + "category" : "Diode", + "tags" : "electric power grid and 50Hz frequency", + "url" : "https://ieee.nitk.ac.in/blog/why-50hz/", + "date" : "29 May 2018", + "author" : "Megh Bhalerao", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/megh_bhalerao.jpeg" + } , + + { + "title" : "Market Basket Analysis", + "category" : "CompSoc", + "tags" : "Data mining and Apriori", + "url" : "https://ieee.nitk.ac.in/blog/market-basket/", + "date" : "29 May 2018", + "author" : "Anumeha Agrawal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anumeha.jpeg" + } , + + { + "title" : "Alterego", + "category" : "Piston", + "tags" : "Alterego", + "url" : "https://ieee.nitk.ac.in/blog/alterego/", + "date" : "29 May 2018", + "author" : "Sinchana Hegde", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sinchana.jpg" + } , + + { + "title" : "Envision Project 3: Regenerative Braking", + "category" : "Envision", + "tags" : "Braking", + "url" : "https://ieee.nitk.ac.in/blog/regenerative-braking/", + "date" : "21 May 2018", + "author" : "Salman Shah", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/salman_shah.jpg" + } , + + { + "title" : "Washable Electronics using Water repellant Graphene Circuits", + "category" : "Piston", + "tags" : "graphene and electronics", + "url" : "https://ieee.nitk.ac.in/blog/washable-electronics/", + "date" : "16 May 2018", + "author" : "Sonal S. Parab", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "QEMU/KVM for Virtual Machines", + "category" : "CompSoc", + "tags" : "virtualization and qemu", + "url" : "https://ieee.nitk.ac.in/blog/qemu-virtualization/", + "date" : "16 May 2018", + "author" : "Archit Pandey", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/archit.jpg" + } , + + { + "title" : "Amazon Go - Cashier Less Shopping", + "category" : "Diode", + "tags" : "IoT and Spatial Imaging", + "url" : "https://ieee.nitk.ac.in/blog/amazon-go/", + "date" : "16 May 2018", + "author" : "Anirudh Sundar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anirudhsundar.jpg" + } , + + { + "title" : "Envision Project 2: Smart Lighting Systems", + "category" : "Envision", + "tags" : "IoT", + "url" : "https://ieee.nitk.ac.in/blog/smart-lighting-systems/", + "date" : "13 May 2018", + "author" : "Anirudh B H", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anirudh.jpg" + } , + + { + "title" : "Envision Project 1 - Professor Matching for Research Internships", + "category" : "Envision", + "tags" : "Android, Web, and Django", + "url" : "https://ieee.nitk.ac.in/blog/prof-matching-envision/", + "date" : "06 May 2018", + "author" : "Anirudh B H", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anirudh.jpg" + } , + + { + "title" : "Evolution of bicycle", + "category" : "Piston", + "tags" : "Piston", + "url" : "https://ieee.nitk.ac.in/blog/evolution-of-bicycle/", + "date" : "17 Feb 2018", + "author" : "Aditya Prabhu", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/aditya.jpg" + } , + + { + "title" : "Electric Cars - The Future", + "category" : "Diode", + "tags" : "Electric Cars and CAS/SPS", + "url" : "https://ieee.nitk.ac.in/blog/electric-cars/", + "date" : "17 Feb 2018", + "author" : "Sachin Sampath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sachin.png" + } , + + { + "title" : "t-SNE", + "category" : "CompSoc", + "tags" : "Data Visualization, t-SNE, ML, and Data Visualization", + "url" : "https://ieee.nitk.ac.in/blog/tSNE/", + "date" : "16 Feb 2018", + "author" : "Chenna Keshava B S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ck.jpg" + } , + + { + "title" : "Bit Manipulation", + "category" : "CompSoc", + "tags" : "Bit masks, DP, Competitive Programming, and C++", + "url" : "https://ieee.nitk.ac.in/blog/bit-manipulation/", + "date" : "12 Jan 2018", + "author" : "Ashwin Joisa", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Aj163.png" + } , + + { + "title" : "Fluids and Satellites", + "category" : "Piston", + "tags" : "Fluid Dynamics and Satellites", + "url" : "https://ieee.nitk.ac.in/blog/fluids-and-satellites/", + "date" : "12 Jan 2018", + "author" : "KV Krishna", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/krishnakv98.jpeg" + } , + + { + "title" : "How is Technology Helping the Differently Abled People?", + "category" : "Diode", + "tags" : "differently-abled, assistive technology, text scanners, optical sensors, bionic, and eye tracking system.", + "url" : "https://ieee.nitk.ac.in/blog/how-is-technology-helping-the-differently-abled-people/", + "date" : "12 Jan 2018", + "author" : "Shruti Deshpande", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Shruti-Deshpande.jpeg" + } , + + { + "title" : "How do websites communicate securely?", + "category" : "CompSoc", + "tags" : "SSL and Public Key Cryptography", + "url" : "https://ieee.nitk.ac.in/blog/public-key-cryptography/", + "date" : "29 Dec 2017", + "author" : "Nishanth P Hebbar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Nishanth.jpg" + } , + + { + "title" : "War of the Currents", + "category" : "Diode", + "tags" : "Tesla, Edison, and AC/DC", + "url" : "https://ieee.nitk.ac.in/blog/war-of-the-currents/", + "date" : "29 Dec 2017", + "author" : "Aditya Rangarajan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/AdityaRangarajan.jpeg" + } , + + { + "title" : "Speed Printing", + "category" : "Piston", + "tags" : "Speed Printing and Stereolithography", + "url" : "https://ieee.nitk.ac.in/blog/speed-printing/", + "date" : "28 Dec 2017", + "author" : "Harshit Ranjan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/HarshithRanjan.jpg" + } , + + { + "title" : "How NASA discovered planets using Artificial Intelligence", + "category" : "CompSoc", + "tags" : "Space, Machine Learning, and Deep Learning", + "url" : "https://ieee.nitk.ac.in/blog/space-ml/", + "date" : "21 Dec 2017", + "author" : "Gurupungav Narayanan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/guru.jpg" + } , + + { + "title" : "The E INK", + "category" : "Diode", + "tags" : "E Ink", + "url" : "https://ieee.nitk.ac.in/blog/e-Ink/", + "date" : "21 Dec 2017", + "author" : "Satyam Shivam", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/satyam_shivam.jpg" + } , + + { + "title" : "The Rocker-Bogie Mechanism", + "category" : "Piston", + "tags" : "Space, Rovers, and Rocker Bogie", + "url" : "https://ieee.nitk.ac.in/blog/rocker-bogie/", + "date" : "21 Dec 2017", + "author" : "Nithin M Eapen", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "The Future of Computing: Quantum Computing", + "category" : "CompSoc", + "tags" : "Quantum Computing and Qubits", + "url" : "https://ieee.nitk.ac.in/blog/future-of-computing-quantum-computing/", + "date" : "18 Dec 2017", + "author" : "Rosa Anil George", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/RosaGeorge.jpeg" + } , + + { + "title" : "Airbag System for two Wheeler vehicles", + "category" : "Piston", + "tags" : "", + "url" : "https://ieee.nitk.ac.in/blog/the-airbag-system-for-two-wheeler-vehicle/", + "date" : "08 Dec 2017", + "author" : "Kiran Kumar G", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/kirankumar.jpg" + } , + + { + "title" : "BoT", + "category" : "Diode", + "tags" : "", + "url" : "https://ieee.nitk.ac.in/blog/bot/", + "date" : "08 Dec 2017", + "author" : "Ashwin Hebbar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Ashwin_Hebbar.jpg" + } , + + { + "title" : "A step ahead in Reverse Engineering!", + "category" : "CompSoc", + "tags" : "CTF, Ethical Hacking, and Security", + "url" : "https://ieee.nitk.ac.in/blog/a-step-ahead-in-reverse-engineering/", + "date" : "07 Dec 2017", + "author" : "Adwaith V Gautham", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/adwait.jpg" + } , + + { + "title" : "Radio Frequency Identification", + "category" : "Diode", + "tags" : "RFID and ADC", + "url" : "https://ieee.nitk.ac.in/blog/rfid/", + "date" : "20 Nov 2017", + "author" : "Mehak Arora", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/mehak.jpg" + } , + + { + "title" : "Machine Learning for Stock Market Investment", + "category" : "CompSoc", + "tags" : "Machine Learning, Stock Market, and Support Vector Machine", + "url" : "https://ieee.nitk.ac.in/blog/machine-learning-for-stock-market-investment/", + "date" : "20 Nov 2017", + "author" : "Suraj Singh", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/suraj.png" + } , + + { + "title" : "Evacuated Tube Collectors", + "category" : "Piston", + "tags" : "Energy, Renewables, and Thermal Sciences", + "url" : "https://ieee.nitk.ac.in/blog/evacuated-tube-collector/", + "date" : "20 Nov 2017", + "author" : "Sanath K.", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sanath.jpg" + } , + + { + "title" : "The Halting Problem", + "category" : "CompSoc", + "tags" : "Complexity theory, Logic, and Mathematics", + "url" : "https://ieee.nitk.ac.in/blog/the-halting-problem/", + "date" : "13 Nov 2017", + "author" : "Shashank P", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shashank_p.jpg" + } , + + { + "title" : "Design of Aircraft Windows", + "category" : "Piston", + "tags" : "Aeronautics", + "url" : "https://ieee.nitk.ac.in/blog/design-of-aircraft-windows/", + "date" : "12 Nov 2017", + "author" : "Shashank Ravichandir", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "How QR code was invented", + "category" : "Diode", + "tags" : "QR code", + "url" : "https://ieee.nitk.ac.in/blog/how-qr-code-was-invented/", + "date" : "12 Nov 2017", + "author" : "Shreeram Hegde", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Smart Grid", + "category" : "Diode", + "tags" : "Smart grid and Electric grid", + "url" : "https://ieee.nitk.ac.in/blog/smart-grid/", + "date" : "05 Nov 2017", + "author" : "Shama G Vasisht", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Magnetically repelling ice", + "category" : "Piston", + "tags" : "Magnetism", + "url" : "https://ieee.nitk.ac.in/blog/magnetically-repelling-ice/", + "date" : "05 Nov 2017", + "author" : "Sonal S. Parab", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "The Beginning Of The End - Have The Machines Won?", + "category" : "CompSoc", + "tags" : "Artificial Intelligence and AI threat", + "url" : "https://ieee.nitk.ac.in/blog/the-beginning-of-the-end-have-the-machines-won/", + "date" : "05 Nov 2017", + "author" : "Palak Singhal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/palak.jpg" + } , + + { + "title" : "Introduction to Docker", + "category" : "CompSoc", + "tags" : "Docker, Containers, and DevOps", + "url" : "https://ieee.nitk.ac.in/blog/introduction-to-docker/", + "date" : "30 Oct 2017", + "author" : "Mahim Agrawal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/mahim_agrawal.jpg" + } , + + { + "title" : "The LIGO Experiment", + "category" : "Diode", + "tags" : "LIGO", + "url" : "https://ieee.nitk.ac.in/blog/the-ligo-experiment/", + "date" : "30 Oct 2017", + "author" : "Megh Bhalerao", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/megh_bhalerao.jpeg" + } , + + { + "title" : "Wireless Power Transmission", + "category" : "Piston", + "tags" : "Power", + "url" : "https://ieee.nitk.ac.in/blog/wireless-power-transmission/", + "date" : "30 Oct 2017", + "author" : "Vanshika Gupta", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Making Iot communications easy using mDNS", + "category" : "CompSoc", + "tags" : "Iot and Networking", + "url" : "https://ieee.nitk.ac.in/blog/using-mdns-in-iot/", + "date" : "26 Oct 2017", + "author" : "Hrishi Hiraskar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/hrily.jpg" + } , + + { + "title" : "The Honeycomb Conjecture", + "category" : "Piston", + "tags" : "Honeycomb Conjecture and Hexagonal cells", + "url" : "https://ieee.nitk.ac.in/blog/the-honeycomb-conjecture/", + "date" : "23 Oct 2017", + "author" : "Rajat Chandavar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/rajat.jpg" + } , + + { + "title" : "Charge your phone whenever you walk into the room", + "category" : "Diode", + "tags" : "transmitter and reciever", + "url" : "https://ieee.nitk.ac.in/blog/charge-your-phone/", + "date" : "23 Oct 2017", + "author" : "Sowjanya Kandula", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sowjanya.jpg" + } , + + { + "title" : "Augmented Reality", + "category" : "CompSoc", + "tags" : "Virtual Image and Augmented Reality", + "url" : "https://ieee.nitk.ac.in/blog/augmented-reality/", + "date" : "23 Oct 2017", + "author" : "Anumeha Agrawal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anumeha.jpeg" + } , + + { + "title" : "The Brain behind a Formula One Car", + "category" : "Diode", + "tags" : "Formula One, ECU, and TAG-320", + "url" : "https://ieee.nitk.ac.in/blog/the-brain-behind-a-formula-one-car/", + "date" : "16 Oct 2017", + "author" : "Anirudh Sundar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anirudhsundar.jpg" + } , + + { + "title" : "Robots Can Now See In 3D", + "category" : "Piston", + "tags" : "Robots and Computer Vision", + "url" : "https://ieee.nitk.ac.in/blog/robots-can-see-in-3d/", + "date" : "16 Oct 2017", + "author" : "Sinchana Hegde", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sinchana.jpg" + } , + + { + "title" : "Generative Adversarial Networks", + "category" : "CompSoc", + "tags" : "Deep Learning, Generative Adversarial Networks, GANs, Generative Models, and Machine Learning", + "url" : "https://ieee.nitk.ac.in/blog/generative-adversarial-networks/", + "date" : "16 Oct 2017", + "author" : "Moksh Jain", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/mokshjain.jpg" + } , + + { + "title" : "Search Engine Optimisation", + "category" : "CompSoc", + "tags" : "SEO, Google, and Web", + "url" : "https://ieee.nitk.ac.in/blog/search-engine-optimisation/", + "date" : "08 Oct 2017", + "author" : "Praveen Gupta", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/pvgupta24.jpg" + } , + + { + "title" : "Raspberry Pi Tutorial", + "category" : "Diode", + "tags" : "Raspberry Pi", + "url" : "https://ieee.nitk.ac.in/blog/rpi-tutorial/", + "date" : "08 Oct 2017", + "author" : "Varshini Srinivasan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/varshini.jpg" + } , + + { + "title" : "Aircraft Engines", + "category" : "Piston", + "tags" : "Aircraft Engines", + "url" : "https://ieee.nitk.ac.in/blog/aircraft-engines/", + "date" : "08 Oct 2017", + "author" : "Mirthun Raj", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Fingerprint Recognition", + "category" : "Diode", + "tags" : "fingerprint, sensors, and fingerprint sensor", + "url" : "https://ieee.nitk.ac.in/blog/fingerprint-recognition/", + "date" : "03 Oct 2017", + "author" : "Manan Sharma", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "The Intriguing World of Chatbots", + "category" : "CompSoc", + "tags" : "Chatbot, Chat, Bots, Language Processing, and IoT", + "url" : "https://ieee.nitk.ac.in/blog/chatbot/", + "date" : "03 Oct 2017", + "author" : "Adil Ashique", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/adilashique.jpg" + } , + + { + "title" : "Biohacking", + "category" : "Piston", + "tags" : "biology, hacking, biological hacking, superhuman, and cyborgs", + "url" : "https://ieee.nitk.ac.in/blog/biohacking/", + "date" : "03 Oct 2017", + "author" : "Anand Pathak", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Quantum Computers and The Future of Computation", + "category" : "Diode", + "tags" : "Quantum Computing", + "url" : "https://ieee.nitk.ac.in/blog/quantum-computers/", + "date" : "24 Sep 2017", + "author" : "Sampath Koti", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Getting Started with GUIs", + "category" : "CompSoc", + "tags" : "GUI, GTK+, and Gnome", + "url" : "https://ieee.nitk.ac.in/blog/getting-started-with-gui/", + "date" : "24 Sep 2017", + "author" : "Archit Pandey", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/archit.jpg" + } , + + { + "title" : "The Challenger Disaster", + "category" : "Piston", + "tags" : "Space, NASA, and Case Study", + "url" : "https://ieee.nitk.ac.in/blog/challenger-disaster/", + "date" : "24 Sep 2017", + "author" : "Nikhil Govindarajan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "BitTorrent Explained", + "category" : "CompSoc", + "tags" : "Networking, Torrents, and P2P", + "url" : "https://ieee.nitk.ac.in/blog/bit-torrent-explained/", + "date" : "18 Sep 2017", + "author" : "Mahir Jain", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/mahir.jpg" + } , + + { + "title" : "Storing energy in molten salt", + "category" : "Piston", + "tags" : "Energy, Research, and Innovation", + "url" : "https://ieee.nitk.ac.in/blog/storing-energy-in-salt/", + "date" : "18 Sep 2017", + "author" : "Adila M Rajiv", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "What makes a Smart Home Smart", + "category" : "Diode", + "tags" : "Smart homes and IoT", + "url" : "https://ieee.nitk.ac.in/blog/what-makes-a-smart-home-smart/", + "date" : "18 Sep 2017", + "author" : "Anirudh B H", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anirudh.jpg" + } , + + { + "title" : "You don't really know Arduino", + "category" : "Diode", + "tags" : "Arduino", + "url" : "https://ieee.nitk.ac.in/blog/you-dont-really-know-arduino/", + "date" : "12 Sep 2017", + "author" : "Vibhore Jain", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/vibhore.jpg" + } , + + { + "title" : "Water Memory, What A Memory", + "category" : "Diode", + "tags" : "Water Memory", + "url" : "https://ieee.nitk.ac.in/blog/water-memory-what-a-memory/", + "date" : "11 Sep 2017", + "author" : "Ayush G S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ayush.png" + } , + + { + "title" : "Rock Paper Scissors", + "category" : "Diode", + "tags" : "Game Theory and Strategy", + "url" : "https://ieee.nitk.ac.in/blog/rock-paper-scissors/", + "date" : "04 Sep 2017", + "author" : "Sachin Sampath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sachin.png" + } , + + { + "title" : "Airbus E-Fan", + "category" : "Piston", + "tags" : "Aviation and Environment", + "url" : "https://ieee.nitk.ac.in/blog/airbus-e-fan/", + "date" : "04 Sep 2017", + "author" : "Sachit Krishnan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sachitk.jpg" + } , + + { + "title" : "Safety Issues in AI Systems", + "category" : "CompSoc", + "tags" : "ML, AI, and Security AI", + "url" : "https://ieee.nitk.ac.in/blog/safety-issues-in-ai-systems/", + "date" : "04 Sep 2017", + "author" : "Chenna Keshava B S", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/ck.jpg" + } , + + { + "title" : "Technology in Sports", + "category" : "Diode", + "tags" : "Sports", + "url" : "https://ieee.nitk.ac.in/blog/technology-in-sports/", + "date" : "22 Aug 2017", + "author" : "Abhishek Thigale", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/abhishek.jpg" + } , + + { + "title" : "Hashing in Competitive Programming", + "category" : "CompSoc", + "tags" : "Hashing, C++, Competitive Programming, and Data Structures", + "url" : "https://ieee.nitk.ac.in/blog/hashing-in-competitive-programming/", + "date" : "22 Aug 2017", + "author" : "Somanth Sarkar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "When Strokes are Six", + "category" : "Piston", + "tags" : "six stroke engines", + "url" : "https://ieee.nitk.ac.in/blog/six-stroke-engine/", + "date" : "13 Aug 2017", + "author" : "Vinayak V Gopal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/vinayak.jpg" + } , + + { + "title" : "A QuickStart Guide to Image Processing with OpenCV", + "category" : "Diode", + "tags" : "OpenCV", + "url" : "https://ieee.nitk.ac.in/blog/opencv/", + "date" : "13 Aug 2017", + "author" : "Santosh Kodali", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/santosh.jpg" + } , + + { + "title" : "Is Random really Random?", + "category" : "Diode", + "tags" : "random, PRNG, TRNGs, cryptography, and Lehmer's RNG", + "url" : "https://ieee.nitk.ac.in/blog/random-number-generator/", + "date" : "04 Aug 2017", + "author" : "N Subbalakshmi", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/subbalakshmi.jpg" + } , + + { + "title" : "Smart Phones and Health issues", + "category" : "Piston", + "tags" : "Smartphone and Negative effects", + "url" : "https://ieee.nitk.ac.in/blog/smartphones-and-health/", + "date" : "04 Aug 2017", + "author" : "Akshay Krishna", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/akshay.jpg" + } , + + { + "title" : "Of a tooth and a pie", + "category" : "Diode", + "tags" : "Bluetooth, Raspberry Pi 3, and Internship", + "url" : "https://ieee.nitk.ac.in/blog/raspberry-pi-bluetooth/", + "date" : "04 Aug 2017", + "author" : "Shwetha S V", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shwetha.png" + } , + + { + "title" : "Ever wondered why exactly are high lift devices needed? Let me tell you...", + "category" : "Piston", + "tags" : "High Lift devices", + "url" : "https://ieee.nitk.ac.in/blog/high-lift-devices/", + "date" : "28 Jul 2017", + "author" : "Sri Charan Akula", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/akulasricharan.jpg" + } , + + { + "title" : "3D Printing", + "category" : "Piston", + "tags" : "3D Printing, Additive Manufacturing, and SIS", + "url" : "https://ieee.nitk.ac.in/blog/3d-printing/", + "date" : "28 Jul 2017", + "author" : "Nandini", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/Nandini_photo.jpg" + } , + + { + "title" : "An Introduction to Reinforcement Learning", + "category" : "CompSoc", + "tags" : "Machine Learning, AI, and Bots", + "url" : "https://ieee.nitk.ac.in/blog/reinforcement-learning/", + "date" : "28 Jul 2017", + "author" : "Aneesh Aithal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/aneesh.jpg" + } , + + { + "title" : "Number Theory", + "category" : "CompSoc", + "tags" : "Number Theory, Group, Ring, Rng, Field, Finite Field, and Galois Field", + "url" : "https://ieee.nitk.ac.in/blog/number-theory/", + "date" : "23 Jul 2017", + "author" : "Adithya Bhat", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/adithyabk.jpg" + } , + + { + "title" : "Log file parsing and formats of report generation", + "category" : "CompSoc", + "tags" : "File Parsing and Logging", + "url" : "https://ieee.nitk.ac.in/blog/log-file-parsing-and-report-generation/", + "date" : "23 Jul 2017", + "author" : "Karthik", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Cuba and Candela - Thin shell structures and their strength through curvature", + "category" : "Piston", + "tags" : "Structural engineering and Felix Candela", + "url" : "https://ieee.nitk.ac.in/blog/cuba-and-candela-thin-shell-structures-and-their-strength-through-curvature/", + "date" : "22 Jul 2017", + "author" : "Praful Itti", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/praful.jpg" + } , + + { + "title" : "Multitenancy", + "category" : "CompSoc", + "tags" : "Multitenancy, Cloud Computing, and SaaS", + "url" : "https://ieee.nitk.ac.in/blog/multitenancy/", + "date" : "15 Jul 2017", + "author" : "Sandeep Menon", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/sandeep.jpeg" + } , + + { + "title" : "Continuously Variable Transmission", + "category" : "Piston", + "tags" : "CVT, Transmission, Constant Engine RPM, and Infinite gear ratio", + "url" : "https://ieee.nitk.ac.in/blog/cvt/", + "date" : "15 Jul 2017", + "author" : "Prajwal Bharadwaj", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/prajwal.jpg" + } , + + { + "title" : "All about FinFETS", + "category" : "Diode", + "tags" : "FinFETS", + "url" : "https://ieee.nitk.ac.in/blog/finfets/", + "date" : "08 Jul 2017", + "author" : "Megha Mantur", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/megha.jpg" + } , + + { + "title" : "Fascinating World Of Compliant Mechanisms", + "category" : "Piston", + "tags" : "Compliant mechanisms", + "url" : "https://ieee.nitk.ac.in/blog/compliant-mechanisms/", + "date" : "08 Jul 2017", + "author" : "Shuvam Senapati", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shuvam.jpg" + } , + + { + "title" : "Introduction to big data and hadoop", + "category" : "CompSoc", + "tags" : "Big Data", + "url" : "https://ieee.nitk.ac.in/blog/big-data/", + "date" : "08 Jul 2017", + "author" : "A Aditya", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/a_aditya.jpeg" + } , + + { + "title" : "Dealing with Underdetermined Systems", + "category" : "Diode", + "tags" : "SPS, Image Processing, and Linear Algebra", + "url" : "https://ieee.nitk.ac.in/blog/dealing-with-underdetermined-systems/", + "date" : "02 Jul 2017", + "author" : "Abhijith Kamath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/abhijith_kamath.jpeg" + } , + + { + "title" : "Hyperloop", + "category" : "Piston", + "tags" : "hyperloop", + "url" : "https://ieee.nitk.ac.in/blog/hyperloop/", + "date" : "25 Jun 2017", + "author" : "Pranay Praveen", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/pranay_praveen.jpg" + } , + + { + "title" : "Graphene - A Wonder Material", + "category" : "Diode", + "tags" : "Graphene", + "url" : "https://ieee.nitk.ac.in/blog/graphene/", + "date" : "24 Jun 2017", + "author" : "Samarth Bonthala", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/samarth.jpg" + } , + + { + "title" : "Promises, Closures and Potatoes", + "category" : "CompSoc", + "tags" : "JavaScript and Programming", + "url" : "https://ieee.nitk.ac.in/blog/promises-closures-and-potatoes/", + "date" : "23 Jun 2017", + "author" : "Vighnesh Velayudhan", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/vighnesh.jpg" + } , + + { + "title" : "Fluid mechanics in everyday life", + "category" : "Piston", + "tags" : "Fluid Mechanics", + "url" : "https://ieee.nitk.ac.in/blog/fluid-mechanics-in-everyday-life/", + "date" : "18 Jun 2017", + "author" : "Shreyas Hegde", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/shreyas.jpeg" + } , + + { + "title" : "The Fourth Industrial Revolution", + "category" : "Piston", + "tags" : "IoT and Automation", + "url" : "https://ieee.nitk.ac.in/blog/the-fourth-industrial-revolution/", + "date" : "16 Jun 2017", + "author" : "Vasista Ayyagari", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/vasista.jpg" + } , + + { + "title" : "Through the eyes of a Computer", + "category" : "CompSocDiode", + "tags" : "Computer Vision, Image Processing, and Artificial Intelligence", + "url" : "https://ieee.nitk.ac.in/blog/through-the-eyes-of-a-computer/", + "date" : "14 Jun 2017", + "author" : "Mohiitaa Chowdhury", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/mohita.jpg" + } , + + { + "title" : "Introduction to Reverse Engineering", + "category" : "CompSoc", + "tags" : "CTF, Ethical Hacking, and Security", + "url" : "https://ieee.nitk.ac.in/blog/introduction-to-reverse-engineering/", + "date" : "14 Jun 2017", + "author" : "Jeshventh Raja", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/jeshventh.jpg" + } , + + { + "title" : "Implementing Google Image Search Style Grid", + "category" : "CompSoc", + "tags" : "Web Design and Grid", + "url" : "https://ieee.nitk.ac.in/blog/google-image-search-grid/", + "date" : "10 Jun 2017", + "author" : "Hrishi Hiraskar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/hrily.jpg" + } , + + { + "title" : "Lighting Up your Room!", + "category" : "Diode", + "tags" : "CAS, SPS, and EEE", + "url" : "https://ieee.nitk.ac.in/blog/lighting-up-your-room/", + "date" : "10 Jun 2017", + "author" : "Abhijith Kamath", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/abhijith_kamath.jpeg" + } , + + { + "title" : "The Class of NP", + "category" : "CompSoc", + "tags" : "Algorithms and P v/s NP", + "url" : "https://ieee.nitk.ac.in/blog/the-class-of-np/", + "date" : "09 Jun 2017", + "author" : "Isha Tarte", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/isha.jpg" + } , + + { + "title" : "Why Not Chemical Engineering", + "category" : "Piston", + "tags" : "Chemical and Career Advice", + "url" : "https://ieee.nitk.ac.in/blog/why-not-chemical-engineering/", + "date" : "07 Jun 2017", + "author" : "Anupama G", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/anupama.jpeg" + } , + + { + "title" : "Introduction to GPU Computing", + "category" : "CompSoc", + "tags" : "High Performance Computing and Game Development", + "url" : "https://ieee.nitk.ac.in/blog/introduction-to-gpu-computing/", + "date" : "04 Jun 2017", + "author" : "Vilas M", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "How to Get Started with Bots", + "category" : "Diode", + "tags" : "Bots", + "url" : "https://ieee.nitk.ac.in/blog/how-to-get-started-with-bots/", + "date" : "01 Jun 2017", + "author" : "Tarun Mittal", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/tarun_mittal.jpg" + } , + + { + "title" : "Hello World", + "category" : "CompSoc", + "tags" : "GCC, C, Programming, and HelloWorld", + "url" : "https://ieee.nitk.ac.in/blog/hello-world/", + "date" : "26 May 2017", + "author" : "Adithya Bhat", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/adithyabk.jpg" + } , + + { + "title" : "Getting to love the Terminal", + "category" : "CompSoc", + "tags" : "Unix, Terminal, and Bash", + "url" : "https://ieee.nitk.ac.in/blog/getting-to-love-the-terminal/", + "date" : "24 May 2017", + "author" : "Kaushik S Kalmady", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/blog-author.jpg" + } , + + { + "title" : "Installing Ubuntu For Windows Users", + "category" : "CompSoc", + "tags" : "Linux and Ubuntu", + "url" : "https://ieee.nitk.ac.in/blog/installing-ubuntu/", + "date" : "24 May 2017", + "author" : "Hrishi Hiraskar", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/hrily.jpg" + } , + + { + "title" : "Introduction to IEEE-NITK Chapter", + "category" : "CompSocDiodePiston", + "tags" : "Introduction", + "url" : "https://ieee.nitk.ac.in/blog/introduction-to-ieee/", + "date" : "15 May 2017", + "author" : "Salman Shah", + "author_image" : "https://ieee.nitk.ac.in/blog/assets/img/authors/salman_shah.jpg" + } + +] \ No newline at end of file diff --git a/blog/segment-tree/index.html b/blog/segment-tree/index.html new file mode 100644 index 0000000..ab78f6f --- /dev/null +++ b/blog/segment-tree/index.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +
    +

    Segment trees are extensivly used in competitive programming for problems that invlove range queries and range updates.

    +
    + +

    For example, given an array A of N elements, answer Q queries (of two types):

    + +

    1 L R : output the sum of elements between L and R
    +2 x I : A[I] = x

    + +

    A similar version of the above problem for minimum(i.e. to find the minimum between L and R) is famously known as Range Minimum Query. These problems can be easily solved with segment trees.

    + +

    Naive Approach

    + +

    A naive approach would be to answer queries of type 1 by running in a loop from L to R and finding the required sum and type 2 by performing updates on the array.

    + +
    for(int i = 0; i < Q; i++) {
    +	int type;
    +	cin>>type;
    +	if(type == 1) {
    +		sum = 0;
    +		cin>>L>>R;		
    +		for(int j = L; j <= R; j++) {
    +			sum += A[i];
    +		}
    +		cout<<sum<<endl;
    +	}
    +	else {
    +		cin>>I>>x;
    +		A[I] = x;
    +	}
    +}
    +
    + +

    Therefore, range queries (queries of type 1) takes O(N) time and point updates (queries of type 2) take O(1) time. This algorihtm works well when there are large number of point updates compared to range queries.

    + +

    But what if there there are a large number of range queries, the above algorithm can take O(Q*N) time. For such problems, Q and N have an upperbound of 105 usually in contests (Hence won’t pass).

    + +

    Can we improve this algorithm? Yes, we can by using Segment Trees.

    + +

    Structure of Segment Tree

    + +

    So, what is a Segment Tree?

    + +

    We compute and store the sum of the array A[0 – N-1]. Then we divide the array into two halves and compute the sum of each half, i.e, sum of A[0 – N/2] and A[N/2+1 – N-1]. We continue this process again for each half untill an array with single element is reached.

    + +

    Note on convention: From now on, A[L - R] will represent the sub-array of A between L and R (both inclusive).

    + +

    In other words, we call a procedure to find the sum of elements of A[0 – N-1], split the current segment into half and call the procedure for the both the halves. We can view this setup as a binary tree. The root node being sum A[0 – N-1] and its left and right child being left and right halves of A[0 – N-1].

    + +

    For example, for A = {2,3,1,9,4,3,7,8}

    + +

    Construction of Segment Tree

    + +

    Each node corresponds to sum of given segment. Its called “Segment Tree” because it can be easily visualised as a tree.

    + +

    Note that the height of the tree is O(logn) since moving from any parent node to chlid node, the size decreases by approximately by half.

    + +

    Number of nodes in the tree is 1 + 2 + 4 + … + 2ceil(logn) = 2ceil(logn)+1 < 4n = O(n) . Thus we will need O(n) extra space to implement segment trees.

    + +

    Note that segment trees are full binary tree(every node has two or zero child nodes). (prove it!)

    + +

    Construction

    + +

    A Segment Tree can be efficiently implemented as follows:

    + +

    We start at the bottom level, the leaf vertices. A vertex is a leaf vertex, if its corresponding segment covers only one value. Therefore we can simply copy the values of the elements a[i]. On the basis of these values, we can compute the sums of the previous level. And on the basis of those, we can compute the sums of the previous, and repeat the procedure until we reach the root vertex.

    + +

    It is convenient to describe this operation recursively: we start the construction at the root vertex and the construction procedure, if called on a not-leaf vertex, first recursively constructs the two child vertices, and then sums up the computed sums of these children. If it is called on a leaf vertex, it simply uses the value of the array.

    + +

    The time complexity of construction in O(n) because each edge is returns just one value.

    + +

    Note:
    +Here, segment trees are stored in an array T(1 - indexed). We call a node i if it’s corresponding sum is stored at T[i]. We reresent the tree in T by

    +
      +
    1. Storing sum corresponding to root node at index 1, i.e, at T[1]. (node i )
    2. +
    3. Store the sum of corresponding to node child nodes of i at 2i ans 2i+1
    4. +
    5. Given a node i, it’s parent is i/2 (integer division).
    6. +
    + +

    Following is the implementation for construction of Segment Tree:

    + +
    //Max size of given array
    +const int N = 1e5;
    +//Segment Tree is represnted
    +int a[N], t[4*N]; 
    +//a is the array
    +//t is the segment tree
    +
    +//fuction to build the tree build(1, 0, n-1)
    +//[start, end] start and end both inclusive
    +void build(int node, int start, int end) {
    +	if(start == end) {
    +		t[node] = a[start];
    +	}
    +	else {
    +		int mid = (start+end)/2;
    +		build(2*node, start, mid);
    +		build(2*node+1, mid+1, end);
    +		t[node] = t[2*node]+t[2*node+1];
    +	}
    +}
    +
    +

    build(1, 0, n-1) builds the tree.(assuming n is the size of array a)

    + +

    But how does constructing a segment tree help in finding range queries?

    + +

    Range Queries

    + +

    After the constructing the Segment Tree, it is possible to answer sum queries of the form A[L – R] in O(logn) time.

    + +

    We compute sum queries by using the pre-computed values of segment sums. The idea is any given segment of values L and R, sum A[L – R] can be represented as sum of pre-computed sub segments.

    + +

    This can be done by traversing the segment tree.

    + +

    Following the algorithm we use for range query:

    + +
    +

    Range_Query(node, L, R)

    + +

    (Let start and end be the extremes of the segment for which sum is stored in “node”)

    +
      +
    1. If start >= L and end <= R, then sum of “node” contains a part of the required sum. So we return sum stored in node.
    2. +
    3. If start > R or end < L, then it means the required sum A[L – R] is not present in that node or it’s child nodes(if it exists). In this case, return 0.
    4. +
    5. Else a part of the required sum A[L – R] is present in the node. So, we need to how much “node” contributes to A[L – R]. For this, we recursively call Range_Query for left and right child. i.e. return Range_Query(left child of node, L, R) + Range_Query(right child of node, L, R)
    6. +
    +
    + +

    We get the required output by calling Range_Query(root, L, R).

    + +

    The procedure is illustrated in the following image. The array a=[1,3,−2,8,−7] is used, and here we want to compute the sum of A[2 - 4]. The colored vertices will be visited, and we will use the precomputed values of the green vertices. This gives us the result −2+1=−1.

    + +

    range query

    + +

    Following is the implementation for range queries:

    + +
    int query(int node, int start, int end, int l, int r) {
    +	if(l > end || r < start) {
    +		return 0;
    +	}
    +	else if(l <= start && end <= r) {
    +		return t[node];
    +	}
    +	int mid = (start+end)/2;
    +	return query(2*node, start, mid, l, r) + query(2*node+1, mid+1, end, l, r);
    +}
    +
    + +

    In conclusion the query works by dividing the input segment into several sub-segments for which all the sums are already precomputed and stored in the tree. And if we stop partitioning whenever the query segment coincides with the vertex segment, then we only need O(logn) such segments, which gives the effectiveness of the Segment Tree.

    + +

    Point Updates:

    + +

    This query is easier than the sum query. Each level of a Segment Tree forms a partition of the array. Therefore an element A[i] only contributes to one segment from each level. Thus only O(logn) vertices need to be updated.

    + +

    It is easy to see, that the update request can be implemented using a recursive function. The function gets passed the current tree vertex, and it recursively calls itself with one of the two child vertices (the one that contains A[i] in its segment), and after that recomputes its sum value, similar how it is done in the build method (that is as the sum of its two children).

    + +

    Here is a visualization using thearray a=[1,3,−2,8,−7]. Here we perform the update a[2]=3. The green vertices are the vertices that we visit and update.

    + +

    point update

    + +

    Following is the implementation for point updates:

    + +
    void update(int node, int start, int end, int idx, int val) {
    +	if(start == end) {
    +		a[idx] = t[node] = val;
    +	}
    +	else {
    +		int mid = (start+end)/2;
    +		if(idx>=start && idx<=mid) {
    +			update(2*node, start, mid, idx, val);
    +		}
    +		else {
    +			update(2*node+1, mid+1, end, idx, val);
    +		}
    +		t[node] = t[2*node]+t[2*node+1];
    +	}
    +}
    +
    + +

    Note on implementation:

    + +

    You can use the following functions as helper fuctions(for ease of use):

    + +
    void build() {
    +	build(1, 0, n-1);
    +}
    +//change idx value to val, i.e, a[idx] = val
    +void update(int idx, int val) {
    +	update(1, 0, n-1, idx, val);
    +}
    +//[l,r] both inclusive
    +int query(int l, int r) {
    +	return query(1, 0, n-1, l, r);
    +}
    +
    + +

    Bonus: Try to implement range minimum and maximum query with point updates.

    + +

    More examples:

    + +
    +
      +
    1. Given an array of N numbers and Q queries, each query consists of L and R. We need to write a program that prints the number of occurrence of the smallest element in the range L-R.
    2. +
    +
    + +

    This is similar to range query except that it asks for number of minimum elements in the given range.

    + +

    Here, at each node of the segment tree, minimum and count of minimum element is stored. Try implementing the solution to this problem.

    + +

    The solution is similar to sum queries problem but with different conditions for merging solutions. By merging, I mean the step of updating the parent node value(or gathering query result) from its child nodes value(which occurs in construction and range queries).

    + +

    Hint: +Use struct for each node to store minimum and count

    + +
      +
    1. +

      min(left_subtree) < min(right_subtree): +node.min=min(left_subtree), node.count = left_subtree.count

      +
    2. +
    3. +

      min(left_subtree) > min(right_subtree): +node.min=min(right_subtree), node.count=right_subtree.count

      +
    4. +
    5. +

      min(left_subtree) = min(right_subtree): +node.min=min(left_subtree) or min(right_subtree), node.count=left_subtree.count + right_subtree.count

      +
    6. +
    + +

    Implementation: https://www.geeksforgeeks.org/count-number-of-smallest-elements-in-given-range/

    + +
    +
      +
    1. Given N numbers and Q queries, each query consists of L and R. Task is to write a program which prints the count of numbers which divides all numbers in the given range L-R.
    2. +
    +
    + +

    This is a slightly harder problem. The point to note for such problems is that everything boils down to the merging step. If we are able to define contents of each node in the segment tree and are able to get a way to merge two child nodes to return required answer(or update parent), then we are done.

    + +

    Here, note that the number that divides all elements in a segment should be the minimum. If such a number exists, then it should be the GCD of all numbers in the segment.

    + +

    So the count of the number of minimums in range L-R, given that minimum is equal to the gcd of that range will be our answer to every query. The problem boils down to finding the GCD, MINIMUM and count of MINIMUM for every range using Segment trees. On every node of the tree, three values are stored. +On querying for a given range, if the gcd and minimum of the given range are equal, countMINIMUM is returned as the answer. If they are unequal, 0 is returned as the answer.

    + +

    Implemenation:

    + + +

    Bonus: Check out two dimensional segment trees if you are interested: https://www.geeksforgeeks.org/two-dimensional-segment-tree-sub-matrix-sum/

    + +

    Epilogue

    + +

    This article is supposed to be an introduction to Segment Trees. If you feel comfortable with the contents of the article, then do check out lazy propagation on segment trees. (this allows you to perform range queries and range updates on the segment tree)

    + +

    References:

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/self-healing-material/index.html b/blog/self-healing-material/index.html new file mode 100644 index 0000000..39e38c4 --- /dev/null +++ b/blog/self-healing-material/index.html @@ -0,0 +1,526 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A breakthrough for bio-inspired technology.

    + +

    Many natural organisms have the ability to repair themselves. Now, manufactured machines will be able to mimic this property. Researchers have created a self-healing material that spontaneously repairs itself under extreme mechanical damage.

    + +

    What is biomimicry ?

    + +

    Game-changing ideas begin by seeing the possibility for sustainable life reflected in the living system around us. Biomimicry is an approach to innovation that seeks sustainable solutions to human challenges by emulating nature’s time-tested patterns and strategies. The goal is to create products, processes, and policies which guide us to a new lifestyle that is sustainable and well adapted on earth over the long haul. +Nature has incorporated within itself innumerous ways to not only grow back to life but also provide us immense knowledge and ideas to develop new and varities of solutions to many of the problems we are grappling with. Animals, plants and microbes are the consummate engineers. As the most intelligent species on earth, we started to notice such “miracles” and adapt them to engineer out solutions to problems related to various fields including machining, architecture, robotics, polymerizations etc.

    + +

    Fig1

    + +

    What are Self-healing materials?

    + +

    Self-healing materials are artificial or synthetically-created substances which have the built-in ability to automatically repair damage to themselves without any external diagnosis of the problem or human intervention. Although the most common types of self-healing materials are polymers or elastomers, self-healing covers all classes of materials, including metals, ceramics, and cementitious materials. These materials also include isocyanates monomers such as DCPD GMA epoxy resin, linseed oil and tung oil. By using the aforementioned materials for self-healing in coatings, it was proven that microencapsulation effectively protects the metal against corrosion and extends the lifetime of a coating.

    + +

    Types of self-healing material and how do they work?

    + +

    The first self-healing materials were polymers with a kind of embedded internal adhesive, reported in 2001 by Scott White, Nancy Sottos, and colleagues from the University of Illinois at Urbana-Champaign. Since then, a variety of other self-healing materials have been developed.

    + +

    Self-healing materials come in four main kinds:

    + +

    1. Embedded healing agents:-

    + +

    The best-known self-healing materials have built-in microcapsules (tiny embedded pockets) filled with a glue-like chemical that can repair damage. If the material cracks inside, the capsules break open, the repair material “wicks” out, and the crack seals up. It works in a similar way to a type of adhesive called epoxy, which is supplied in the form of two liquid polymers in separate containers (often two syringes). When you mix the liquids together, a chemical reaction occurs and a strong adhesive (a copolymer) forms.

    + +

    Fig2

    + +

    2. Microvascular materials :-

    + +

    Our body has an amazingly comprehensive vascular system (a network of blood vessels of different sizes) that transport blood and oxygen for energy and repair. If damage occurs, our blood system simply pumps extra resources to the places where they’re needed, but only when they’re needed. Materials scientists have been trying to design self-healing materials that work the same way. Some have networks of extremely thin vascular tubes (around 100 microns thick—a little thicker than an average human hair) built into them that can pump healing agents (adhesives, or whatever else is needed) to the point of failure only when they need to do so. The tubes lead into pressurized reservoirs (think of syringes that are already pushed in slightly). When a failure occurs, the pressure is released at one end of the tube causing the healing agent to pump in to the place where it’s needed.

    + +

    Fig3

    + +

    3. Shape-memory alloys :-

    + +

    Most of us know shape memory materials through relatively trivial everyday applications such as eyeglasses, made from alloys like nitinol (nickel-titanium), that flex exactly back to shape when you bend and then release them. Usually, shape memory works in a more complex (and interesting) way than this. Typically you need to heat (or otherwise supply energy to) a material to make it snap back to its original, preferred form. In practice, that might be an embedded network of fiber-optic cables similar to the vascular networks used in other self-healing materials except that, instead of pumping up a polymer or adhesive, these tubes are used to feed laser light and heat energy to the point of failure. That causes them to flip back into (“remember”) their preferred shape, effectively reversing the damage.

    + +

    Fig4

    + +

    4. Reversible polymers:-

    + +

    Polymers don’t always need sophisticated internal systems, such as embedded capsules or vascular tubes, to repair internal damage. Some of them break apart to reveal what we might think of as highly “reactive” ends or fragments that naturally try to join up again. Energized by either light or heat, these stray fragments naturally try to rebond themselves to other nearby molecules, effectively reversing the damage and repairing the material. Some break to expose electrically charged ends, which give the broken fragments a built-in electrostatic attraction. When damage occurs, electrostatic forces pull the fragments together, enabling the material to self-repair.

    + +

    Fig5

    + +

    Applications:-

    + +

    It’s not difficult to imagine all kinds of applications for self-healing materials, from bridges and buildings that repair their own cracks to car fenders made from shape-memory polymers that automatically flex back to shape after low-speed collisions. The first self-healing materials we’re likely to see in mass production will be paints and coatings that can better survive the weather and other kinds of surface wear-and-tear. Because the material also exhibits high electrical conductivity that does not change when stretched, it is ideal for use in power and data transmission. These soft-matter composite material is composed of liquid metal droplets suspended in a soft elastomer. When damaged, the droplets rupture to form new connections with neighboring droplets and reroute electrical signals without interruption. Circuits produced with conductive traces of this material remain fully and continuously operational when severed, punctured, or had material removed.

    + +

    Fig6

    + +

    Self healing materials are gradually finding their way into everyday application.Imagine owning a car that can “heal” itself when met with an accident or when suffered scratches or bumps. One day, we might even have replacement parts for the human body that can heal themselves as well as their natural equivalents. At that point, the science of self-healing will truly have come round full circle. Trust scientists to reinvent nature!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/series/index.html b/blog/series/index.html new file mode 100644 index 0000000..8ad1586 --- /dev/null +++ b/blog/series/index.html @@ -0,0 +1,2452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    Series

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + +
    + + CompSoc + + + Diode + + + Piston + + + Envision + + + CompSoc/Diode/Piston + + + Compsoc + + + diode + + + piston + + + compsoc + + + Compsoc/Diode/Piston + + +
    + + + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/sitemap.xml b/blog/sitemap.xml new file mode 100644 index 0000000..bfd843b --- /dev/null +++ b/blog/sitemap.xml @@ -0,0 +1,1184 @@ + + + + + https://ieee.nitk.ac.in/blog/consensus-mechanism-in-blockchain/ + weekly + + + + https://ieee.nitk.ac.in/blog/i2c/ + weekly + + + + https://ieee.nitk.ac.in/blog/cloud-computing-in-detail/ + weekly + + + + https://ieee.nitk.ac.in/blog/a-future-called-quantum/ + weekly + + + + https://ieee.nitk.ac.in/blog/dp-on-trees/ + weekly + + + + https://ieee.nitk.ac.in/blog/from-1g-to-5g/ + weekly + + + + https://ieee.nitk.ac.in/blog/javascript-console-better-debugging/ + weekly + + + + https://ieee.nitk.ac.in/blog/amateur-radio/ + weekly + + + + https://ieee.nitk.ac.in/blog/playing-blackjack-optimally-with-reinforcement-learning/ + weekly + + + + https://ieee.nitk.ac.in/blog/localization-robotics/ + weekly + + + + https://ieee.nitk.ac.in/blog/brain-machine-interfaces/ + weekly + + + + https://ieee.nitk.ac.in/blog/fluid-mechanics-from-living-to-machines/ + weekly + + + + https://ieee.nitk.ac.in/blog/cpu-vs-gpu/ + weekly + + + + https://ieee.nitk.ac.in/blog/An-Introduction-to-Disjoint-set-data-structures/ + weekly + + + + https://ieee.nitk.ac.in/blog/revolutionising-the-wheel/ + weekly + + + + https://ieee.nitk.ac.in/blog/introduction-to-kubernetes-architecture/ + weekly + + + + https://ieee.nitk.ac.in/blog/introduction-to-iot/ + weekly + + + + https://ieee.nitk.ac.in/blog/to-infinity-and-beyond/ + weekly + + + + https://ieee.nitk.ac.in/blog/intro-to-cloud-computing/ + weekly + + + + https://ieee.nitk.ac.in/blog/cubesats/ + weekly + + + + https://ieee.nitk.ac.in/blog/paradox-free-time-travel/ + weekly + + + + https://ieee.nitk.ac.in/blog/bionics-and-biomimetics/ + weekly + + + + https://ieee.nitk.ac.in/blog/Alpha-Beta-Pruning/ + weekly + + + + https://ieee.nitk.ac.in/blog/holographic-memory/ + weekly + + + + https://ieee.nitk.ac.in/blog/concrete-the-way-youve-not-seen-it/ + weekly + + + + https://ieee.nitk.ac.in/blog/Introduction-to-audio-processing-in-NLP/ + weekly + + + + https://ieee.nitk.ac.in/blog/trying-to-understand-trie/ + weekly + + + + https://ieee.nitk.ac.in/blog/lstm-models/ + weekly + + + + https://ieee.nitk.ac.in/blog/impact-of-f1/ + weekly + + + + https://ieee.nitk.ac.in/blog/state-management-in-flutter/ + weekly + + + + https://ieee.nitk.ac.in/blog/image-steganography/ + weekly + + + + https://ieee.nitk.ac.in/blog/first-20-hours/ + weekly + + + + https://ieee.nitk.ac.in/blog/An-Introduction-to-Matrix-Exponentiation/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-revolution-called-ddr/ + weekly + + + + https://ieee.nitk.ac.in/blog/neural-landers/ + weekly + + + + https://ieee.nitk.ac.in/blog/once-upon-a-time-in-fiction/ + weekly + + + + https://ieee.nitk.ac.in/blog/can-bus-protocol/ + weekly + + + + https://ieee.nitk.ac.in/blog/Neural-style-transfer/ + weekly + + + + https://ieee.nitk.ac.in/blog/future-of-power-generation/ + weekly + + + + https://ieee.nitk.ac.in/blog/convnets/ + weekly + + + + https://ieee.nitk.ac.in/blog/microservices/ + weekly + + + + https://ieee.nitk.ac.in/blog/my-two-snowflakes/ + weekly + + + + https://ieee.nitk.ac.in/blog/applications-of-RL/ + weekly + + + + https://ieee.nitk.ac.in/blog/gramophone-gaana/ + weekly + + + + https://ieee.nitk.ac.in/blog/water-jet-guided-laser-cutting/ + weekly + + + + https://ieee.nitk.ac.in/blog/metamaterials/ + weekly + + + + https://ieee.nitk.ac.in/blog/an-intuition-on-how-RNN-and-LSTM-works/ + weekly + + + + https://ieee.nitk.ac.in/blog/Elegant-Algorithms-Using-Randomization/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-elliptic-curve-cryptography/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-python-shouldnt-be-your-first-programming-language/ + weekly + + + + https://ieee.nitk.ac.in/blog/researchers-and-rating-their-research/ + weekly + + + + https://ieee.nitk.ac.in/blog/intro-to-pytorch/ + weekly + + + + https://ieee.nitk.ac.in/blog/minimax-algorithm/ + weekly + + + + https://ieee.nitk.ac.in/blog/updatedekranoplan/ + weekly + + + + https://ieee.nitk.ac.in/blog/communication-protocols-part1/ + weekly + + + + https://ieee.nitk.ac.in/blog/a-dive-into-git-directory/ + weekly + + + + https://ieee.nitk.ac.in/blog/Genome-Editing/ + weekly + + + + https://ieee.nitk.ac.in/blog/Applications-of-Neural-Networks-in-Power-Systems/ + weekly + + + + https://ieee.nitk.ac.in/blog/What-is-Machine-Learning/ + weekly + + + + https://ieee.nitk.ac.in/blog/TarjansAlgo/ + weekly + + + + https://ieee.nitk.ac.in/blog/SLAM/ + weekly + + + + https://ieee.nitk.ac.in/blog/Solving-a-traffic-problem-using-graph-decomposition/ + weekly + + + + https://ieee.nitk.ac.in/blog/web-vulnerabilities/ + weekly + + + + https://ieee.nitk.ac.in/blog/pslv-to-mars/ + weekly + + + + https://ieee.nitk.ac.in/blog/piezoelectricity-and-piezoelectric-sensors/ + weekly + + + + https://ieee.nitk.ac.in/blog/A-Comprehensive-Guide-To-LiFi/ + weekly + + + + https://ieee.nitk.ac.in/blog/ds1-a-demonstration-spacecraft-and-its-communication-aspects/ + weekly + + + + https://ieee.nitk.ac.in/blog/autopilot/ + weekly + + + + https://ieee.nitk.ac.in/blog/stem_cells/ + weekly + + + + https://ieee.nitk.ac.in/blog/Bluetooth-Low-Energy/ + weekly + + + + https://ieee.nitk.ac.in/blog/An-Intro-to-WebSockets/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-do-GANs-matter/ + weekly + + + + https://ieee.nitk.ac.in/blog/colonization-of-mars/ + weekly + + + + https://ieee.nitk.ac.in/blog/bionics/ + weekly + + + + https://ieee.nitk.ac.in/blog/generate-text-with-gpt2/ + weekly + + + + https://ieee.nitk.ac.in/blog/future-of-drones/ + weekly + + + + https://ieee.nitk.ac.in/blog/concorde/ + weekly + + + + https://ieee.nitk.ac.in/blog/forward-swept-wings/ + weekly + + + + https://ieee.nitk.ac.in/blog/space-based-solar-power/ + weekly + + + + https://ieee.nitk.ac.in/blog/password-security-techniques-and-challenges/ + weekly + + + + https://ieee.nitk.ac.in/blog/Requirements-and-Importance-of-Research/ + weekly + + + + https://ieee.nitk.ac.in/blog/Long-Short-Term-Neural-Networks/ + weekly + + + + https://ieee.nitk.ac.in/blog/Radar-Imaging/ + weekly + + + + https://ieee.nitk.ac.in/blog/ELF-Files-in-Linux/ + weekly + + + + https://ieee.nitk.ac.in/blog/Solving-Switch-Riddle-using-RL/ + weekly + + + + https://ieee.nitk.ac.in/blog/machine-translation/ + weekly + + + + https://ieee.nitk.ac.in/blog/machine-learning-magic/ + weekly + + + + https://ieee.nitk.ac.in/blog/innovations-in-drone-industry/ + weekly + + + + https://ieee.nitk.ac.in/blog/social-engineering/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-missing-circuit-element/ + weekly + + + + https://ieee.nitk.ac.in/blog/smart-contracts/ + weekly + + + + https://ieee.nitk.ac.in/blog/self-healing-material/ + weekly + + + + https://ieee.nitk.ac.in/blog/photocatalytic-decomposition/ + weekly + + + + https://ieee.nitk.ac.in/blog/an-intro-to-the-map-reduce-programming-paradigm/ + weekly + + + + https://ieee.nitk.ac.in/blog/thermal-imaging/ + weekly + + + + https://ieee.nitk.ac.in/blog/nano-medicine/ + weekly + + + + https://ieee.nitk.ac.in/blog/how-computers-learn-to-play-games/ + weekly + + + + https://ieee.nitk.ac.in/blog/GaN/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-you-should-learn-flutter/ + weekly + + + + https://ieee.nitk.ac.in/blog/nanosheets-decorated-with-dna/ + weekly + + + + https://ieee.nitk.ac.in/blog/electronic-skin/ + weekly + + + + https://ieee.nitk.ac.in/blog/nanomachines/ + weekly + + + + https://ieee.nitk.ac.in/blog/gesture-controlled-robot/ + weekly + + + + https://ieee.nitk.ac.in/blog/cloud-gaming/ + weekly + + + + https://ieee.nitk.ac.in/blog/zero-knowledge-proof/ + weekly + + + + https://ieee.nitk.ac.in/blog/microled/ + weekly + + + + https://ieee.nitk.ac.in/blog/ballistics/ + weekly + + + + https://ieee.nitk.ac.in/blog/organic-photovoltaics/ + weekly + + + + https://ieee.nitk.ac.in/blog/mems/ + weekly + + + + https://ieee.nitk.ac.in/blog/deconv/ + weekly + + + + https://ieee.nitk.ac.in/blog/supercap/ + weekly + + + + https://ieee.nitk.ac.in/blog/kmp-algorithm/ + weekly + + + + https://ieee.nitk.ac.in/blog/by-wire/ + weekly + + + + https://ieee.nitk.ac.in/blog/coronary-stents/ + weekly + + + + https://ieee.nitk.ac.in/blog/electronic-aspirin/ + weekly + + + + https://ieee.nitk.ac.in/blog/web-3-0/ + weekly + + + + https://ieee.nitk.ac.in/blog/vortices/ + weekly + + + + https://ieee.nitk.ac.in/blog/light-backscatter-application/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-you-need-gpu/ + weekly + + + + https://ieee.nitk.ac.in/blog/varistor/ + weekly + + + + https://ieee.nitk.ac.in/blog/automate-the-industries/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-machine-learning-matters/ + weekly + + + + https://ieee.nitk.ac.in/blog/phase-change-material/ + weekly + + + + https://ieee.nitk.ac.in/blog/avionics/ + weekly + + + + https://ieee.nitk.ac.in/blog/segment-tree/ + weekly + + + + https://ieee.nitk.ac.in/blog/nanoparticle-wonder-liquid/ + weekly + + + + https://ieee.nitk.ac.in/blog/cloud-computing/ + weekly + + + + https://ieee.nitk.ac.in/blog/biomicry-creating-a-truly-sustainable-environment/ + weekly + + + + https://ieee.nitk.ac.in/blog/biology-and-electronics/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-new-biometric-brainprint/ + weekly + + + + https://ieee.nitk.ac.in/blog/pow-consensus-blockchain/ + weekly + + + + https://ieee.nitk.ac.in/blog/quantum-supremacy/ + weekly + + + + https://ieee.nitk.ac.in/blog/string-genetic/ + weekly + + + + https://ieee.nitk.ac.in/blog/nanomotors/ + weekly + + + + https://ieee.nitk.ac.in/blog/earthing-systems/ + weekly + + + + https://ieee.nitk.ac.in/blog/chain-of-things/ + weekly + + + + https://ieee.nitk.ac.in/blog/heap_exploitation/ + weekly + + + + https://ieee.nitk.ac.in/blog/computational-approaches-of-shock-waves/ + weekly + + + + https://ieee.nitk.ac.in/blog/charge-crowding/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-50hz/ + weekly + + + + https://ieee.nitk.ac.in/blog/market-basket/ + weekly + + + + https://ieee.nitk.ac.in/blog/alterego/ + weekly + + + + https://ieee.nitk.ac.in/blog/regenerative-braking/ + weekly + + + + https://ieee.nitk.ac.in/blog/washable-electronics/ + weekly + + + + https://ieee.nitk.ac.in/blog/qemu-virtualization/ + weekly + + + + https://ieee.nitk.ac.in/blog/amazon-go/ + weekly + + + + https://ieee.nitk.ac.in/blog/smart-lighting-systems/ + weekly + + + + https://ieee.nitk.ac.in/blog/prof-matching-envision/ + weekly + + + + https://ieee.nitk.ac.in/blog/evolution-of-bicycle/ + weekly + + + + https://ieee.nitk.ac.in/blog/electric-cars/ + weekly + + + + https://ieee.nitk.ac.in/blog/tSNE/ + weekly + + + + https://ieee.nitk.ac.in/blog/bit-manipulation/ + weekly + + + + https://ieee.nitk.ac.in/blog/fluids-and-satellites/ + weekly + + + + https://ieee.nitk.ac.in/blog/how-is-technology-helping-the-differently-abled-people/ + weekly + + + + https://ieee.nitk.ac.in/blog/public-key-cryptography/ + weekly + + + + https://ieee.nitk.ac.in/blog/war-of-the-currents/ + weekly + + + + https://ieee.nitk.ac.in/blog/speed-printing/ + weekly + + + + https://ieee.nitk.ac.in/blog/space-ml/ + weekly + + + + https://ieee.nitk.ac.in/blog/e-Ink/ + weekly + + + + https://ieee.nitk.ac.in/blog/rocker-bogie/ + weekly + + + + https://ieee.nitk.ac.in/blog/future-of-computing-quantum-computing/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-airbag-system-for-two-wheeler-vehicle/ + weekly + + + + https://ieee.nitk.ac.in/blog/bot/ + weekly + + + + https://ieee.nitk.ac.in/blog/a-step-ahead-in-reverse-engineering/ + weekly + + + + https://ieee.nitk.ac.in/blog/rfid/ + weekly + + + + https://ieee.nitk.ac.in/blog/machine-learning-for-stock-market-investment/ + weekly + + + + https://ieee.nitk.ac.in/blog/evacuated-tube-collector/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-halting-problem/ + weekly + + + + https://ieee.nitk.ac.in/blog/design-of-aircraft-windows/ + weekly + + + + https://ieee.nitk.ac.in/blog/how-qr-code-was-invented/ + weekly + + + + https://ieee.nitk.ac.in/blog/smart-grid/ + weekly + + + + https://ieee.nitk.ac.in/blog/magnetically-repelling-ice/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-beginning-of-the-end-have-the-machines-won/ + weekly + + + + https://ieee.nitk.ac.in/blog/introduction-to-docker/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-ligo-experiment/ + weekly + + + + https://ieee.nitk.ac.in/blog/wireless-power-transmission/ + weekly + + + + https://ieee.nitk.ac.in/blog/using-mdns-in-iot/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-honeycomb-conjecture/ + weekly + + + + https://ieee.nitk.ac.in/blog/charge-your-phone/ + weekly + + + + https://ieee.nitk.ac.in/blog/augmented-reality/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-brain-behind-a-formula-one-car/ + weekly + + + + https://ieee.nitk.ac.in/blog/robots-can-see-in-3d/ + weekly + + + + https://ieee.nitk.ac.in/blog/generative-adversarial-networks/ + weekly + + + + https://ieee.nitk.ac.in/blog/search-engine-optimisation/ + weekly + + + + https://ieee.nitk.ac.in/blog/rpi-tutorial/ + weekly + + + + https://ieee.nitk.ac.in/blog/aircraft-engines/ + weekly + + + + https://ieee.nitk.ac.in/blog/fingerprint-recognition/ + weekly + + + + https://ieee.nitk.ac.in/blog/chatbot/ + weekly + + + + https://ieee.nitk.ac.in/blog/biohacking/ + weekly + + + + https://ieee.nitk.ac.in/blog/quantum-computers/ + weekly + + + + https://ieee.nitk.ac.in/blog/getting-started-with-gui/ + weekly + + + + https://ieee.nitk.ac.in/blog/challenger-disaster/ + weekly + + + + https://ieee.nitk.ac.in/blog/bit-torrent-explained/ + weekly + + + + https://ieee.nitk.ac.in/blog/storing-energy-in-salt/ + weekly + + + + https://ieee.nitk.ac.in/blog/what-makes-a-smart-home-smart/ + weekly + + + + https://ieee.nitk.ac.in/blog/you-dont-really-know-arduino/ + weekly + + + + https://ieee.nitk.ac.in/blog/water-memory-what-a-memory/ + weekly + + + + https://ieee.nitk.ac.in/blog/rock-paper-scissors/ + weekly + + + + https://ieee.nitk.ac.in/blog/airbus-e-fan/ + weekly + + + + https://ieee.nitk.ac.in/blog/safety-issues-in-ai-systems/ + weekly + + + + https://ieee.nitk.ac.in/blog/technology-in-sports/ + weekly + + + + https://ieee.nitk.ac.in/blog/hashing-in-competitive-programming/ + weekly + + + + https://ieee.nitk.ac.in/blog/six-stroke-engine/ + weekly + + + + https://ieee.nitk.ac.in/blog/opencv/ + weekly + + + + https://ieee.nitk.ac.in/blog/random-number-generator/ + weekly + + + + https://ieee.nitk.ac.in/blog/smartphones-and-health/ + weekly + + + + https://ieee.nitk.ac.in/blog/raspberry-pi-bluetooth/ + weekly + + + + https://ieee.nitk.ac.in/blog/high-lift-devices/ + weekly + + + + https://ieee.nitk.ac.in/blog/3d-printing/ + weekly + + + + https://ieee.nitk.ac.in/blog/reinforcement-learning/ + weekly + + + + https://ieee.nitk.ac.in/blog/number-theory/ + weekly + + + + https://ieee.nitk.ac.in/blog/log-file-parsing-and-report-generation/ + weekly + + + + https://ieee.nitk.ac.in/blog/cuba-and-candela-thin-shell-structures-and-their-strength-through-curvature/ + weekly + + + + https://ieee.nitk.ac.in/blog/multitenancy/ + weekly + + + + https://ieee.nitk.ac.in/blog/cvt/ + weekly + + + + https://ieee.nitk.ac.in/blog/finfets/ + weekly + + + + https://ieee.nitk.ac.in/blog/compliant-mechanisms/ + weekly + + + + https://ieee.nitk.ac.in/blog/big-data/ + weekly + + + + https://ieee.nitk.ac.in/blog/dealing-with-underdetermined-systems/ + weekly + + + + https://ieee.nitk.ac.in/blog/hyperloop/ + weekly + + + + https://ieee.nitk.ac.in/blog/graphene/ + weekly + + + + https://ieee.nitk.ac.in/blog/promises-closures-and-potatoes/ + weekly + + + + https://ieee.nitk.ac.in/blog/fluid-mechanics-in-everyday-life/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-fourth-industrial-revolution/ + weekly + + + + https://ieee.nitk.ac.in/blog/through-the-eyes-of-a-computer/ + weekly + + + + https://ieee.nitk.ac.in/blog/introduction-to-reverse-engineering/ + weekly + + + + https://ieee.nitk.ac.in/blog/google-image-search-grid/ + weekly + + + + https://ieee.nitk.ac.in/blog/lighting-up-your-room/ + weekly + + + + https://ieee.nitk.ac.in/blog/the-class-of-np/ + weekly + + + + https://ieee.nitk.ac.in/blog/why-not-chemical-engineering/ + weekly + + + + https://ieee.nitk.ac.in/blog/introduction-to-gpu-computing/ + weekly + + + + https://ieee.nitk.ac.in/blog/how-to-get-started-with-bots/ + weekly + + + + https://ieee.nitk.ac.in/blog/hello-world/ + weekly + + + + https://ieee.nitk.ac.in/blog/getting-to-love-the-terminal/ + weekly + + + + https://ieee.nitk.ac.in/blog/installing-ubuntu/ + weekly + + + + https://ieee.nitk.ac.in/blog/introduction-to-ieee/ + weekly + + + \ No newline at end of file diff --git a/blog/six-stroke-engine/index.html b/blog/six-stroke-engine/index.html new file mode 100644 index 0000000..c3bf233 --- /dev/null +++ b/blog/six-stroke-engine/index.html @@ -0,0 +1,492 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Man and his Car

    + +

    The stories are different, yet the same . From the spark that taught him about fire and the wheels that took him to places, to the roads that he hit everyday, he has come a long way. The love and passion to be in one, to feel its heartbeat and power, to drive and tame them, he has always loved them. But rare are those who are interested in the technology that drives their beasts.

    + +

    It is said that technology advances in rapid pace. Though it is right for a majority of areas, advancements in technology seldom has been helpful in improving engine efficiency. And at a time where we seriously discuss about energy sources and their availability in near future, it is true that this matter require some serious attention. This is where the concept of 6 stroke engines come into play.

    + +

    Even though the notions of two-stroke engines and four stroke engines are common as their applications, the six-stroke engines has never gained popularity that it should have. Driven by overcoming the shortcomings of a normal four stroke engine, the six- stroke engines are essentially the beasts.

    + +

    So what is a six-stroke engine?

    +

    It has nothing special, but two extra strokes than the conventional four stroke engine.

    + +

    So how does this work?

    +

    Think about a normal four-stroke engine. The piston moves down to suck in air and fuel, then the fuel pushes up to compress, then the spark plug fires and the burning gas forces the piston down. Then the piston moves back up to push up the exhaust. The six-stroke engine adds two more strokes after the exhaust stroke. Water is injected, and as it turns into steam, it pushes the piston down. Then the piston comes back up to force out the steam. It’s really simple.

    + +

    A six-stroke engine combines an internal combustion engine with a steam engine to turn some of the waste heat into power. The only catch is that you have to add a water tank to your car that’s about the same size as the gas tank. The good news is that you can probably eliminate the radiator.

    + +

    Now… +The question is: Why don’t we see such cars in the street? Probably, because people like you and me are not trying harder. This is surely not the one to be left unexplored.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/smart-contracts/index.html b/blog/smart-contracts/index.html new file mode 100644 index 0000000..b9d5948 --- /dev/null +++ b/blog/smart-contracts/index.html @@ -0,0 +1,501 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Smart contract, also known as a cryptocontract , is a computer program that directly controls the transfer of digital currencies or assets between parties under certain conditions.It not only defines the rules and penalties related to an agreement in the same way that a traditional contract does, but it also automatically enforces those obligations. +Smart contract are similar to a contract in the physical world, but it’s digital and is represented by a tiny computer program stored inside a blockchain.

    + +
    +

    What’s the main idea behind a Smart Contract?

    +
    + +

    Since a smart contract removes reliance on a third party when establishing business relations, the parties making an agreement can transact directly with each other.

    + +

    Working of Smart Contract

    + +

    Consider the example of a crowdfunding platform where product teams share their projects and collect money from supporters until a goal is reached. +If such a platform is centralized – like ABC, for instance – then it acts as a third party between product teams and supporters who donate their money. This means both sides need to trust ABC and, in fact, pay an additional fee to ABC to serve as an intermediary.A smart contract can perform the same crowdfunding actions like sharing projects, setting goals, and collecting donations, but without a third party.We can program a smart contract to execute all of these actions.More precisely, we can program a smart contract to receive funds until a goal is reached. If the project gets fully funded before the deadline, the money raised automatically goes to the product team. If the project fails, the money automatically goes back to supporters.Since a smart contract is stored inside a blockchain where all data is stored in a decentralized manner, no one is in control of the money. In a decentralized business model, smart contracts replace any other trusted third party.

    + +

    Why trust a Smart Contract?

    +
      +
    1. They’re immutable : which means a smart contract can never be changed and no one can tamper with or break a contract.
    2. +
    3. They’re decentralized: which means that the outcome of the contract is validated by everyone in the network, just like any transaction on a blockchain. Distribution makes it impossible for an attacker to force control to release funds, as all other participants would detect such an attempt and mark it as invalid.
    4. +
    + +

    So what are the benefits of Smart Contract?

    +
      +
    1. Direct dealings with customers : Smart contracts remove the need for intermediaries and allow for transparent, direct relationships with customers.
    2. +
    3. Fraud reduction : Since smart contracts are stored in a decentralized blockchain network, their outcome is validated by everyone in that network.
    4. +
    5. Record keeping : All contract transactions are stored in chronological order in the blockchain and can be accessed along with the complete audit trail.
    6. +
    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/smart-grid/index.html b/blog/smart-grid/index.html new file mode 100644 index 0000000..d42a577 --- /dev/null +++ b/blog/smart-grid/index.html @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    How many times have you felt guilty about excessive usage of electricity when you see your monthly bill? Imagine managing the electricity delivered to your house like you manage activities like personal banking from a computer!

    + +

    You will no longer have to wait till the end of the month to know how many units you have consumed- you have “Smart meters,” and other mechanisms, will allow you to see how much electricity you use, when you use it, and its cost. It also comes with real-time pricing, which will allow you to save money by using less power when electricity is most expensive.

    + +

    What is a Smart Grid?

    + +

    The grid, is an electric grid which is a network of transmission lines, stations, transformers and more that deliver electricity from the power plant to your houses or establishments. When you connect any device to the switch, you are actually logging onto this grid. This grid is made ‘smart’ by establishing a two way communication between the customers and the supply, digitally. Technologies will work with the electrical grid to respond digitally to our quickly changing electric demand, at the consumer end.

    + +

    Smart Grid

    + +

    How does it work?

    + +

    Visualisation Technology

    + +

    It will be able to explore the state of the grid at the national level and switch within seconds to explore specific details at the street level. It will provide rapid information about blackouts and power quality as well as insights into system operation for utilities. With a platform built on Google Earth, it can also take advantage of content generated by Google Earth’s user community.

    + +

    Advanced Metering Infrastructure

    + +

    It is based on consumer friendly efficiency concepts like ‘Prices to devices’-Assuming that energy is priced on what it costs in near real-time ,price signals are relayed to “smart” home controllers or end-consumer devices .The devices, in turn, process the information based on consumers’ wishes and power accordingly. So, the house or office responds to the occupants, rather than vice-versa. Unlike the traditional way, where technicians are sent to each consumer site monthly to record the data manually for the billing purpose, the smart meters in AMI provide real-time monitoring capability of electric loads remotely. The information on power usage can be collected periodically (e.g., every 15 minutes)

    + +

    Phasor Measurement Units(PMU)

    + +

    This samples voltage and current many times at a second at a given location to give instantaneous visibility into the power system.

    + +

    How is it better than the existing grid?

    + +
      +
    • +

      It can complement the current electric grid system by including renewable energy resources, such as wind, solar, and biomass, which is environmentally cleaner as compared to the fossil fuels used in many bulk electric power generation facilities.

      +
    • +
    • +

      Lesser transmission loss due to decreased distance between the consumer and supply.

      +
    • +
    • +

      Amount of electricity consumed is intimated to the consumer periodically and hence he/she can decide to modify it and in the process save it too. The main challenge in implementing this on a larger scale ,would be the cost of rebuilding the entire electric grid, to make it smart and in the process, to handle the security issues that arise because of the networking ability of a smart grid.

      +
    • +
    + +

    References

    + +

    For further reference about smart grid and its realization, visit

    + +

    SmartGrid

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/smart-lighting-systems/index.html b/blog/smart-lighting-systems/index.html new file mode 100644 index 0000000..043e19a --- /dev/null +++ b/blog/smart-lighting-systems/index.html @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Idea

    + +

    With the ongoing developments in the technological World, a lot of efforts have been invested in the field of automation to make everyone’s life easier. As engineering students and the future of the World, it is our responsibility to lead the world into a better future via introducing technology which would reduce human effort as much as possible. Our project, Smart Lighting System is aimed at automating the process of lighting of homes in order to personalize the control over the system and to adapt itself to its surroundings for better experience. So basically we decided to introduce 3 main features in the system:

    +
      +
    1. Voice Control
    2. +
    3. People Counter
    4. +
    5. Adaptive Brightness
    6. +
    + +

    Implementation

    + +

    The idea of a Smart Lighting System was conceived in the month of December 2017. Soon, a basic circuit was designed to give the project a start. After discussions, the team decided to implement the system using light dependent resistors (LDR), an LED, an Arduino board and Lasers as the major components. The team consisted of four first year students who were divided into two groups to take care of the software and hardware part of the project separately. The software part included setting up of a voice control interface to switch the light on or off. The hardware part included setting up the person counter and adaptive brightness feature of the project.

    + +

    After division of the team, the software group began their work to set up a voice control interface. The initial period (January-February) was spent in learning the basics of signal processing which would be needed throughout the project. Topics such as energy of signals, convolution and correlation were learnt during this time. The basic idea was to compare real time signals with a pre-recorded signal and compare the two signals to test for their similarity. If a certain threshold value was cleared, a suitable message was sent to the system to execute a certain function. All this was done using normalized correlation using Python by converting signals into arrays. The code was written in the month of March (till mid-march) and certain difficulties were faced due to the fact that these were relatively new topics to the students. Post writing the code, the team tested the code by using pre-recorded signals "ON" and "OFF" to switch the system on and off respectively. In order to cut-out background noise, low pass and high pass filters were also used to enhance the performance of the code.

    + +

    Basic

    + +

    The hardware group implemented their part by using an Arduino board as the main component of the project. In order to count the number of people in the room, two lasers and two LDRs were used and the data received by the LDRs was forwarded to the Arduino board. An Arduino code was written in order to differentiate between a person entering and exiting the room and even a few unwanted situations were taken care of through the code. The adaptive brightness was executed using an LDR kept in isolation from the system. Based on the intensity of light falling on the isolated LDR, the brightness of the LED was made to vary inversely using an Arduino code. The two codes were integrated to work together in harmony. The components used included an LED, LDRs, lasers, jumper wires, a breadboard and an Arduino board.

    + +

    Circuit

    + +

    After the basic work done by both the groups, it was time to integrate them both in order to make the system work as intended. The python and Arduino code were integrated using Py-serial. As a result, the team was able to complete a Smart Lighting System which was able to take in voice commands, switch itself on/off by itself according to the need and also reduce/increase its brightness according to the need. The project was exhibited by the team in the IEEE Envision Project Expo 2018 which was held in NITK, Surathkal.

    + +

    How did IEEE benefit us?

    + +

    Throughout the project, we learnt the basics of signal processing, Python programming, Arduino programming and the working of components such as LDRs, LEDs and lasers. Teamwork was an essential quality of the teams work which was required for completion of project. The project gave us a lot to learn and we thank IEEE for providing them with an opportunity to give their ideas a proper shape and direction. On an individual basis, we learnt how to work as a team and cooperate with each other for proper implementation of project. Excellent guidance was provided at each and every step by the mentors to group members. They were available almost every time of the day for clearing doubts and helping members troubleshooting problems and never hesitated in clarifying any kind of doubts and problems. The project truly was successful only because of their consistent and sincere efforts and we, the group members highly appreciate and thank them for the same.

    + +

    The Team

    + +
      +
    • Abhi Kalra
    • +
    • Praveen Maiya
    • +
    • Rohan Garg
    • +
    • Iteesha V A
    • +
    + +

    Team

    + +

    Mentors

    + +
      +
    • Manan Sharma
    • +
    • Anirudh B H
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/smartphones-and-health/index.html b/blog/smartphones-and-health/index.html new file mode 100644 index 0000000..1eceaa8 --- /dev/null +++ b/blog/smartphones-and-health/index.html @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The way smartphones have changed our lives is amazing. Technology has been ever bringing multiple facets of our daily lives within the scope of smartphones, which in turn gets smaller and slimmer. No more does our parents bother us to go and pay telephone or electricity bills (if you were a 90’s kid :P) neither does shopkeepers curse you for not having suitable denominations. It has all come down to few swipes and touches. +As new innovations brought the world closer and time shorter, it has not come without any drawbacks, same with the case of smartphones. Again, it’s the way we use it that puts the blot on this device, than the device itself doing the wrong. +Most of us are already aware of the dangers a non-protected cyber world pose. But most of us neglect the health issues which can lead to heavy complications in the long run.

    + +

    Mind your posture

    + +

    image1 +The picture above clearly shows our tendency to lean our necks forward while using mobile phones. something now known as text neck syndrome. Whether you know about increased stresses at support in a cantilever beam (which is similar to our neck when bent forward) or not, this can lead to chronic neck and back pain in the long run.

    + +

    Well….what was I just reading?

    +

    Ever felt you were getting distracted repeatedly while reading something? Are you skipping many articles without reading them completely? Your attention span might be severely affected by nothing other than prolonged exposure to smart media. The contents in modern media have been designed to penetrate your mind with much less effort from your brain. So, it’s just normal that brain finds it difficult to comprehend stuff through relatively strenuous activities like reading (yes, you heard it right)

    + +

    Blue light, Blurred vision

    +

    What comes out from smartphones and laptop screens are generally called blue violet light and will lead to deterioration of cells in the back of the eye. Moreover, we tend not to blink our eyes while staring at such screens and usually bring the phones more closer to our eyes. So, if you wish to see the screen for a further time in your life, take good care of eyes.

    + +

    Relationships – Virtual or Real ?

    +

    What is date or a dinner if the people involved does no talking, but stares at their screens. Only a very few care to talk with co-passengers on a trip. Relationships converges to mere texts, or occasional calls.

    + +

    Anxiety, Sleep and many more..

    +

    Exposure to blue light before going to sleep have adverse effects on biological cycle, leading to disturbed sleep. Anxiety, obesity and depression are few other issues due to over usage of smartphones as they eat up time otherwise meant for social and physical activities.

    + +

    Our body and mind have fathomless capabilities yet to be metered. We haven’t let them out completely, and moreover, too much dependency on technology calls for lesser use of our body and mind. Do make sure you take ample breaks from your time on phones, to talk with others, to think, to dream or at least to take that occasional deep breaths, and trust us, you’ll feel much more better being alive. :)

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/social-engineering/index.html b/blog/social-engineering/index.html new file mode 100644 index 0000000..f8ba856 --- /dev/null +++ b/blog/social-engineering/index.html @@ -0,0 +1,541 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Have you ever stared into the keyboard while your friend is typing a password? Or have you ever made up stories to play a prank on your friend? If the answer to any of the above questions is yes then you are a Social Engineer!

    + +

    image

    + +

    Well now that I have said that you are a social engineer let’s see what that really means. +It refers to psychological manipulation of people into performing actions or giving away confidential information. A type of confidence trick for the purpose of information gathering, fraud, or system access. It may also force people to giving away sensitive information which may cost them or their companies a lot!

    + +

    It goes by the words “People are the weakest link in security” and this is absolutely true! All the complex security for your systems go void when a social engineering attacks takes place.

    + +

    image

    + +

    You can find social engineers everywhere. Even your friends sitting next to you concentrating on your keyboard as you type your passwords is a social engineer. It’s just that there is no certification for this thing. So, let’s see the types of social engineering attacks.

    + +

    Types of Social Engineering

    + +

    1. Phishing

    + +

    phishing

    + +

    Phishing is the fraudulent attempt to obtain sensitive information such as usernames, passwords and credit card details by disguising as a trustworthy entity. This mainly uses disguised email or fake website as a weapon.The main goal of this attack is to trick the email recipient into believing that the message is something they want or need for instance a request from their bank to reset their password or a note from someone in their company asking them to download a file infected with malware. It’s one of the oldest types of attacks, dating back to the 1990s, and it’s still one of the most widespread and techniques becoming increasingly sophisticated day by day. It mainly aims to get your personal information. +It works on the principle that if you cast a large enough net, you are sure to catch a fish. +The mail is sent to you may contain:

    + +
      +
    • Request information
    • +
    • Download infected files
    • +
    • May ask you to visit a compromised site
    • +
    + +

    phishing

    + +

    2. Pretexting

    + +

    pretexting

    + +

    A fictional situation is created for the purpose of obtaining personal and sensitive information from an unsuspecting individual. It usually involves researching a target and making use of his data for impersonation or manipulation. An important aspect of pretexting is establishing a target’s trust. +Attackers can impersonate co-workers, police officers, bankers, tax authorities, insurance investigators, etc. A simpler way to put is that anyone who can be perceived as having right-to-know the information by the target. The attacker only needs to prepare answers to questions that might be asked by the target. Most of the times, an authoritative voice, an earnest tone, and an ability to think on one’s feet are all that is needed to create a pretextual scenario.

    + +

    3. Baiting

    + +

    baiting

    + +

    As you guys might have guessed, it’s the act of promising something good in return of some action or information. Attackers may offer users free music or movie or game downloads, if you give them login credentials to a certain site. Attackers can also focus on exploiting human curiosity via the use of physical media.

    + +

    Now let’s see how this attack can be done? +Let’s take an industrial scenario – with the end goal of infiltrating a company’s network, the attacker may distribute flash drives infected with malware to employees, hoping that the hardware will be inserted into network-connected systems as the means to spread malicious code. Perhaps the innocent-looking devices are in a basket of freebies placed in the company lobby. These devices can be placed strategically so a targeted person will take the bait. The devices may be marked with intriguing labels link “Confidential” or “Salary” to tempt the people to open the files. The employ may take the bait and insert the device into the system connected to the network and Voilà !

    + +

    4. Quid Pro Quo

    + +

    quid-pro-quo

    + +

    Quid Pro Quo Attacks promise a benefit in exchange for information. The benefit usually assumes as a form of service, baiting usually takes the form of a good.It can be considered as a request for your information in exchange for some compensation. If it sounds too good to be true, it probably is quid pro quo…

    + +

    5. Tailgating

    + +

    tailgating

    + +

    Entering a building directly behind someone who has used their identity for access.It takes advantage of the people being courteous. For example: A person impersonates a delivery driver and waits outside a building. When an employee gains security’s approval and opens their door, the attacker asks that the employee ‘hold the door’, thereby gaining access through someone who is authorized to enter the company

    + +

    I’ll share some links for you guys to see how big damage these simple attacks can make. Do have a read :

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/space-based-solar-power/index.html b/blog/space-based-solar-power/index.html new file mode 100644 index 0000000..2c072d3 --- /dev/null +++ b/blog/space-based-solar-power/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Can you imagine deploying solar panels in space and efficiently converting the solar power that is received right from space and then transmitting the energy back to earth wirelessly, interesting right?

    +
    +

    Space-based solar power project is a daring effort that collects the solar energy from the sun in space, converts it to energy and sends it down to Earth via microwaves. +Energy transmitting satellites that are placed in the geosynchronous orbit of the earth collect high intensity uninterrupted solar radiation by using giant mirrors that reflect huge amounts of solar rays onto two smaller solar collectors. This radiation is then wirelessly beamed to earth in a safe and controlled way as either a microwave or laser beam.

    +
    + +

    But first, we need to understand:

    +
      +
    • Why space..?
    • +
    • Don’t ground-based solar conversion units do the same?
    • +
    • Why spend so much effort on implementing this system in space?
    • +
    + +

    Why we implement it in Space:

    +

    In space there is no atmosphere, it’s never cloudy and in geosynchronous orbit, it is never night. The intensity of sunlight in space is 10 times more compared to its intensity on earth. Moreover, 30% of all incoming solar radiation is reflected by the earth’s atmosphere and doesn’t even make it to the ground. Solar power on earth is greatly affected by weather conditions and isn’t an uninterrupted source of energy. Space is the perfect place for a solar power station to harvest uninterrupted power and can provide the earth with massive amounts of clean and renewable energy. lt has the potential to solve the energy crisis in the near future.

    + +

    In the near future humanity will have to make a transition from an energy based on fossil fuels, an exhaustible resource that is damaging our atmosphere and causing unknown long term effects on the climate-to a system based on clean, safe, reliable and renewable source of energy. Space-based solar power seems to be a perfect fit solution to this. It is an innovation designed to retain the advantages of traditional solar power while at the same time eliminating its disadvantages.

    + +

    The idea behind this is quite simple. Instead of coping with the unpredictability and intermittency of solar power on the ground, implement it in space where the sun always shines.

    + +

    In Geostationary orbit, the intensity of the sun is 36% more compared to that on the ground and Solar arrays in space can collect almost 10 times the amount of energy as the same configuration placed somewhere in the mid-latitude region on earth.

    + +

    This technology is not something that has been thought of recently but has been in research since the early 1970s. Though this idea has been around for a decade now, it has become increasingly feasible, now that the launch costs are getting into the economically feasible zone for power satellites. In the last few years, however, scientists around the globe and several researchers at the US energy department have shown how recent technological developments could make this concept a reality.

    + +

    How does it work?

    +

    Design for a Space-based solar power system was developed by an American engineer, Peter Glacer, who in 1973 also received a patent for his design (which is as shown in the figure): + how it works + According to this design, the solar power that would be collected by the solar panels is converted into electrical energy and would be transmitted by a microwave antenna, which is built onto the satellite, to a large ground-based receiver called Rectenna.

    + +

    After Glacer’s patent work, significant developments in this design have been taken place in the US, Canada, Europe, Japan, China, and India.

    + +

    In 2011 the International Academy of Astronautics then produced it’s highly detailed first International Assessment of space solar power. According to the IAA report: +"There are no fundamental technical barriers that would prevent the realization of large-scale SPS platforms during the coming decades." + This tells us that this project is technically achievable

    + +

    Space-based solar power essentially consists of three elements:

    +
      +
    • A means of collecting solar power in space. For example, via solar concentrators, solar cells or heat engines.
    • +
    • A means of transmitting power to earth. For example, via microwave or laser.
    • +
    • A means of receiving power on earth. For example, via a microwave antenna or rectenna. +receiving power
    • +
    + +

    According to the IAA, there are 3 types of satellite architectures that can perform this task :

    +

    1. Type one architecture :

    + +

    type one architecture

    + +

    Very large PV array with microwave power transmission, i.e., +Multiple solar panel arrays are deployed in space and all of them integrated into one singular system that converts solar energy into electrical energy and this energy can be beamed down to earth using microwaves.

    +

    2. Type two configuration:

    + +

    type two config

    + +

    Large PV array with laser power transmission, i.e., +A constellation of small satellites can be used, where each satellite has its own solar power conversion unit and all the converted energy is beamed down to earth in the form of laser energy, which is close to the visible spectrum. They are typically placed about 100 kilometers above the earth’s surface.

    + +

    3. Type three configuration:

    +

    type three config1

    + +

    type three config2

    + +

    Optical concentrator with microwave power transmission, i.e.,

    + +

    This configuration is based on a symmetrical optical concentrator or “sandwich” design which does not require very large photovoltaic panels, rather vast arrays of mirrors, several kilometers across, that collect and redirect sunlight onto much smaller photovoltaic solar cells. The electricity so created is then transmitted to the earth through a simple microwave link. In this configuration, the satellite is placed 36,000 kilometers above the ground.

    + +

    Such an approach simplifies the power management and distribution arrangement compared to Type one or Type two configurations, as captured solar energy can be largely moved around by redirection rather than through physical electrical infrastructure.

    + +

    Type three systems may, therefore, prove the most viable to construct. Power in this system would be transmitted using a technique called Retro-directive Phased Array where an encrypted pilot signal from the ground handshakes with the satellite’s active electronic beam steering system to link the transmitter and receiver.

    + +

    Laser solar satellites Vs Microwave solar satellites

    + +

    Pros of laser solar satellites:

    + +
      +
    • Relatively low startup costs in the $500 million to $1 billion range.
    • +
    • The single launch per laser transmitting satellite would be self-assembling, lowering the cost and risks substantially.
    • +
    • The small diameter of the laser beam would make it simpler and cheaper to implement on the ground.
    • +
    + +

    Cons of laser solar satellites:

    + +
      +
    • Comparatively low power of each individual satellite, in the area of one to ten Megawatt per satellite would require several satellites to make a substantial impact.
    • +
    • There are several safety concerns with lasers in space such as blinding and weaponization.
    • +
    • Laser transmitting satellites would have trouble beaming power through heavy clouds and rain.
    • +
    + +

    Pros of microwave satellites:

    + +
      +
    • Steady uninterrupted transmission of power through rain, clouds, and other atmospheric conditions.
    • +
    • Safely transmits power through the air at intensities no greater than the midday sun.
    • +
    • It provides up to one Gigawatt of energy to a terrestrial receiver, enough to power a large city.
    • +
    + +

    Cons of microwave solar satellites:

    + +
      +
    • Production costs in the tens of billions of dollars range requiring as many as 100 launches into space, with space-based assembly required.
    • +
    • The terrestrial receiver would be several kilometers in diameter.
    • +
    • The long-distance of the satellite from earth would make it nearly impossible to repair.
    • +
    + +

    Rectenna

    +

    rectenna

    + +

    The beam terminates on an earth-based receiver called a Rectenna with a maximum intensity at the rectenna’s center and tapering to nearly nothing at the periphery. The rectenna could be just about the size of a municipal airport and is made up of a mesh of dipole antennas that capture all the incident energy from the beam. It is nevertheless 80% transparent to sunlight, allowing the land beneath to remain available for agricultural uses.

    + +

    According to the November 2011 IAA report, these satellites could transmit as much as 1 to 10 GW of constant energy as compared to a typical nuclear power station’s output of 0.5 to 1.0 GW. A GW could light 750,000 homes. That is the potential of this satellite!

    + +

    Challenges:

    + +

    Some of the challenges involved in implementing this project are as follows:

    + +
      +
    • low-cost reusable space access.
    • +
    • dealing with launch costs.
    • +
    • demonstration of space to earth power beaming.
    • +
    • efficient and light spaced, qualified with solar arrays
    • +
    • space assembly maintenance and servicing.
    • +
    • large in-space structures.
    • +
    + +

    Nearly every assessment has concluded that SBSP is technically achievable. Few argue that SBSP is impossible because of its economic costs. But a system that is actually capable of solving the serious problems on the global agenda such as sustainable development, climate change, energy security and simultaneously enhancing mankind’s ability to access and make the best use of the resources of space deserves serious consideration.

    + +

    While the satellite would suffer degradation due to space environment factors such as particle radiation and meteor material impacts, as would any satellite, it would provide a lifetime of 20 to 30 years for every satellite. It does not require the kind of heavy maintenance that is required by a ground-based power plant either (which is subject to weather damage). A nation with the capability to launch 100 satellites to construct an SPS would certainly have the access and capability to service it.

    + +

    If successful in the market, ultimately thousands of systems could be launched to geosynchronous orbit to supply a part or all of the estimated 55 terawatt power requirements for all earthly needs by the year 2100.

    + +

    Humanity has never contemplated either a space or energy project on such a vast scale or one which would alter our relationship with the cosmos. It is a space project, an energy project, a transportation project, and an infrastructure project. It is a project that could solve the future energy crisis with clean and renewable energy.

    + +

    Space solar power can completely solve our energy problems in the long term. We could stop burning coal, we could stop burning fossil fuels, we could even shut down our nuclear power plants if this system gets implemented. Remote areas on earth that don’t have access to electricity due to the sheer difficulty of drawing out electric cables to those areas to transmit power could be easily powered with this technology! It would be the key to humanity’s survival. The sooner we start and the harder we work, the shorter “long term” will be.

    + +

    References for further reading :

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/space-ml/index.html b/blog/space-ml/index.html new file mode 100644 index 0000000..68eb308 --- /dev/null +++ b/blog/space-ml/index.html @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A Convolutional Neural Network.
    +A Convolutional Neural Network and 90 minutes of training

    + +

    Clearly, the hard part wasn’t the training or the model but to get the training set.
    +But what is the data? and where did we get it form?

    + +
    +

    On December 14, 2017 NASA announced the discovery of an eigth planet in the Kepler-90 system. Kepler-90 is a Sun-like star 2545 light-years from Earth. The discovery was made using Artificial Intelligence.

    +
    + +

    Where did the data come from?

    + +

    NASA has this huge camera up in space that has been sending us videos of stars of interest every 29.4 minutes. That’s an oversimplification of what the Kepler Space Telescope does, but it’s enough for the purpose and essence of this article. Kepler’s 94.6 megapixel[1] camera has a fixed field of view, which means it’s been looking at the same spot in the sky since it launched in 2009.

    + +

    That’s a lot of data.

    + +

    What is the data?

    +

    To understand the data, we need to first understand how NASA detect planets. Planets don’t emit light. So how does Kepler even see planets that are lightyears away? Planets don’t emit light… but Stars do. Kepler measures the brightness of stars over several years and since planets orbit around stars, they must cross the line of sight between kepler and the star periodically.

    + +

    Kepler Transit Graph

    + +

    So, Kepler puts up a nice brightness vs time graph and sends it back to us every 29 minutes. A periodic dip in the graph implies that there must be a planet. NASA classified periodic dips that may be consistent with transiting planets as Threshold Crossing Events (TCE). The Kepler team initially heterogenously put together TCEs by hand, but later on they designed an Auto Vetter that automatically eliminates uninteresting candidates.

    + +

    And this gives the raw unprocessed dataset: The Autovetter Planet Candidate Catalogue hosted at the NASA Exoplanet Archive. The light curves that were used to find the new planets are from the Mikulski Archive for Space Telescopes. Each light curve in this dataset consists of integrated flux (brightness) measurements spaced at 29.4 minute intervals for upto 4 years[2].

    + +

    Processing the dataset

    + +

    The researchers at NASA then followed this up with flattening the light curve by fitting a basis spline (removes the low frequency variability) and then dividing it by the best-fit spline (connect the dots and smoothen them).

    + +

    They had to then fold (to make it event centered[3]) and bin the flattened curve to produce a 1D vector.

    + +

    Binning and folding are two methods of making trends in messy data more apparent.

    + +
    +

    Folding is useful when a source has periodic variability; the data is plotted in terms of phase, such that all the data are plotted together as a single period, in order to see what the repeated pattern of variability is.

    +
    + +

    Folding is basically splitting the graph into blocks and then overlapping all the blocks on top of one another. This way we can notice repeated patterns more easily.

    + +
    +

    Random variations from this pattern can be reduced by binning the data in time, which involves splitting the phase range into steps (bins) in which all the data are averaged, using a weighted mean.

    +
    + +

    Even if we do fold the graph, it’s still really messy since there may be random variations in the data. Binning can be thought as averaging the data out at a folded point in time to give 1 point.

    + + + + + + + + + + + + + + + + +
    Original Light CurveFolded CurveBinned Curve
    Light CurveFolded CurveBinned Curve
    + +

    The problem with binning the TCE dataset is that all the periods in our light curves are of different lengths. Different planets have different orbital lengths, different orbital periods and different distances from Earth. Hence, different periods of transits. So, how did they bin these light curves to act as inputs?

    + +

    They generated two separate views of the same light curve:

    + +
      +
    1. +

      A global view which was generated by binning by a fraction of the TCE period. These views, the global views of the light curves, were all binned to the same length, and each view represents the same number of points, on average, across all light curves.

      +
    2. +
    3. +

      A local view which was generated by binning by a fraction of the TCE duration. This results in a zoomed in view of the TCEs. It treats short and long TCEs equally and so might miss out on some information. It looks at only a part of the curve.

      +
    4. +
    + +

    Source

    + +

    The dataset is now ready.

    +

    The researchers then passed these views as inputs into the their multilayered convolutional network and trained.

    + +

    Resources

    + +

    Although this post is not going to divulge into the details of the neural network, you can check it out on their research paper: Identifying Exoplanets with Deep learning.

    + +

    If you want to know more about binning, folding and how to apply them with numpy, go here.

    + +

    [1] Kepler only sends back about 5% of the 94.6MP based on our Stars of Interest
    +[2] Roughly 70000 points
    +[3] There are 4 years of data and planets don’t cross all the time. So, we need to remove the parts where they aren’t crossing.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/speed-printing/index.html b/blog/speed-printing/index.html new file mode 100644 index 0000000..f01fc07 --- /dev/null +++ b/blog/speed-printing/index.html @@ -0,0 +1,533 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    +

    3D printing technology is often used to construct highly complex objects of different kinds, properties and materials. Despite its numerous advantages, one major drawback of 3D printers is its traditionally slow speed. This is where it fails miserably, in its large scale applicability, against other major manufacturing processes like injection moulding. To overcome this major industry challenge, several 3D companies have come up with more updated and efficient technologies that guarantee quick speeds and utmost accuracy. One of the successful and modern technology is CLIP (short for, continuous liquid interface production).

    + +
    +

    A typical 3D printing machine such as Stereolithography (SLA) can take several hours to print a 55mm diameter object and maybe several days to complete a larger object, while injection moulding takes minutes for the same.

    +
    + +

    Additive manufacturing startup Carbon 3D has developed an efficient technology that helps manufacturers cut their costs, waste less energy and materials while speeding up the time it takes to get from concept to product on the market. Some years back, it launched the M1 3D printer. The M1 used UV light in a process called stereolithography to grow objects from a pool of photopolymer resin which was not at all out of the box. But Carbon’s technology allowed it to print in a steady stream rather than layer-by-layer, letting it churn out sophisticated objects up to 100 times faster than traditional stereolithography printers

    + +

    In order to properly understand how the CLIP technology differs, we need to learn about the basic principles involved in Stereolithography. It’s the process by which a uniquely designed 3D printing machine, called a stereolithograph apparatus (SLA) converts liquid plastic into solid objects layer-by-layer.

    + +

    How Stereolithography works:

    + +

    From CAD to STL:

    + +
    +

    CAD files are digitalized representations of an object to be printed.

    +
    + +

    There are many different ways to 3D print an object. But nearly all of them utilize computer aided design (CAD) files. In 3D printing, CAD files are translated into Standard Tessellation Language (STL) that 3D printing machines can easily understand. Since additive manufacturing works by adding one layer of material on top of another, CAD models are broken up into layers before being printed in three dimensions.

    + +

    Basic Working

    + +

    A SLA machine has four main parts: a tank that can be filled with liquid plastic or photopolymer, a perforated platform that is lowered into the tank, an ultraviolet (UV) laser and a computer controlling the platform and the laser. It starts with an excess of liquid plastic called as photopolymer, which is cured or hardened to form a solid object. In the initial step of the SLA process, a thin layer of photopolymer is exposed above the perforated platform. The UV laser hits the perforated platform, “painting” the pattern of the object being printed. The UV-curable liquid hardens instantly when the UV laser touches it, forming the first layer of the 3D-printed object. Once the initial layer of the object has hardened, the platform is lowered, exposing a new surface layer of liquid polymer. The laser again traces a cross section of the object being printed, which instantly bonds to the hardened section beneath it. This process is repeated again and again until the entire object has been formed and is fully submerged in the tank. The platform is then raised to expose a three-dimensional object. After it is rinsed with a liquid solvent to free it of excess resin, the object is baked in an ultraviolet oven to further cure the plastic. +SLA can go top-down (build platform facing up, descending while printing) or bottom-up (build platform facing down, ascending while printing). The bottom-up approach has the advantage that the object can be much larger than the vat itself, as the other approach requires the vat to contain the object. Bottom-up approaches also have an extra step where once a layer is done, the vat needs to ‘rock’ it off the resin (“flexing and peeling the bottom of the vat away from the hardened photopolymer” so that the build platform can be pulled up cleanly.

    + +

    Continuous Liquid Interface Production

    + +

    CLIP

    + +

    CLIP, which stands for Continuous Liquid Interface Production, eliminates shortcomings of other 3D printing technology by emphasizing a tunable photochemical process over a traditional mechanical approach. The control over the solidification occurs by balancing oxygen and light to discriminately cure photo liquid resin. Continuous Liquid Interface Production technology uses components as shown in the image above such as

    + +
      +
    1. BUILD PLATFORM
    2. +
    3. UV CURABLE RESIN
    4. +
    5. OXYGEN-PERMEABLE WINDOW
    6. +
    7. DEAD ZONE
    8. +
    9. PROJECTOR
    10. +
    + +

    CLIP

    + +

    How the CLIP Process Works

    + +

    Carbon’s technology works through two phases. The first one, CLIP, consists of shaping the part by projecting a light through an oxygen-permeable window into a reservoir of UV-curable resin. As the UV images are projected in a sequence, the part solidifies and the build platform rises, allowing 3D objects to continuously grow without interruption. This is similar to SLA with a slight difference: it introduces oxygen into the liquid resin in order to control what is known as the dead zone.

    + +
    +

    The dead zone is a thin, liquid interface of uncured resin between the window and the printing part where the light passes through.

    +
    + +

    During the development stage, images are fed into the system using a digital light projector via an oxygen permeable UV transparent screen. This process takes place beneath a liquid resin bath.

    + +

    CLIP

    + +

    The second phase consists of thermal curing by baking the parts in a forced circulation oven to set off the properties of the materials. Through this process, a secondary chemical reaction sets off and causes the materials to adapt and strengthen, ultimately achieving desired engineering-grade mechanical properties.

    + +

    Comparison:

    + +

    Now, as we are aware of the basic working of both the techniques, we can now understand what sets them apart in terms of speed. CLIP is much faster than bottom-up technologies that require a peel step between every layer as the cured layers stick to the resin container. That is, by far, the slowest step of SLA printing with most modern light sources. CLIP is a bottom-up technique that doesn’t require a peel step, because the vat creates an oxygen layer over the window that keeps the resin from curing directly on the surface and sticking. In that way, it arguably performs more like a top-down printer than a bottom-up printer.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/state-management-in-flutter/index.html b/blog/state-management-in-flutter/index.html new file mode 100644 index 0000000..e1b0d35 --- /dev/null +++ b/blog/state-management-in-flutter/index.html @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Let’s start by getting one thing clear.

    + +

    What do you mean by “state”?

    + +

    Essentially, the state of the app, or a particular widget in the app, is just information, that is used to render the UI. This means that any change in the UI was caused by a change in the state of the application.

    + +
    What is a State?
    +
    + +

    Alright, but what is state management?

    + +

    State management is nothing but a means to handle the multiple states your application can have. But to go further here, we need to understand the difference between Ephemeral State and Application State.

    +
    State Management
    + +
    + +

    Ephemeral State vs Application State

    +

    You can think of the Ephemeral state as the state that is localized to a particular, very small part/widget in the application.
    For example, a password text field may have two states:

    + +
      +
    1. Hide Password
    2. +
    3. Show Password
    4. +
    + +

    As you can probably guess, the state that may be controlling this particular widget is extremely localized and can be handled easily with a setState() method.

    + +

    This is an ephemeral state.

    + +

    On the flip side, if you think of another more large-scale feature, such as implementing a dark mode, the state that will be working with this, will have a large-scale impact throughout the application, and hence it cannot be handled with a vanilla setState() method.

    + +

    This is an Application state, and this is where the concept of requiring a state management system comes in.

    +
    + +

    Okay, so how does state management help?

    +

    We will answer this by looking at the pros and cons of using setState() and Flutter BLoC(a popular state management plugin)

    + +

    setState()

    + +

    Pros of setState()

    + +
      +
    1. Very easy and straightforward to understand.
    2. +
    3. A great way to handle the Ephemeral State.
    4. +
    + +

    Per the docs: Ephemeral State is sometimes called UI State or local State. It’s the State you can neatly contain in a single widget.

    + +

    Cons of setState()

    + +
      +
    1. Not a good way to handle things involving app State (Global State and parts of the State you want to persist between sessions).
    2. +
    3. Using setState() all over an app can become a maintenance nightmare very quickly because your State is scattered all over the place
    4. +
    5. Usually used within the same class as the UI code, mixing UI and business logic, which breaks clean code principles. In a tiny app, this is no big deal but it becomes a concern quickly when you have more than just a couple of screens. You can separate the logic with a little effort, but there are better ways to handle State Management once an app grows beyond a few pages.
    6. +
    7. From my personal experience, your app will quickly become laggy and slow if you use a lot of setState() method. This is because it rebuilds the entire widget tree each time it is called.
    8. +
    + +
    + +

    Flutter BLoC(Business Logic Component)

    + +

    BLoC is an architectural state management pattern created and used by Google

    + +

    BLoC stands for Business Logic Components, and it’s much more of an architecture than setState(); it has even been compared to MVVM (Model, View, View Model). Unlike the others, BLoC makes use of Streams and it’s often used with Provider ( another state management plugin ), which is often used as a way of exposing the BLoC for the UI.

    + +

    But what does it do? Anything you want. Maybe you fed it a String that said “Smith” and the logic in the BLoC was made to return a list of everyone in your contacts list with that last name. Maybe the BLoC gets fed the number of clock ticks that have passed since an animation started and the BLoC’s job is to calculate the position of your bouncing ball based on how long ago you pressed the button. You can make it do whatever you want, it’s an architecture, a method of handling State… what you do with it is entirely up to you.

    + +
    BLoC Flow
    + +

    Pros of BLoC

    + +
      +
    1. Easy to separate UI from logic
    2. +
    3. Easy to test code
    4. +
    5. Easy to reuse code
    6. +
    7. Good Performance
    8. +
    + +

    Cons of BLoC

    + +
      +
    1. Technically, you need to use streams in both directions, creating a lot of boilerplate. However, many people cheat this by using streams only from the backend to the UI, but when events occur they’re simply calling functions directly instead of feeding those events into a sink.
    2. +
    3. More boilerplate code, but it’s worth it due to the extensive reusability.
    4. +
    + +
    + +

    Conclusion

    + +

    In this article we discussed

    + +
      +
    1. What is state?
    2. +
    3. What is state management?
    4. +
    5. What are the two types of state?
    6. +
    7. Comparison of two popular yet very different techniques to implement state management.
    8. +
    + +

    There are other options as well which are beyond the scope of this article like Redux, Flutter Hooks, etc.

    + +
    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/stem_cells/index.html b/blog/stem_cells/index.html new file mode 100644 index 0000000..aa04a36 --- /dev/null +++ b/blog/stem_cells/index.html @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    STEM CELL TECHNOLOGY

    + +

    What are stem cells?

    + +

    Imagine waking up from a tragic accident that left you paralyzed from the neck down, will there be any hope to recover completely? Won’t it be amazing if there was a research that the use of stem cells could lead to potential treatments and cures.

    + +

    With the advent of technology in the fields of artificial intelligence, robotics, genetics, etc., homo sapiens are finally at the threshold of a path to revitalizing and renewing our current fields of health care.

    + +

    Stem cells are cells that can differentiate into other types or kinds of cells, and can also divide in self-renewal to produce more of the same kind of stem cells.

    + +

    Image1

    + +

    The origin of stem cell technology

    + +

    The history of stem cell research had a benign, embryonic beginning in the mid 1800’s with the discovery that some cells could give birth to other cells. The first actual stem cells were discovered in the early 1900’s when it was found that some cells generate blood cells.

    + +

    Image2

    + +

    More on stem cells

    + +

    Both animal and human stem cells have been worked on in the history of their research. Stem cells can be classified into three extensive categories, based on their ability to differentiate and produce cells. Totipotent stem cells are found only in early embryos, hence are also called embryonic stem cells. Every cell is capable of forming a complete organism (e.g., identical twins). Stem cells residing in a developing embryo can differentiate itself into all the specialized cells—ectoderm, endoderm and mesoderm while maintaining the normal turnover of regenerative organs, such as blood, skin, or intestinal tissues. Pluripotent stem cells, yet another type exist in the undifferentiated inner cell mass of the blastocyst and can form any of the over 200 different cell types present in the body. Multipotent stem cells are derived from fetal tissue, cord blood, and adult stem cells, which are found in various tissues of fully developed mammals. In adult organisms, stem cells and progenitor cells carry out the task of replenishing adult tissues and hence acting as a repair system for the body. Although they lag behind in their ability to differentiate than pluripotent stem cells, they already have a track record of success in cell-based therapies.

    + +

    Image3

    + +

    The inference is embryonic stem cells can become all cell types of the body because they are pluripotent whereas adult stem cells are thought to be limited to differentiating into different cell types of their origin.

    + +

    Image4

    + +

    Where are stem cells found

    + +

    Till date we are aware of three known unrestricted sources of autologous adult stem cells in humans: bone marrow, adipose tissue, and blood. Stem cells can be obtained conveniently from umbilical cord blood just after birth. In accordance with all the recent studies of all stem cell therapy types, autologous harvesting involves the least risk.

    + +

    Usually the stem cells remaining after the birth of a baby are discarded, but they can be used in future to regenerate a body part of the person which usually can’t be done by using adult stem cells.

    + +

    Therefore, there is a provision of preserving the stem cells immediately after a baby is born so that they can be used for regenerating a body part in future. If not isolated and cultured properly and with great care, stem cells can’t survive. Therefore, in most cases, they are of no use if they aren’t preserved immediately after the birth.

    + +

    According to the current research, the stem cells extracted from a baby can be used to regenerate the damaged or lost organ of that baby as well as his/her close blood relatives.

    + +

    Image5

    + +

    Field of medical research studying human and animal stem cells is referred to as stem cell technology. Stem cells are characteristically and naturally occurring cells essential for the growth and regeneration of organisms. Stem cells are already used for therapeutic purposes, and research suggests potential future benefits of stem cells in many fields of medicine. This research is controversial, however, because some such technology involves the use of human embryos.

    + +

    Stem cells occur in all multicellular organisms. They are capable of transforming into any of the specialized cells necessary for the growth and maintenance of organs. In developing embryos, they become the cells necessary for the formation of various organs. In later life, they replenish these organs by replacing dead or diseased cells. Stem cell technology helps us to achieve a better understanding of this complex process.

    + +

    Stem cells in bone marrow replenish the body’s supply of blood cells. Bone marrow transplants, a common treatment for leukemia patients, are one form of stem cell technology. Some scientists believe that similar uses of stem cells could eventually treat diseases as diverse as diabetes, nerve disease, Alzheimer’s and hearing loss. If genetic research can explain the functioning of stem cells, they could theoretically be used to replace cells damaged or destroyed by these diseases.

    + +

    Concluding remarks

    + +

    Stem cell research is a relatively new technology that develops primitive human cells into most any of the 220 varieties of cells in the human body, including blood cells and brain cells.

    + +

    Experts suggest that the ability to use a patient’s own cellular material to cure him or her will lessen the chance of transplant or therapy rejection, as the body will be less likely to attack its own cells. Medical experts have made several early advances in the fight against cancer and blood disorders with the help of stem cell research which began in the late 20th century.

    + +

    In recent years, proposition of many isolation and culture technologies has encouraged the application of stem cells in research of disease mechanism and clinical therapy. However, most types of stem cells have their own disadvantages for therapeutic applications, such as lack of availability, risk of immune rejection, directional regulation, and the most baffling one, ethical controversy. The recent discovery of iPSCs (Induced pluripotent stem cells) holds the potential to solve these problems. However, the low efficiency of iPSCs generation and their therapeutic safety need to be further studied and be thorough before its application in initiation of human clinical trials. The speed and efficiency of iPSCs generation from both mouse and human somatic cells can be enhanced by adding vitamin C to the culture medium and the safety of iPSCs may be improved by using non-integrating viral vectors. Therefore, it is expected that clinical application of iPSCs will be achieved in the near future, which will mark a historical leap in the area of medicine.

    + +

    Advancement and through application of stem cell technology in organ transplant, increasing life span, curing paralysis etc. will surely lead to a massive leap towards improvement in the field of healthcare.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/storing-energy-in-salt/index.html b/blog/storing-energy-in-salt/index.html new file mode 100644 index 0000000..6c044e8 --- /dev/null +++ b/blog/storing-energy-in-salt/index.html @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Renewable energy is the answer to sustainable development. It is the hot topic of our generation and even though it is in its rudimentary stage, it is the best solution in maintaining the balance between environment and our energy needs. We all know that a lot of research is going on in this field, whether it is the oft talked about and used solar and wind energy, or the slightly less used ocean thermal energy.

    + +

    But, what do you do after you produce this energy? What if it is in excess to your current need? You need to store it because… Frankly, it would be a waste of resources otherwise. And this is the need of the hour.

    + +

    A lot of this storage is now being done on Lithium ion batteries but we’re still trying to find new ways to store it which is more efficient, environment friendly and cost effective as well. One of these methods is storing energy in molten salt.

    + +

    What is the molten salt technology?

    + +

    Basically, it stores energy in molten salts. Salt at the room temperature is brought to a higher temperature by heating and hence converting it into its molten state. The energy is stored as the latent heat of the salt. This energy being stored can be used as and when required.

    + +

    Alphabet’s ‘Project Malta’ have used this concept to store energy from wind and solar. The set up consists of 4 large, insulated vats, 2 containing salt and the other 2 containing antifreeze. The electrical energy produced from these sources is used to create 2 separate streams of hot and cold air. These streams are used to respectively heat the salt and cool the antifreeze. When we need to use this energy, the 2 reservoirs can be used to produce hot and cold streams of air that leads to the formation of powerful gusts; this can then be used to run the turbine. The advantage of this method is that it is non-toxic and chemically inert.

    + +

    Solar Reserve also uses the same basic concept. Here, we have a tank with a salt which is a mixture of sodium and potassium nitrate. The heat energy from the sources is used to heat up the salt and then it is maintained at a higher temperature of around 560˚C. To use this energy, it is sent to a heat exchanger which produces steam at high temperature and pressure. This is then used to run a turbine.

    + +

    Apart from this, a lot of research is also going on in this field all over the world. The University of South Australia recently won the ANSTO Eureka Prize for Innovative Use of Technology for their ground-breaking work in this field.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/string-genetic/index.html b/blog/string-genetic/index.html new file mode 100644 index 0000000..8a5ae03 --- /dev/null +++ b/blog/string-genetic/index.html @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    A genetic algorithm is a search heuristic inspired by Darwin’s theory of natural evolution. A genetic algorithm reflects the process of natural selection: the fittest survive and breed.

    + +

    The process of natural selection begins by selecting the fittest individuals from a population. The cross to produce offsprings that have characterestics of both parents. If both parents have good fitness, then their child is also likely to inherit their characterestics and have better fitness.

    + +

    In this introduction, we will be trying to match a string from scratch.

    + +

    Environment and Population

    + +

    First, we need to define an environment that would determine the fitness of an individual. Here, our environment would be the String that we’re trying to create.

    + +

    So, a string S of some length with alphanumeric characters.

    +
    	String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    +
    + +

    Any string of any length is an individual in this environment.

    + +
    	Individual = "LAKSKDJLKMCasdkjAKSDjkj"
    +
    +

    Our initial population would we filled with multiple such individuals with random letters and numbers.

    + +

    Fitness

    + +

    The fitness of an individual is proportional to how close it is to the defined string S for this environment.

    + +
    	Individual = "ABCDEFGHIJKLMNOPQRSTUVWXYS"  
    +	Fitness(Individual) = (Number of characters in Individual same as String)  
    +			      / (Number of characters in String)  
    +						= 25/26
    +						= 0.962
    +
    + +

    The python code below implements the fitness function we’ve defined.

    + +
        def evaluate_fitness(actual, new):
    +        together = itertools.zip_longest(actual, new, fillvalue=None)
    +        cost = len([a for a,b in together if a == b])
    +        cost /= max(len(actual), len(new))
    +        return cost
    +
    + +

    Breeding and Mutation

    +

    As per Natural Selection laws, the fittest individuals should survive (along with some random unfit undividuals) and breed to create the next generation of individuals.

    + +

    Given two parents, We can define breeding to select a character from the two parents at random. That is, We would choose the ith character of Parent 1 or the ith character of Parent 2 at random for the ith character of the Child.

    + +

    To simulate mutation, given a 0 < mutation rate < 1 if a uniformly generated pseudorandom floating point number is greater than this defined mutation rate, then an alphanumeric character is randomly chosen to be in that position i for the child. We can also used the same mutation rate to randomly add or remove an extra character in the child.

    + +
        def make_child(parent_1, parent_2):
    +        longer_parent  = list(parent_1 if len(parent_1) > len(parent_2) else parent_2)
    +        shorter_parent = list(parent_2 if len(parent_1) > len(parent_2) else parent_1)
    +    
    +        child = longer_parent.copy()
    +        n = len(shorter_parent)
    +        i = 0
    +        while i < n:
    +            child[i] = random.choice(characters) if random.uniform(0, 1) > mutation_rate else child[i]
    +            
    +            if (i < len(shorter_parent)):
    +                child[i] = shorter_parent[i] if random.uniform(0, 1) > 0.5 else longer_parent[i]
    +            
    +            if(len(child) < length_max):
    +                if (random.uniform(0,1) > mutation_rate):
    +                    child.insert(i, random.choice(characters))
    +                    n+=1
    +                
    +            if (random.uniform(0,1) > mutation_rate):
    +                child.remove(child[i])
    +                n-=1
    +            i+=1
    +        return "".join(child)
    +
    + +

    Wrapping it all up

    + +

    After concretely defining our environment, to genrate a random population and choosing the best indiviuals and breeding them to create the next generation is trivial.

    + +

    Check out the full notebook here

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/supercap/index.html b/blog/supercap/index.html new file mode 100644 index 0000000..5fb3291 --- /dev/null +++ b/blog/supercap/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    A supercapacitor is a specially designed capacitor which has an enormous capacitance. While capacitors used in everyday life tend to have values in the nano or microfarad range, supercapacitors can have values of upto 12,000 F depending on their application.

    + +

    img1

    + +

    Construction

    + +

    Like an ordinary capacitor, a supercapacitor has two plates that are separated. The plates are made from metal coated with a porous substance such as powdery, activated charcoal, which effectively gives them a bigger area for storing much more charge.

    + +

    What about the separator between the plates? In an ordinary capacitor, the plates are separated by a relatively thick dielectric made from something like mica , a thin plastic film, or even simply air. When the capacitor is charged, positive charges form on one plate and negative charges on the other, creating an electric field between them. The field polarizes the dielectric, so its molecules line up in the opposite direction to the field and reduce its strength. That means the plates can store more charge at a given voltage.

    + +

    In a supercapacitor, there is no dielectric as such. Instead, both plates are soaked in an electrolyte and separated by a very thin insulator (which might be made of carbon, paper, or plastic). When the plates are charged up, an opposite charge forms on either side of the separator, creating what’s called an electric double-layer, maybe just one molecule thick.

    + +

    We all know of the standard capacitance equation : c=eA/d

    + +

    Supercapacitors drastically increase the area A and the value of e, while reducing the distance d to facilitate such high capacitance values.

    + +

    Supercapacitors vs batteries

    + +

    The big advantage of a supercapacitor is that it can store and release energy almost instantly, much more quickly than a battery. That’s because a supercapacitor works by building up static electric charges on solids, while a battery relies on charges being produced slowly through chemical reactions, often involving liquids.

    + +

    Batteries have a higher energy density (they store more energy per unit mass) but supercapacitors have a higher power density (they can release energy more quickly). That makes supercapacitors particularly suitable for storing and releasing large amounts of power relatively quickly, but batteries are still king for storing large amounts of energy over long periods of time.

    + +

    Since supercapacitors work electrostatically, rather than through reversible chemical reactions, they can theoretically be charged and discharged any number of times (specification sheets for commercial supercapacitors suggest you can cycle them perhaps a million times). They have little or no internal resistance, which means they store and release energy without using much energy and work at very close to 100 percent efficiency (97-98 percent is typical).

    + +

    img2

    + +

    Applications

    + +

    Energy recovery

    + +

    A primary challenge of all transport is reducing energy consumption and reducing emissions. Recovery of braking energy helps with both. This requires components that can quickly store and release energy over long times with a high cycle rate. Supercapacitors fulfill these requirements and are therefore used in a lot of applications in all kinds of transportation.

    + +

    Consumer electronics

    + +

    Supercapacitors are frequently designed into these products for memory protection. Internal back-up power is another common application. The supercapacitor can be used either as a battery replacement or as a short-term redundant backup supply. Most recently, Samsung started using supercapacitors in the S Pen which comes along with the Galaxy Note 9. The supercapacitor enables the S Pen to be used for almost 30 minutes, with a mere 40 seconds of charge.

    + +

    Transportation

    + +

    In early 2005 Shanghai tested a new form of electric bus called capabus that runs without power lines using large onboard supercapacitors that partially recharge whenever the bus is at a stop (under so-called electric umbrellas), and fully charge in the terminus. In 2006, two commercial bus routes began to use the capabuses; one of them is route 11 in Shanghai. It was estimated that the supercapacitor bus was cheaper than a lithium-ion battery bus, and one of its buses had one-tenth the energy cost of a diesel bus with lifetime fuel savings of $200,000.

    + +

    Conclusion

    + +

    The field of supercapacitors is one that needs a significant amount of research to develop further and be economically feasible to manufacture at a large scale. It should, however see great innovations with the introduction of materials such as graphene. The future sure does look exciting as it does offer a considerable amount of application potential, especially in the fields of renewable energy and electric/hybrid vehicles.

    + +

    Even Elon Musk once said, “If I were to make a prediction, I’d think there’s a good chance that it is not batteries, but supercapacitors.”

    + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/tSNE/index.html b/blog/tSNE/index.html new file mode 100644 index 0000000..6cb1c63 --- /dev/null +++ b/blog/tSNE/index.html @@ -0,0 +1,597 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    It’s manually impossible to understand the structure of a dataset with 100 dimensions. And it’s fairly common to come across data having so many features. And the exploratory-analysis of data is a preliminary step, before proceeding to other aspects of data-wrangling and models. This is where t-SNE comes in.

    + +

    t-SNE is non-linear dimensionality reduction algorithm. It reduces each high-dimensional point and embeds them into a 2D/3D map. Additionally, it ensures that similar objects are nearby and dissimilar points are kept apart.

    + +

    Uses of t-SNE

    + +
      +
    • It’s hard to visualize high-dimensional objects
    • +
    • Existing data-visualization techniques only enable visualization of few variables at a time.
    • +
    • Helps to find the local structures in data, and see if there are any clusters of points in the high-dimensional manifold.
    • +
    • Helps us decide if there are any distinct classes in the data, whether they are linearly or nonlinearly separable, etc.
    • +
    • It’s used in a lot of applications cutting across Computer Security, Music Analysis, Cancer research, and in abstract cases like visualising the learnings of different layers of a Artificial Neural Network, etc.
    • +
    + +

    Here’s a nice example of t-SNE’s usage in last year’s IEEE project(GoT chabot) https://gist.github.com/kaushiksk/ea0c0f25c082acb8604ad84466f85ca8

    + +

    It’s necessary to know about other dimensionality reduction techniques like Principal Component Analysis (PCA) to truly appreciate the distinctive nature of t-SNE.

    + +

    PCA

    + +

    PCA tries to retain the maximum information about high-dimensional data even after embedding it into a low dimension. It does this by finding out a few components in the higher dimension along which the maximum variation of the data is ensured. Hence it preserves the variation in the data even after reducing it to a lower dimension. Mathematically, PCA minimises the squared-error between points - essentially ensures that far-away points in the original dataset remain in the same way in the 2D map also. So PCA preserves large pairwise distances(global structure and properties), but these distances do not imply any meaningful property. +But it loses the the low-variance deviations between neighbours. t-SNE filled this gap by accounting for local properties, which have a lot of significance irrespective of the overall structure/topology of data.

    + +

    Moreover PCA is not very useful for unlabelled data. This is quite evident by looking at the visualizations produced by PCA and t-SNE on the MNIST dataset.

    + +

    Output of PCA over the MNIST dataset

    + +

    Distinct clusters are not produced by PCA. The distinctness is evident only because of the color-coding, so PCA is not very helpful for unlabelled data.

    + +

    Output of t-SNE over the MNIST dataset

    + +

    On the other hand, the presence of clusters is striking with unlabelled-data using t-SNE. The bottom right, we can see the labelled version of the same. Hence, t-SNE finds a lot of utility with unlabelled data, over and above PCA.

    + +

    Some Interesting properties of t-SNE:

    + +
      +
    • Crowding problem: Semantically similar points in higher dimension will collapse onto one-another when brought down to a lower dimension. t-SNE solves this problem, unlike the previous dimensionality algorithms like PCA and SNE.
    • +
    + +

    So the effectiveness/relevance of t-SNE is put into question if the required output is in a fairly higher dimension, where the possibility of crowding is low. On the other hand, PCA always gives the best components along which the variance of the data is maximised.

    + +

    Hence, the results of t-SNE is much better if the degrees of freedom is increased, because the crowding problem is less severe. Consequently, visualising data in 3D rather than 2D gives a lot of gains in using t-SNE.

    + +
      +
    • t-SNE does not intentionally retain distances/densities: It only retains the probabilities. It adapts it’s idea of distance to the local-variations of densities. So it automatically expands dense clusters (to prevent overcrowding) and expands sparse ones. This effect is expected due to the design of the algorithm. Relative sizes/distances between clusters in a t-SNE do not have any sensible interpretation. The same reason can be attributed to why we can’t perform “clustering upon the output of t-SNE” using distance/density based algorithms like KNN/K-means. But neighbourhood-graph based clustering approaches will produce the desired result. Hence t-SNE is best used for visualization purposes only.
    • +
    + +
    +

    Do not apply clustering upon the output of t-SNE

    +
    + +
      +
    • t-SNE uses a non-convex objective function: The error/divergence is minimised using gradient descent(which is initialised randomly), so we might get different results for different iterations/initialisations. t-SNE might have multiple minima which necessitates multiple runs, and places a question on the reproducibility of results. Practically, t-SNE is iterated until the results stabilise.
    • +
    + +
    +

    Multiple runs with the same parameters might not give the same result

    +
    + +
      +
    • +

      Perplexity is one of the parameters required by the algorithm. It dictates the number of effective of neighbours to be considered while calculating probabilities. So, the perplexity of a distribution over N items can never be higher than N (in this case, the distribution will be uniform). At low values of perplexity, the local variations might dominate, so usually values between 5 and 50 are chosen. We don’t have a universal value of ideal perplexity that gives the best results for all types of datasets, so we will have to tune it as a hyper parameter. With increase in number and density of data points, perplexity should also increase.

      +
    • +
    • +

      t-SNE can generate fake patterns at suboptimal perplexities. We may be on a wild-goose chase if we incorrectly expect clusters when there are actually none.

      +
    • +
    + +

    Consider a gaussian distribution with 250 points in (-2, 0) and 500 points in (0, 2).

    + +

    Original Distribution

    + +

    Using EM(Expectation Maximisation) clustering algorithm produces this result:

    + +

    Clustering using EM

    + +

    The following are the visualizations produced by t-SNE:

    + +

    Perplexity = 20

    + +

    It’s easy to conclude that there are 4 clusters here, while there are only two.

    + +

    Perplexity = 40 (default)

    + +

    Here, there are too many clusters, and it’s hard for any dim-reduction algorithm to find them. +(Note: The color coding is only for our interpretation)

    + +

    Perplexity = 80 (optimum)

    + +

    This result is from the optimum perplexity of 80, but since perplexity is a global parameter that needs to be tuned and is not the same for every dataset.

    + +

    The results are even more stark when these visualizations are obtained from a gaussian distribution as illustrated here. (https://distill.pub/2016/misread-tsne/)

    + +
      +
    • Time complexity of t-SNE is O(N^2), N = Number of Data points. (grows quadratically) +Since t-SNE, doesn’t scale well, PCA is first applied to the data (PCA has a better complexity) and number of features is reduced to a maximum of 50 dimensions. t-SNE is then applied onto the output of PCA. This step also ensures that t-SNE works with lesser noisy data.
    • +
    + +

    But later implementations of t-SNE have better time complexity

    + +

    There are certain cases t-SNE could be sub-optimal:

    + +
      +
    • +

      Interpretability: t-SNE only maps the local l variables correctly, and the global trends in the data isn’t accurately represented. But PCA’s results can be explained very easily.

      +
    • +
    • +

      Application to new data: t-SNE learns a non-parametric mapping - it does not learn an explicit function from the input space to the map. The embedding in t-SNE is learnt by directly moving the data from high-dimension to low dimension. So we can’t apply t-SNE on the fly for an incoming test data point. But we can always apply t-SNE on the whole dataset again. Alternately, we can train a multivariable regressor to predict the position of an input point in the map or directly minimise the t-SNE loss (https://lvdmaaten.github.io/publications/papers/AISTATS_2009.pdf).

      +
    • +
    • +

      Incomplete Data: t-SNE cannot handle incomplete data. A popular workaround is to use probabilistic PCA on the data, and then use t-SNE.

      +
    • +
    + +

    Further Reading:

    +
      +
    1. t-SNE
    2. +
    3. Visualizing Representations: Deep Learning and Human Beings Christopher Olah’s blog, 2015
    4. +
    5. https://distill.pub/2016/misread-tsne/
    6. +
    7. Visualizing Data Using t-SNE
    8. +
    + +

    Despite these misgivings, t-SNE might probably be the first tool a data scientist uses in the morning! Have fun exploring it. Do comment below for any clarifications or suggestions.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html new file mode 100644 index 0000000..fb289e3 --- /dev/null +++ b/blog/tags/index.html @@ -0,0 +1,10042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    +

    #Tags

    +
    +
    +
    +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + +
    +
    + + + + Introduction + + Linux + + Ubuntu + + Unix + + Terminal + + Bash + + GCC + + C + + Programming + + HelloWorld + + Bots + + High Performance Computing + + Game Development + + Chemical + + Career Advice + + Algorithms + + P v/s NP + + CAS + + SPS + + EEE + + Web Design + + Grid + + CTF + + Ethical Hacking + + Security + + Computer Vision + + Image Processing + + Artificial Intelligence + + IoT + + Automation + + Fluid Mechanics + + JavaScript + + Graphene + + hyperloop + + Linear Algebra + + Big Data + + Compliant mechanisms + + FinFETS + + CVT + + Transmission + + Constant Engine RPM + + Infinite gear ratio + + Multitenancy + + Cloud Computing + + SaaS + + Structural engineering + + Felix Candela + + File Parsing + + Logging + + Number Theory + + Group + + Ring + + Rng + + Field + + Finite Field + + Galois Field + + Machine Learning + + AI + + 3D Printing + + Additive Manufacturing + + SIS + + High Lift devices + + Bluetooth + + Raspberry Pi 3 + + Internship + + Smartphone + + Negative effects + + random + + PRNG + + TRNGs + + cryptography + + Lehmer's RNG + + OpenCV + + six stroke engines + + Hashing + + C++ + + Competitive Programming + + Data Structures + + Sports + + ML + + Security AI + + Aviation + + Environment + + Game Theory + + Strategy + + Water Memory + + Arduino + + Smart homes + + Energy + + Research + + Innovation + + Networking + + Torrents + + P2P + + Space + + NASA + + Case Study + + GUI + + GTK+ + + Gnome + + Quantum Computing + + biology + + hacking + + biological hacking + + superhuman + + cyborgs + + Chatbot + + Chat + + Language Processing + + fingerprint + + sensors + + fingerprint sensor + + Aircraft Engines + + Raspberry Pi + + SEO + + Google + + Web + + Deep Learning + + Generative Adversarial Networks + + GANs + + Generative Models + + Robots + + Formula One + + ECU + + TAG-320 + + Virtual Image + + Augmented Reality + + transmitter + + reciever + + Honeycomb Conjecture + + Hexagonal cells + + Iot + + Power + + LIGO + + Docker + + Containers + + DevOps + + AI threat + + Magnetism + + Smart grid + + Electric grid + + QR code + + Aeronautics + + Complexity theory + + Logic + + Mathematics + + Renewables + + Thermal Sciences + + Stock Market + + Support Vector Machine + + RFID + + ADC + + Qubits + + Rovers + + Rocker Bogie + + E Ink + + Speed Printing + + Stereolithography + + Tesla + + Edison + + AC/DC + + SSL + + Public Key Cryptography + + differently-abled + + assistive technology + + text scanners + + optical sensors + + bionic + + eye tracking system. + + Fluid Dynamics + + Satellites + + Bit masks + + DP + + Data Visualization + + t-SNE + + Electric Cars + + CAS/SPS + + Piston + + Android + + Django + + Spatial Imaging + + virtualization + + qemu + + graphene + + electronics + + Braking + + Alterego + + Data mining + + Apriori + + electric power grid + + 50Hz frequency + + electronic devices + + Shock Waves + + CFD + + heap + + exploitation + + memory + + allocation + + blockchain + + heavy electronics + + Nanotechnology + + Nano motors + + Motors + + ATP + + Biology + + Genetic Algorithms + + String + + Genes + + Chromosome + + Blockchain, Consensus, Distributed systems + + biometrics + + brainprint + + Electronics + + Bionics + + Biomicry + + AWS + + nanotechnology + + nanomedicine + + magnetoserum + + panacea + + Segment Trees + + Drone + + Hobbycraft + + Avionics + + Flight Control + + Storage Device + + Material + + IEEE NITK + + CompSoc + + Industries + + Manufacturing + + Diode + + resistors + + capacitors + + zener diode + + voltage transients + + regulators + + GPU + + parallel computing + + light backscatter + + fat content in milk + + gerber method + + coagulating milk + + aerodynamics + + vortex + + formula 1 + + aviation + + flight + + airflow + + fluids + + Web 3.0 + + Ethereum + + Blockchains + + neurostimulators + + remote control + + SPG + + heart + + disease + + treatment + + surgeries + + Drive by wire + + Steer by wire + + Autonomous vehicle + + KMP + + Strings + + Supercapacitors + + Energy Storage + + Futurology + + Batteries + + Convolution + + Up-sampling + + Neural Networks + + MEMS + + Organic Photovoltaics + + Excitons + + Photo-active layer + + Ballistics + + LED + + Television + + Micro + + ZKP + + Cryptography + + Gaming + + Cloud + + Google Project Stream + + Nvidia Now + + Gesture controlled + + accelerometer + + RF transmitter + + RF receiver + + motor driver + + NEMS + + Biomedics + + Electronic + + Skin + + Healthcare + + Robotics + + Embedded + + Prosthetic + + Sensor + + Stretchable + + Nanoparticles + + Nanosheets + + DNA + + Flutter + + Dart + + Cross platform mobile development + + galliumnitride + + GaN + + transistors + + wafers + + silicon + + newsilicon + + technology + + Computer Games + + Reinforcement Learning + + Monte Carlo Tree Search + + Alpha-Go + + NanoMedicine + + Targeted drug delivery + + Overlooked advancements + + EPR effect + + Thermal Vision + + IR + + Sensors + + Parallel Computing + + Big Data Processing + + Distributed Systems + + Photochemical Reactions + + Photo catalysts + + Catalysis + + Photo Catalysis + + Semiconductors + + Colloidal semiconductors + + Biochemistry + + Self Healing Materials + + Machines + + Blockchain 2.0 + + Smart Contract + + Memresistor + + Non Volatile Memory + + Social engineering + + Drones + + Machine learning + + Supervised learning + + tweets + + Natural Language Processing + + Machine translation + + Switch Riddle + + DIAL + + RNN + + ELF + + Binary + + RADARSs + + Doppler Processing + + Image + + Recurrent Neural Networks + + Long Short Term Memory Neural Networks + + Requirements + + Systems + + Solar Power + + NLP + + ML/AI + + Web Sockets + + Networks + + low power + + wireless communication + + stem cells + + Autopilot + + Modern Aircraft + + RF transmission + + Antennas + + Li-Fi + + Wireless Networks + + Piezoelectricity + + PSLV + + Mars + + web + + vulnerabilities + + Graph Theory + + Power Systems + + Genome Editing + + Git + + Github + + Communication + + Protocols + + Synchronous + + Ekranoplan + + Python + + Researchers + + Theoretical Computer Science + + ECC + + Randomization + + LSTM + + Materials + + Audio recording and reproduction + + Games + + Multi-Agent Systems + + Microservices + + Power Generation + + Civil + + Style Transfer + + Unsupervised Learning + + Communication Protocol + + DDR + + RAM + + Digital Systems + + Matrix Exponentiation + + Steganography + + Encryption Techniques + + State Management + + Development + + Good Practices + + IEEE-NITK + + Audio Processing + + Concrete + + Data Storage + + Systems Engineering + + Internet of Things + + Kubernetes + + Disjoint-set + + Data Structures and Algorithms + + Computer Architecture + + Medical Electronics + + Javascript + + Debugging + + Blockchain + + + +
    + + + Introduction + + + Linux + + + Ubuntu + + + Unix + + + Terminal + + + Bash + + + GCC + + + C + + + Programming + + + HelloWorld + + + Bots + + + High Performance Computing + + + Game Development + + + Chemical + + + Career Advice + + + Algorithms + + + P v/s NP + + + CAS + + + SPS + + + EEE + + + Web Design + + + Grid + + + CTF + + + Ethical Hacking + + + Security + + + Computer Vision + + + Image Processing + + + Artificial Intelligence + + + IoT + + + Automation + + + Fluid Mechanics + + + JavaScript + + + Graphene + + + hyperloop + + + Linear Algebra + + + Big Data + + + Compliant mechanisms + + + FinFETS + + + CVT + + + Transmission + + + Constant Engine RPM + + + Infinite gear ratio + + + Multitenancy + + + Cloud Computing + + + SaaS + + + Structural engineering + + + Felix Candela + + + File Parsing + + + Logging + + + Number Theory + + + Group + + + Ring + + + Rng + + + Field + + + Finite Field + + + Galois Field + + + Machine Learning + + + AI + + + 3D Printing + + + Additive Manufacturing + + + SIS + + + High Lift devices + + + Bluetooth + + + Raspberry Pi 3 + + + Internship + + + Smartphone + + + Negative effects + + + random + + + PRNG + + + TRNGs + + + cryptography + + + Lehmer's RNG + + + OpenCV + + + six stroke engines + + + Hashing + + + C++ + + + Competitive Programming + + + Data Structures + + + Sports + + + ML + + + Security AI + + + Aviation + + + Environment + + + Game Theory + + + Strategy + + + Water Memory + + + Arduino + + + Smart homes + + + Energy + + + Research + + + Innovation + + + Networking + + + Torrents + + + P2P + + + Space + + + NASA + + + Case Study + + + GUI + + + GTK+ + + + Gnome + + + Quantum Computing + + + biology + + + hacking + + + biological hacking + + + superhuman + + + cyborgs + + + Chatbot + + + Chat + + + Language Processing + + + fingerprint + + + sensors + + + fingerprint sensor + + + Aircraft Engines + + + Raspberry Pi + + + SEO + + + Google + + + Web + + + Deep Learning + + + Generative Adversarial Networks + + + GANs + + + Generative Models + + + Robots + + + Formula One + + + ECU + + + TAG-320 + + + Virtual Image + + + Augmented Reality + + + transmitter + + + reciever + + + Honeycomb Conjecture + + + Hexagonal cells + + + Iot + + + Power + + + LIGO + + + Docker + + + Containers + + + DevOps + + + AI threat + + + Magnetism + + + Smart grid + + + Electric grid + + + QR code + + + Aeronautics + + + Complexity theory + + + Logic + + + Mathematics + + + Renewables + + + Thermal Sciences + + + Stock Market + + + Support Vector Machine + + + RFID + + + ADC + + + Qubits + + + Rovers + + + Rocker Bogie + + + E Ink + + + Speed Printing + + + Stereolithography + + + Tesla + + + Edison + + + AC/DC + + + SSL + + + Public Key Cryptography + + + differently-abled + + + assistive technology + + + text scanners + + + optical sensors + + + bionic + + + eye tracking system. + + + Fluid Dynamics + + + Satellites + + + Bit masks + + + DP + + + Data Visualization + + + t-SNE + + + Electric Cars + + + CAS/SPS + + + Piston + + + Android + + + Django + + + Spatial Imaging + + + virtualization + + + qemu + + + graphene + + + electronics + + + Braking + + + Alterego + + + Data mining + + + Apriori + + + electric power grid + + + 50Hz frequency + + + electronic devices + + + Shock Waves + + + CFD + + + heap + + + exploitation + + + memory + + + allocation + + + blockchain + + + heavy electronics + + + Nanotechnology + + + Nano motors + + + Motors + + + ATP + + + Biology + + + Genetic Algorithms + + + String + + + Genes + + + Chromosome + + + Blockchain, Consensus, Distributed systems + + + biometrics + + + brainprint + + + Electronics + + + Bionics + + + Biomicry + + + AWS + + + nanotechnology + + + nanomedicine + + + magnetoserum + + + panacea + + + Segment Trees + + + Drone + + + Hobbycraft + + + Avionics + + + Flight Control + + + Storage Device + + + Material + + + IEEE NITK + + + CompSoc + + + Industries + + + Manufacturing + + + Diode + + + resistors + + + capacitors + + + zener diode + + + voltage transients + + + regulators + + + GPU + + + parallel computing + + + light backscatter + + + fat content in milk + + + gerber method + + + coagulating milk + + + aerodynamics + + + vortex + + + formula 1 + + + aviation + + + flight + + + airflow + + + fluids + + + Web 3.0 + + + Ethereum + + + Blockchains + + + neurostimulators + + + remote control + + + SPG + + + heart + + + disease + + + treatment + + + surgeries + + + Drive by wire + + + Steer by wire + + + Autonomous vehicle + + + KMP + + + Strings + + + Supercapacitors + + + Energy Storage + + + Futurology + + + Batteries + + + Convolution + + + Up-sampling + + + Neural Networks + + + MEMS + + + Organic Photovoltaics + + + Excitons + + + Photo-active layer + + + Ballistics + + + LED + + + Television + + + Micro + + + ZKP + + + Cryptography + + + Gaming + + + Cloud + + + Google Project Stream + + + Nvidia Now + + + Gesture controlled + + + accelerometer + + + RF transmitter + + + RF receiver + + + motor driver + + + NEMS + + + Biomedics + + + Electronic + + + Skin + + + Healthcare + + + Robotics + + + Embedded + + + Prosthetic + + + Sensor + + + Stretchable + + + Nanoparticles + + + Nanosheets + + + DNA + + + Flutter + + + Dart + + + Cross platform mobile development + + + galliumnitride + + + GaN + + + transistors + + + wafers + + + silicon + + + newsilicon + + + technology + + + Computer Games + + + Reinforcement Learning + + + Monte Carlo Tree Search + + + Alpha-Go + + + NanoMedicine + + + Targeted drug delivery + + + Overlooked advancements + + + EPR effect + + + Thermal Vision + + + IR + + + Sensors + + + Parallel Computing + + + Big Data Processing + + + Distributed Systems + + + Photochemical Reactions + + + Photo catalysts + + + Catalysis + + + Photo Catalysis + + + Semiconductors + + + Colloidal semiconductors + + + Biochemistry + + + Self Healing Materials + + + Machines + + + Blockchain 2.0 + + + Smart Contract + + + Memresistor + + + Non Volatile Memory + + + Social engineering + + + Drones + + + Machine learning + + + Supervised learning + + + tweets + + + Natural Language Processing + + + Machine translation + + + Switch Riddle + + + DIAL + + + RNN + + + ELF + + + Binary + + + RADARSs + + + Doppler Processing + + + Image + + + Recurrent Neural Networks + + + Long Short Term Memory Neural Networks + + + Requirements + + + Systems + + + Solar Power + + + NLP + + + ML/AI + + + Web Sockets + + + Networks + + + low power + + + wireless communication + + + stem cells + + + Autopilot + + + Modern Aircraft + + + RF transmission + + + Antennas + + + Li-Fi + + + Wireless Networks + + + Piezoelectricity + + + PSLV + + + Mars + + + web + + + vulnerabilities + + + Graph Theory + + + Power Systems + + + Genome Editing + + + Git + + + Github + + + Communication + + + Protocols + + + Synchronous + + + Ekranoplan + + + Python + + + Researchers + + + Theoretical Computer Science + + + ECC + + + Randomization + + + LSTM + + + Materials + + + Audio recording and reproduction + + + Games + + + Multi-Agent Systems + + + Microservices + + + Power Generation + + + Civil + + + Style Transfer + + + Unsupervised Learning + + + Communication Protocol + + + DDR + + + RAM + + + Digital Systems + + + Matrix Exponentiation + + + Steganography + + + Encryption Techniques + + + State Management + + + Development + + + Good Practices + + + IEEE-NITK + + + Audio Processing + + + Concrete + + + Data Storage + + + Systems Engineering + + + Internet of Things + + + Kubernetes + + + Disjoint-set + + + Data Structures and Algorithms + + + Computer Architecture + + + Medical Electronics + + + Javascript + + + Debugging + + + Blockchain + + +
    + + + + + + + + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/blog/technology-in-sports/index.html b/blog/technology-in-sports/index.html new file mode 100644 index 0000000..269f7bb --- /dev/null +++ b/blog/technology-in-sports/index.html @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The world of sport is continually changing over the years, and the use of technology is just one of those areas that has made an impact on many sports. It has changed the way players approach a particular sport. Various technologies are used to assist umpires or referees, while some of them are used for advanced coaching and enhanced experience for fans.

    + +

    A digital coach…

    +

    In the recently concluded Champions Trophy 2017, smart bats were used to obtain various data. Small sensors, fixed at the top of the handle, were used. +The bat sensor, powered by the Intel Curie technology, can be mounted on any cricket bat to generate data for every stroke that the batsman plays. With this technology, parameters like back-lift, bat speed from start of the shot till the end of bat swing and follow-through can be tracked for every stroke. This can be used for efficient coaching and improving the game level. After making smart bats, Intel is working on a future smart ball to obtain data for each delivery.

    + +

    Hawkeye

    +

    Hawkeye +Hawkeye hit the screens in 2001. It is the technology used to track a ball’s trajectory. Hawk-Eye uses technology originally used for brain surgery and missile tracking. It uses six or more computer-linked television cameras situated around the court. Six separate views are obtained and then combined together to produce an accurate 3D representation of the path of the ball. It is presently being used in international cricket and tennis, and many other sports are also looking at making use of this technology. The review system through the use of Hawkeye helps in correcting many umpiring errors.

    + +

    Data analysis

    +

    Data Analysis is changing the nature of sports science. Huge amount of data is collected through special field cameras for analysis. This analysis helps them to appropriately determine the skill set of players, uncover undervalued players, pinpoint aspects of team play that need to be worked on, and selecting the right players in a lineup for optimal performance. This is widely used to figure out the opponents’ weaknesses and make suitable strategies.

    + +

    Few other examples

    +

    Hot Spot is an infrared imaging system used in cricket to determine whether the ball has struck the batsman, bat or pad. Hot Spot requires two infra-red cameras on opposite sides of the ground above the field of play that are continuously recording images. Any suspected snick or bat/pad event can be verified by examining the infrared image, which usually shows a bright spot where contact friction from the ball has elevated the local temperature.  +Snick-o-Meter is a very sensitive microphone located in one of the stumps, which can pick up the sound when the ball nicks the bat. This technology is currently used to in the review system to show if the ball did or did not actually hit the bat.

    + +

    Future!

    +

    Over the past few years media broadcasting has improved with advancement in camera technology. Technology is being used for deciding players’ diet, proper clothing material for match comfort and the players’ safety. +Research is going on to discover how technology can be used in sports. Various equipment designs for players safety, apps and websites for fans are being developed. Seeing the technology growth, one won’t be surprised to see a robot-umpire in the future.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-airbag-system-for-two-wheeler-vehicle/index.html b/blog/the-airbag-system-for-two-wheeler-vehicle/index.html new file mode 100644 index 0000000..653bad2 --- /dev/null +++ b/blog/the-airbag-system-for-two-wheeler-vehicle/index.html @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    The Airbag system was first introduced in 4-wheelers . This paper gives information about the introduction of the airbag system can be used in the two wheelers(bikes). This paper shows the working, construction, installation of this system and problems that can occur in this system.

    + +

    The concept of this airbag system is “To reduce the injuries to a rider when impacting with an opposing vehicle and/or opposing object in frontal collisions by absorbing rider kinetic energy and by reducing rider separation velocity from motorcycle in the forward direction.” With the help of the ANGLE sensor with an angle indicator and sense of the collision and the large frequency vibration for to open the air bag.

    + +

    Design with required instruments

    + +

    The following instruments are used for the 2 wheeler Airbag system —

    + +
      +
    1. +

      Air bag (leather material with grip technology)

      +
    2. +
    3. +

      Chemical cylinders for releasing the air or gas

      +
    4. +
    5. +

      Sensors (angle sensor and crash sensor)

      +
    6. +
    7. +

      Fitting cage

      +
    8. +
    9. +

      Inflator

      +
    10. +
    + +

    Air bag (leather material with grip technology)

    + +

    Airbags are stretchable fabrics or other materials that are tightly packed in various locations throughout your vehicle. These bags are compressed and kept in a small area. When there is an accident, the airbags fill up with air very quickly to provide a cushioning system for the people on the motorcycle so that they are not thrown around in the event of a crash. While this does not necessarily prevent total injury or death, it can be very helpful in cushioning the passengers in many cases.

    + +

    Chemical reaction behind opening of airbag

    + +

    Actual opening of air bag is due to the chemical reaction occurred in between two chemical cylinders which are fit at the bottom of bike. When an external force or collision of two objects with bike occur then the chemicals in those two chemical cylinders mix with each other and the chemical reaction takes place inside the cylinder.

    + +

    In 2-wheeler vehicle system, the air bags are fit in both sides of the bike. Figure shows the position of the air bag system to be fitted so that the total protection of the vehicle can be covered hence they pedestrian safety can be achieved.

    + +

    Sensors (angle sensor and crash sensor)

    + +

    The most important parts behind the success of the airbag system are the sensors. These are small pieces of electronics that are designed to tell when the vehicle has been damaged in an accident. They respond to several different sets of stimuli, including sudden stopping, increased pressure as pieces of the motorcycle are moved due to the force of the collision, and angle between road surface and tires of motorcycle. Different types of sensors measuring wheel speed, seat occupant status, brake pressure and impact, and other vehicle status indicators are monitored by the airbag control unit located in the front portion of the cabin.

    + +

    Fitting cage

    + +

    Image1

    + +

    Figure 1 - Modification for the airbag container

    + +

    Figure 1 shows that the modification is required for the storage of airbag. This cage is made up of metal strips with two openings for airbag.

    + +

    Image2

    + +

    Figure 2 -Airbag opens up on the right side of bike as the angle exceeds 30 degrees.

    + +

    From figure 2 The angle between road surface and motorcycle tyres exceeding 30 degrees is detected by using an angle sensor, hence as given above chemical reaction takes place and airbag opens up on right side of the motorcycle. In this figure 2 shows that the airbag contains Grips to the lower surface of it.

    + +

    Image3

    + +

    Figure 3-airbag opens up in both directions when any object collapses to the +motorcycle.

    + +

    When any object collides with the motorcycle ,at that time the airbag opens up in both directions to protect the passenger who is riding.

    + +

    Inflator

    + +

    Once the control unit determines there is an accident, it sends a signal to the inflator system. The inflator sets off a chemical charge, producing an explosion of nitrogen gas, filling up the airbag. As the airbag fills up, it bursts through the paneling that contains it in order to protect you.

    + +

    All this happens in an instant, usually within 25 or 50 milliseconds. That translates to almost 200 miles per hour. The airbag then will deflate itself on its own once it gets deployed.

    + +

    How air bag system protects the human body parts ??

    + +

    The provision of air bags on motorcycles is more complex than installation in cars, because the dynamics of a motorcycle crash are more difficult to predict . But we discussed the following points on accident.These characteristics leads to act with very short reaction time and fast inflation but only if the motorcycle is involved in the accident . Limitation of this system is that they work properly only under particular conditions , especially the rider must remain on the motorcycle during the accident and the impact dynamics must lead him to hit exactly +the part of his vehicle protected by airbags.

    + +

    Normally, following kinds of bodily harms occur in the accident

    + +

    -Hand/leg Cracks or fractures

    + +

    -Head injury

    + +

    -Bleeding from body parts

    + +

    -Getting thrown from bike

    + +

    Image4

    + +

    The passenger can be protected from the above mentioned bodily harms as described as, the air bag system opens from the bottom to the left or right side of bike; hence we can avoid hand/leg cracks or fractures. The diameter of the air bag when opened is more than height of the bike and that of the rider, hence head injury is avoided. As the material used in the air bag construction is light weight strong leather the chances of bike skidding or slipping is diminished and external injuries like scratches are avoided. The chances of the rider being thrown from the bike are avoided as the leather belts are provided on both sides of the bike to secure the legs of the rider. The material used for manufacturing these belts is similar to those used for manufacturing seat belts of cars.

    + +

    Conclusion

    + +

    By providing total safety to the motorcycle rider by implanting the airbags on both sides of the motorcycle as mention in this article, we will reduce the fatality rate by 20% to 30%. By using this technology there is not only a reduce in death rate but also gives the total protection to the rider as well as motorcycle.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-beginning-of-the-end-have-the-machines-won/index.html b/blog/the-beginning-of-the-end-have-the-machines-won/index.html new file mode 100644 index 0000000..0f1d1a2 --- /dev/null +++ b/blog/the-beginning-of-the-end-have-the-machines-won/index.html @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Wondering when artificially intelligent robots will take over the Earth? Wonder no more — they’ve already done it! You’re probably thinking

    + +
    +

    But wait. Wouldn’t I have noticed if chrome-plated autonomous killing machines began to exterminate humans? +Not necessarily.

    +
    + +

    It turns out evil robots in cyber-space are nowhere near as flashy as their science-fiction counterparts. We envisioned Cylons, Terminators, and Cyborgs but failed to imagine the much more immediate threat of helpful neural-network learning algorithms. I’m talking about Alexa, Echo, Siri, Google Home, the Internet of Things, even social networking platforms masquerading as news sources. They control content. They learn what we like, what we crave, what we fear. They feed us content designed to keep us coming back for more. We are already dependent on them to an extent nobody watching Arnold Schwarzenegger gun down Terminators could have predicted. And yet, 20 years later Arnold was Governor of California, and a dozen years after that, Trump became President of the Free World.

    + +

    Alpha Go Dominance

    + +

    Let’s look at a recent advancement. The computer that stunned humanity by beating the best mortal players at a strategy board game requiring intuition has become even smarter.Even more startling, the updated version of AlphaGo is entirely self-taught—a major step towards the rise of machines that achieve superhuman abilities > with no human input.Dubbed AlphaGo Zero, the Artificial Intelligence (AI) system learnt by itself, within days, to master the ancient Chinese board game known as “Go”—said to be the most complex two-person challenge ever invented. +It came up with its own, novel moves to eclipse all the Go acumen humans have acquired over thousands of years. +After just three days of self-training it was put to the ultimate test against AlphaGo, its forerunner which previously dethroned the top human champs.AlphaGo Zero won by 100 games to zero.

    + +

    AlphaGo Zero not only rediscovered the common patterns and openings that humans tend to play… it ultimately discarded them in preference for its own variants which humans don’t even know about or play at the moment, said AlphaGo lead researcher David Silver. The 3,000-year-old Chinese game played with black and white stones on a board has more move configurations possible than there are atoms in the Universe. AlphaGo made world headlines with its shock 4-1 victory in March 2016 over 18-time Go champion Lee Se-Dol, one of the game’s all-time masters. Lee’s defeat showed that AI was progressing faster than widely thought, said experts at the time who called for rules to make sure powerful AI always remains completely under human control.

    + +

    There are dangers which come with the creation of such powerful and omniscient technology, just as there are dangers with anything that is powerful. This does not mean we should assume the worst and make potentially detrimental decisions now based on that fear. Experts expressed similar concerns about quantum computers, and about lasers and nuclear weapons—applications for that technology can be both harmful and helpful.Unlike its predecessors, AlphaGo Zero is no longer constrained by the limits of human knowledge. It might become creepily autonomous in the near future.

    + +

    That sequence of events didn’t take particle-beam weapons or militarized robots. It only required control of social media channels. Content-selecting algorithms combined with human intellectual laziness did the rest. Anybody with a commercial or political interest can and does leverage our smart content-delivery infrastructure for whatever axe they have to grind. Who can blame the Russians for piling on?

    + +

    Conclusion

    + +

    We want reduced choices, we want simplistic analysis, we want machines to think for us. Even though it presents an existential threat to our species, we like Facebook. We think it’s news. We love the idea that tomorrow we could kick out all the foreigners and former coal miners could earn $50 an hour bolting tail fins onto Chevys once again. Our content-selecting robots happily reinforce that viewpoint.

    + +
    +

    The machines are here, and they have won.

    +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-brain-behind-a-formula-one-car/index.html b/blog/the-brain-behind-a-formula-one-car/index.html new file mode 100644 index 0000000..28aefd0 --- /dev/null +++ b/blog/the-brain-behind-a-formula-one-car/index.html @@ -0,0 +1,511 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    The track belongs to the driver, the pits belong to the engineers

    +
    + +

    Formula One cars are mean machines. They have been fine tuned for one purpose- Speed. In fact, they are the most efficient mode of transport after space shuttles.

    + +

    Be it aerodynamic performance, super-efficient engines or state of the art tyre management strategies, engineers have scaled new heights in their pursuit for speed.

    + +

    The ECU:

    +

    However, one aspect of the car that goes largely unnoticed is the electrical system. If the chassis and the engine form the arms and legs, the Electronic Control Unit, or the ECU forms the brain.

    + +

    In the last ten years, these components have covered the equivalent of a trip to the moon and back and haven’t missed a single beat.

    + +

    The ECU basically controls the engine, the clutch, the differential, the Drag Reduction and Energy Recovery systems.The ECU aslo controls the ignition, the LED panel on the steering and fuel injection.

    + +

    Around 120 sensors all over the car send information to the ECU, a quarter of which are from the engine and the gear box alone.

    + +

    From accelerometers to gyroscopes, thermocouples to pressure sensors, the ECU relays an enormous amount of data in real time to the pits for diagnostics and analysis.

    + +

    Specs:

    + +

    The unit used in modern F1 cars- the McLaren TAG-320 is a powerful processing platform with a real time operating system based on 32-bit microprocessors. Application code is autocoded from MATLAB/SIMULINK control modules.

    + +

    With a mammoth processing power of 4000 MIPS (million instructions per second) to 8GB flash memory, this device boasts of powerful data logging and telemetry capabilities.

    + +

    On the communications side, it comes with a wired gigabit ethernet interface and has a data relay speed of up to 10Mbps.

    + +

    The ECU has been designed to handle all sorts of weather conditions a driver may encounter on track and has a significant resistance to mechanical impact.

    + +

    The units weigh in at 1.35 kilograms and are either attached below the radiator or behind the steering. The components are tamper proof. In fact, other than the tyres, it is the only component to be exactly the same on all cars. Ultimately, the ECU forms an integral part of every modern Formula One car. It helps provide a whole new dimension to racing. Crunching the data received has enabled teams and drivers to analyze and optimize performance to entirely new levels.

    + +

    The TAG-320 +The McLaren TAG-320 up close

    + +

    The next time someone says Formula One is all about the mech guys, tell them to think again!

    + +

    If you want to see more, check out the McLaren Website

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-class-of-np/index.html b/blog/the-class-of-np/index.html new file mode 100644 index 0000000..e69dfc1 --- /dev/null +++ b/blog/the-class-of-np/index.html @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Many of us have this notion that NP stands for “Non Polynomial”, the problems which can’t be solved in polynomial time. This is not true. First of all, NP consist of only decision problem (given any problem, the answer should be yes or no) solvable in polynomial time by a theoretical non-deterministic Turing machine. Well, I am not going to cover non-deterministic Turing machine in this blog, so I will give another verifier based definition.

    + +

    Verifier Based Definition:

    +

    Consider a decision problem X. Let I be an instance of X for which the answer is “yes”. Now if we can indeed verify in polynomial time that the answer to I is “yes”, then we have a verifier for I. If there is a verifier for all such instances of X, then X is said to be in NP. Consider an example:

    + +

    Subset sum problem: Given a set of natural numbers, is it possible to find a subset such that sum of all numbers in that subset is zero. Now for any instance I, I can simply add up all the numbers of the subset to verify if the sum is zero. So, I have a polynomial time Verifier. Therefore, the problem belong to NP.

    + +

    Now, the next thing is whether we can find in polynomial time, the answer to that problem. Wait! Here by polynomial time, we mean polynomial in terms of input size. If my input is just a number, polynomial time implies polynomial in the number of bits required to store that number. So, the polynomial time in case of finding whether a number is prime or not will be log(n) (The binary representation will require log(n) bits).

    + +

    If we can find the answer in polynomial time, the problem is in the class of ‘P’. So yeah, P is a subset of NP. Now, if you ask me whether it’s a proper subset or not, then you are asking me a million dollar question. Whether P = NP is one of the most famous question in Computer Science and nobody has been able to attack it.(You can try your hand!)

    + +

    NP Hard

    +

    So, if it’s not a proper subset than what other problems does NP consist of? Well let me introduce one more class of problems - NP Hard.

    + +

    The problems in NP hard are the set of problems which are “atleast” as hard as any other problem in NP. So, if you can find a polynomial time algorithm for a problem which is NP hard, then you can find a polynomial time solution for all the problems in NP. So, we can reduce any problem in NP to any problem in NP hard. This reduction will be done in polynomial time. But wait, although the class of problems is called “NP” hard, all the problems in NP hard need not belong to the class NP. Why? All NP hard problems are not decision problems. Now you will think that some NP hard problems must belong to NP and such problems are called NP complete(NPC) problems. So, NP complete is intersection of NP and NP hard as shown in the figure below.

    + +

    Euler diagram for P, NP, NP-complete, and NP-hard set of problems

    + +

    The above diagram is taken from wikipedia. It is widely believed that P != NP, but no proofs yet.

    + +

    Resources:

    +

    NP
    +List of NP Problems

    + +

    You can follow the book ‘Algorithms’ by U.V. vazirani and ‘Introduction to Algorithms’ by Tardos for getting a better understanding.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-elliptic-curve-cryptography/index.html b/blog/the-elliptic-curve-cryptography/index.html new file mode 100644 index 0000000..f981ef8 --- /dev/null +++ b/blog/the-elliptic-curve-cryptography/index.html @@ -0,0 +1,566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Elliptic Curve Cryptography (ECC) is one of today’s most powerful but least understood public-key encryption methods which is found upon the mathematical concept of elliptic curves. Compared to other algorithms serving the same purpose, ECC allows for smaller, faster and more efficient keys while providing the same amount of security. Elliptic curves cryptosystems are applicable for encryption, digital signatures, pseudo-random generators and other tasks.

    + +

    Public-Key Cryptography

    + +

    The previous paragraph mentions public-key cryptography. This concept (also known as asymmetric key encryption scheme) is a required foundation to understand the ECC concept.

    + +

    Modern Cryptography is based on the idea that rather than having a single key performing both encryption and decryption, a pair of keys can be used; one is the public key known to all and the other is the private key, which is kept secret. The keys are designed and generated in a way that they act complementary to one another. Using this system, the sender can encrypt their message using the receiver’s public key, and only the receiver who has the respective private key can decrypt the messages. This efficient design was a great step in resolving the issue of compromise of a single shared key, while also enabling authentication of the encrypted messages by the public-key owner.

    + +

    Asymmetric Key Encryption Scheme

    + +

    The key-pairs are generated while taking into consideration “Trapdoor Functions”, which are functions that are easy to compute in one direction, but has a special piece of information or secret (called “trapdoor”) which is required in order to compute the inverse (or reverse the computation). For example, the fundamental concept of the very widely used RSA algorithm is that while it is easy to multiply two prime numbers, it is difficult to perform prime factorization on this product to obtain the component primes. The greater the difference of ease between computing the Trapdoor Function & the difficulty of reversing Trapdoor functions, the more computational effort will be required to derive the private key from the public key and thus, the more secure the cryptographic system.

    + +

    Why ECC?

    + +

    Algorithms such as RSA and Diffie-Hellman are not very sustainable in the long term. This is because factoring is not the hardest problem out there. Specialized algorithms, which were devised to solely tackle the problem of prime factorization while being faster and less computationally intensive than the naive approach, get more efficient as the size of the number being factored gets larger. Thus, as the numbers get larger, the difference between computing the product of primes & the difficulty of reversing this multiplication to find the component primes decreases.Thus, this calls for utilizing a better cryptosystem having a better trapdoor function.

    + +

    Another issue is the increasing availability of resources to decrypt numbers result in the need to increase the size of the keys. This is not suitable in the case of mobile phones or low-powered devices that have a limited amount of computational power. All this pushes us in the direction of adopting a public-key system which has a better Trapdoor. Cue ECC.

    + +

    Elliptic Curve Cryptography is one that is based on the algebraic structure of elliptic curves over finite fields. ECC is used for the same reasons as RSA, with the former having the advantages of providing equivalent security with 256-bit keys as a 3072-bit key of the latter (Latter key is 12 times greater in size!). Thus, ECC takes up only around 10% of the storage space and bandwidth as compared to RSA and thus is a perfect fit for resource-constrained systems such as mobile phones, low-powered devices and cryptocurrency networks.

    + +

    The better Trapdoor Function

    + +

    An elliptic curve is a planar algebraic curve defined by an equation of the form:

    + +

    \({y^2} = {x^3 + Ax + B}\)        where \({4A^3 + 27B^2 \ne 0}\)

    + +

    It is a plane curve over a finite field (a field that contains a finite number of elements) which consists of the points satisfying the above equation along with a distinguished point at infinity. +A field is a set of elements F on which two operators (addition and multiplication) are defined and satisfy basic rules (such as the operators following the distributive law). The real numbers along with the addition and multiplication operators form a field with an infinite set of elements, and on defining a field where the set of elements F is finite it is called a finite field. An example of such a finite field is the field formed by elements composed of integers mod p when p is a prime number.

    + +

    An Elliptic Curve

    + +

    Elliptic curves have horizontal symmetry, and thus any point on the curve can be reflected over the x axis and the curve remains the same. Another interesting property is that any non-vertical line (different x coordinates) will intersect the curve in at most three places. When two different points on the curve have the same x coordinate and we draw a vertical line through them, we define the point at infinity to be the third point at which the line “intersects the curve”. We can imagine this point as lying infinitely far up the y axis, and all vertical lines intersect that point. The point at infinity has no coordinates, and its purpose is to deal with vertical lines.

    + +

    The trapdoor function is similar to a mathematical game of pool. Elliptic curves are free of cusps or self-intersections and thus are completely smooth (non-singular). A curve is said to be non-singular if all of it’s points are non singular. Non-singular point is one at which there is a well defined and unique tangent line, and thus a curve composed of completely this is called a non-singular curve. Now as a line between 2 points always intersects at a third point, this allows for quick hops around the curve which is computationally easy, and finally results in an endpoint that seemingly has no relation to the starting point, i.e, it is difficult to reverse the process of arriving at that point.

    + +

    Dotting

    + +

    Taking this example, let A be our origin point. If we take points A and B and draw the line passing through these two points, it will intersect the curve at the third point say -C. Now, by reflecting this point across the x-axis on the curve, we get the point C. Now, taking the line passing through the origin point A and C and repeat the process, say ‘n’ times.

    + +

    This move on 2 points is called the “dot” function. In relation to the above example,

    + +
    +

    A dot A = A

    + +

    A dot B = C

    + +

    A dot C = D

    +
    + +

    To ensure that the dot function produces a line that hits the curve close to the origin and does not go way off out to some extreme without intersecting at a third point, we can define a maximum ‘X’ value where the line will wrap back around and start from the beginning again.

    + +

    This is a great trapdoor function because as long as you know the origin point (A) and the number of hops done, it is easy to find the ending point (in our case, D). On the other hand, on only knowing the coordinates of the origin point and ending point, it is nearly impossible to find how many hops it took to get there.

    + +

    This is the concept used in ECC. An ECC system can be designed by selecting a curve equation, a prime number as a maximum, and a public point on the curve (the origin point or A). A private key is a number pkey (in our case, n). The public key is the public point dotted with itself pkey times. Elliptic curve discrete logarithm function refers to the computation of the private key from the public key in an ECC system.

    + +

    Let us take the example of Alice and Bob communicating. Initially, they agree on using the same curve and a few other parameters. Then, they pick a random point G on the curve. Both Alice and Bob choose secret numbers a and b respectively. Alice dots the point G by itself a times, while Bob does the same b times. Both arrive at new points A=aG & B=bG, and now they exchange the points. Now both of them dot A and B with b and a respectively. In this manner, they both have generated the same shared secret key S=abG, and now can securely communicate with the keys generated.

    + +

    Conclusion

    + +

    Despite 30 years of intensive research, there has been no better algorithm found to solve the EC discrete logarithm problem than the current naive approach, and thus the difference between computing the Trapdoor function and reversing it is great. As it is more computationally intensive, it is a stronger system as compared to the other current ones.

    + +

    While RSA can probably still continue to be secure by increasing the key length, the trade-off is speed, as well as space. With ECC, using smaller keys that are generated quicker than RSA, the same security can be achieved which is especially a bonus on mobile phones and other less powerful devices.

    + +

    Indeed, it is the next generation of public key systems over first generation current systems like RSA based on prime factorization cryptography. Taking into consideration the extent of today’s known mathematics, it provides a 10-fold increase in security and acts as the basis of much of the public key cryptography in today’s cryptocurrency world.

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-fourth-industrial-revolution/index.html b/blog/the-fourth-industrial-revolution/index.html new file mode 100644 index 0000000..5da608f --- /dev/null +++ b/blog/the-fourth-industrial-revolution/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Automation, Internet of Things, Genetic engineering, cloud computing, renewable energy, sustainable development. Welcome to the Future. Welcome to the 4th Industrial revolution.

    + +

    image1

    + +

    Professor Klaus Schwab, Founder and Executive Chairman of the World Economic Forum published the ‘The Fourth Industrial Revolution’. Through this he explained its impact on economies, countries, politics and even ideologies. The fourth industrial revolution focuses on making our industries more productive with automation cloud computing and IoT, shying away from fossil fuels and making super-soldiers (through genetic engineering!). That last one is questionable though…

    + +

    Genetic engineering will help us in not only rectifying defective genes, but also opens up a possibility to make the new generation more Charles-Darwin-‘fit’. With the onset of technologies like CRISPR, it is exciting and apprehensive of what could happen in the future.

    + +

    image2

    + +

    Automation, IoT and cloud computing collectively will help in making every aspect of our lives more comfortable*. From household to industries, robots will replace human labour and intervention and give us freedom from the concept of work and let us choose our real passions. Elon Musk rightly said that automation will force governments to give a universal basic income.

    + +

    Finally we come to sustainable development. In the future, there will be a stronger force towards renewable energy and undo the effects of climate change and mass extinctions, making this planet a better place (although the fourth industrial also focuses on cheaper space exploration technologies and colonization, so we are good either way!!).

    + +

    There is a lot of heated debate about the effects of the fourth industrial revolution. This means that there is going to be some serious strategic changes for economists, politicians and top businessmen

    + +

    image3

    + +

    Leave it to them for the decision making. But no matter what, the fourth industrial revolution is happening and it’s happening fast! Your opinion is not going to stop it. So what does the fourth industrial revolution mean for engineers and scientists? +It’s simple, it means that we have a lot of work to do!

    + +

    We are in a race very much like the space-race between Russia and USA had. We need to come up with innovative and profound technologies as soon as possible. We need to make it affordable, accessible and original. Like every other industrial revolution, this will be a game changer for the world.

    + +

    So in two words… Carpe Diem!

    + +

    THE FOURTH INDUSTRIAL REVOULTION

    +

    Coming soon…

    + +

    *unless the robots take over and a scene from the Terminator becomes a reality

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-halting-problem/index.html b/blog/the-halting-problem/index.html new file mode 100644 index 0000000..8c6757b --- /dev/null +++ b/blog/the-halting-problem/index.html @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    If you have written computer codes, then you certainly would have fallen into the trap of infinite loops. Then you might have wondered if there is an algorithm to check if any given computer program runs into an infinite loop or not; in other words, to check if it halts or not. How wonderful it would be if such an algorithm exists! But alas, the truth is that there is no such algorithm, not because no one has found such an algorithm yet, but because there is no way of finding such an algorithm ever.

    + +

    The halting problem is the problem of determining, from a description of an arbitrary computer program and an input, whether the program will finish running or continue to run forever. Now let me define two terms- decidable and undecidable. A problem is decidable if it has a solution. If there is no algorithm that solves the problem in a finite amount of time, the problem is undecidable.

    + +

    Halting-problem

    + +

    A Little History

    + +

    Are all problems decidable? Given enough thought, can we always come up with a well-defined procedure that takes some input and answers a given question about it? At the start of the 20th century, the belief was that this was true. Mathematicians (there were no computer scientists back then!) believed that we would eventually discover tools that we could use to answer any question we wanted (provided we could express it in the language of logic).

    + +

    In 1931, Kurt Gödel shocked them all by proving that this was impossible. Using some very clever techniques, he showed that as soon as we devise a system that’s sufficiently powerful and well-behaved to encompass mathematical reasoning, that system will necessarily contain a statement that we could never prove is true, even though it is true.

    + +

    A few years later, Alan Turing proved an analogous theorem in Computer science. He showed that there must exist undecidable problems, questions for which there is no definable solution. His proof relied on some of the same clever techniques used by Gödel. The halting problem is one such undecidable problem

    + +

    Turing

    + +

    Turing’s Argument

    + +

    Lets say I came up with an algorithm to solve the halting problem. Then I can write a computer program for this. For simplicity, wrap this program inside a black box. Let’s call this black box - “Does it halt?”. “Does it halt?” takes a program as input and outputs “yes” if the input program halts and outputs “no” if the input program does not halt.

    + +

    Does it halt

    + +

    Now let me create another program that uses “Does it halt?” as a subprogram. If the output of “Does it halt?” subprogram is “yes”, then it loops forever (like a while(1){}; in C language). If the output of “Does it halt?” subprogram is a “no”, then it halts and outputs ”halted”. Lets call this new program “Paradox”.

    + +

    Paradox

    + +

    Now here is the paradox. What happens when I input “Paradox” program to itself. Clearly one of the two things can happen: either it runs forever or it stops and outputs “halted” depending on whether the program “Does it halt?” outputs “yes” or “no”.

    + +
      +
    • +

      If “Paradox” goes into an infinite loop, it is because “Does it halt?” outputs “yes”. Since “Does it halt?” outputs “yes”, we conclude that “Paradox” halts. But this is a contradiction to the assumption that “Paradox” goes into an infinite loop.

      +
    • +
    • +

      If “Paradox” halts and outputs “halted”, it is because “Does it halt?” outputs “no”. Since “Does it halt?” outputs “no”, we conclude that “Paradox” does not halt. But this is a contradiction to the assumption that “Paradox” halts.

      +
    • +
    + +

    We have therefore led ourselves to a contradiction that “Paradox” halts if and only if it runs forever. Since this is impossible, one of our assumptions must be invalid. By tracing our reasoning backwards, we find that it is therefore impossible to have written “Does it halt?” in the first place. In other words, the halting problem is undecidable.

    + +

    Equivalent problems in real life

    + +

    A lot of really practical problems are the halting problem in disguise. A solution to them solves the halting problem.

    + +
      +
    1. You want a compiler that finds the fastest possible machine code for a given program? Actually the halting problem.
    2. +
    3. You have JavaScript, with some variables at a high security levels, and some at a low security level. You want to make sure that an attacker can’t get at the high security information. This is also just the halting problem.
    4. +
    5. You have a parser for your programming language. You change it, but you want to make sure it still parses all the programs it used to. Actually the halting problem.
    6. +
    7. You have an anti-virus program, and you want to see if it ever executes a malicious instruction. Actually just the halting problem.
    8. +
    + + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-honeycomb-conjecture/index.html b/blog/the-honeycomb-conjecture/index.html new file mode 100644 index 0000000..95346f3 --- /dev/null +++ b/blog/the-honeycomb-conjecture/index.html @@ -0,0 +1,494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Why do bees build hexagonal structured hives? Why not any other shape? Let us deliberate these questions which troubled many thinkers.

    + +

    img1

    + +

    Consider prisms of different regular polygons and assume them to have same height and volume. This means that the one with the least perimeter will require the least material to build. We know that as we increase number of sides in the polygon, perimeter decreases. So, cylinder will use the least amount of material (circle can be considered as a polygon with infinite sides).

    + +

    But cylinders are economical only if they stand alone. If placed together, they leave large gaps between them. Since no walls can be shared, they are wasteful of both space and material and the amount of material required to construct an array of cylinders doesn’t change. However this is not the case in other polygons.

    +
    +

    For ex. In an array of octagons 25% of material is saved (See diagram – to construct new octagon, 2 sides are already provided by the 3 octagons).

    +
    + +

    img2

    + +

    By calculating similarly for all shapes, we see that Hexagons save the most material or in other words, a regular hexagonal grid or honeycomb is the best way to divide a surface into regions of equal area with the least total perimeter. This is the Honeycomb Conjecture.

    + +

    Collecting wax for construction of honeycomb requires lot of bee time and energy. So, economy in the use of wax is very important to the welfare of the bees. Hence, they use hexagonal packing in hives.

    + +

    But this is not the only reason. Hexagon cells are also the best for mechanical stability. If we load a square cell, a load along a partition is not readily transferred to adjacent partitions. In a triangular cell, load is distributed but here the horizontal edges will be in compression (others in tension). This is a wrong way to load a thin plate since it buckles (see diagram). But, if we load a hexagon cell, load is transferred to several members and the load is transferred as tension. This makes maximum use of the thin wax walls.

    + +

    img3

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-ligo-experiment/index.html b/blog/the-ligo-experiment/index.html new file mode 100644 index 0000000..4837d98 --- /dev/null +++ b/blog/the-ligo-experiment/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    The LIGO (Laser Interferometer Gravitational-Wave Observatory) Experiment – A completely different perspective of studying the universe.

    + +

    Einstein’s Prediction

    + +

    Einstein’s Prediction

    + +

    Over a century ago, Albert Einstein proposed the idea of something called a Gravitational Wave which was a part of his General Theory of Relativity. The concept of Gravitational waves suggests that, the force of gravity is not an actual force but rather, a distortion in the fabric of spacetime. This was just an idea, as there was no experimental evidence to support Einstein’s claim.

    + +

    What is a gravitational wave?

    + +

    A gravitational wave is much like an ordinary ripple caused by any distortion in a medium. The only difference here is that the ripple is in the medium(fabric) of spacetime. A gravitational wave originates from an accelerating mass in spacetime. Some phenomena that could trigger a gravitational wave are two black holes rotating in a dead spiral, collision of neutron stars, or even a ball dropping off your hand. The gravitational waves compress space in one direction and expand it in the orthogonal direction.

    + +

    Conceiving the idea for an experimental setup for detecting gravitational waves

    + +

    During the early 1970s an ambitious professor at the MIT named Rainer Weiss first proposed the idea of an experimental setup to detect gravitational waves. His idea was funded by the US national science foundation, and the very first version of the LIGO was setup in 1983. This very primitive version of the LIGO which had arms of length 1km failed to produce any concrete evidence of gravitational waves. It was not until 2014 that the advanced LIGO was made fully operational. Rainer Weiss recently won the Nobel prize for Physics in 2017.

    + +

    Rainer Weiss

    + +

    When were the first gravitational waves detected?

    + +

    On the 14th of September, Rainer Weiss noticed something peculiar on the usual activity log of the LIGO. He instantly contacted the field engineers who were present at the observatory and Weiss was completely dumbfounded. Gravitational waves from the merger of two black holes, each of nearly 30 solar masses, 1.5 billion light years away were detected for a fraction of a second.

    + +

    So, how does the LIGO exactly detect these “Gravitational waves”?

    + +

    The LIGO basically comprises of two 4km arms placed perpendicular to each other. The current LIGO setups are in two remote locations in the United States, one in the Washington state and the other three thousand kilometres away in Louisiana. A very coherent light from an extremely sensitive laser is produced which passes through a beam splitter, which splits the light into two perpendicular components. These two perpendicular components pass through the 4km arms of the LIGO which are highly depressurised (almost vacuum). We know that the ultimate law of physics states that the speed of light is unaltered irrespective of the expansion or compression of the space. The LIGO makes use of this ultimate law to detect and classify gravitational waves. Now, when the light is reflected from the mirrors placed at the extreme ends of the arms comes back to the beam splitter and then falls onto a sensor, there are two possible scenarios:

    + +
      +
    1. +

      The two light beams being 180 degrees out of phase will cancel out each other and nothing will be detected by the sensor – this will happen when the two light beams traverse the exact same path.

      +
    2. +
    3. +

      The two light beams have a phase difference other than 180 degrees. In this case the two beams will not exactly cancel out each other hence leaving a difference in the amplitudes. This small difference in the amplitudes is detected by the sensor, giving information about the gravitational wave that struck the LIGO apparatus.

      +
    4. +
    + +

    Image3

    + +

    The principle doesn’t look that complicated, then why did it take so many years to get it operational?

    + +

    The most important aspect of this observatory is the sensitivity of the measuring instruments that are used in the setup. The gravitational waves come from hundreds of millions of light years away and hence their intensity is very weak. The LIGO measures lengths of the order 10-21 of a meter. This length is roughly the size of one thousandths of the diameter of a typical atomic nucleus. To get such sensitive measurements the LIGO uses the purest of laser light and mirrors of the highest quality. The mirrors weigh about ninety kilos each and are highly polished. The reason that the LIGO is placed in such isolated locations is to prevent any stray noise from interfering with the data. The LIGO also uses technology such as internal seismic isolation to prevent any stray noise from corrupting the results obtained. The two LIGO setups are placed so far off from each other so that the common portion of the response of the sensors can be filtered out thus eliminating the chance of any common noise. This makes the LIGO truly an engineering marvel.

    + +

    Image4

    + +

    What role did India play in the LIGO experiment?

    + +

    The IUCAA (Inter University Centre for Astronomy and Astrophysics) at Pune played an important role in the research and development of the experiment. About 40 scientists from India participated in the experiment. India has taken a further step ahead and has decided on building a LIGO apparatus at a project cost of 1000 Cr.

    + +

    How does the gravitational wave picture change our understanding of the cosmos?

    + +

    Primarily, it confirms the predictions of Einstein’s General Theory of Relativity that the universe is a fabric of spacetime and gravity is nothing but a distortion in space time. It also opens a whole new gateway to studying the universe. Gravitational waves can help us to understand the universe beyond the apparent. It could help us understand phenomena that isn’t apparent through a telescope, like what happens at the core of two stars during their collision.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-missing-circuit-element/index.html b/blog/the-missing-circuit-element/index.html new file mode 100644 index 0000000..a4ba62c --- /dev/null +++ b/blog/the-missing-circuit-element/index.html @@ -0,0 +1,545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Leon Chau, an American circuit theorist at the University of California, predicted the existence of the fourth fundamental circuit passive element. The first three passive circuit elements are the resistor, capacitor, and inductor. We already have relationships among voltage, current, charge, and flux. The only relationship missing is that between flux and charge(q).

    + +

    Image 1

    + +

    Memristor is the component that connects the dots. The diagram shows how memristor serves as a missing link and completes the symmetry of the diagram due to which it is famously known as “The Missing Circuit element”. Its symbol is.

    + +

    Image 2

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DeviceCharacteristic property (units)Differential equation
    Resistor (R)Resistance (V / A, or ohm, Ω)R = dV / dI
    Capacitor (C)Capacitance (C / V, or farad)C = dq / dV
    Inductor (L)Inductance (Wb / A, or henry)L = dΦm / dI
    Memristor (M)Memristance (Wb / C, or ohm)M = dΦm / dq
    + +

    Memristor is a nonlinear, passive electrical two terminal component which relates magnetic flux linkage and charge. According to the characterizing mathematical equations, the memristor’s resistance is not constant but depends on how much electric charge has flowed in what direction through it in the past; the device remembers its history. A memristor is often compared to an imaginary pipe that carries water. When the water flows in one direction, the pipe’s diameter expands and allows the water to flow faster – but when the water flows in the opposite direction, the pipe’s diameter contracts and slows down the water flow. If the water is turned off, the pipe retains its diameter until the water is turned back on. To continue the analogy, when a memristor’s power supply is switched off, the memristor retains its resistance value. This would mean that if power to a computer is switched off, all the applications and documents that were open before the shut down would still be right there on the screen when the computer is restarted. When the electric power supply is switched off, it remembers the most recent resistance until powered again. The new two-terminal passive element is named memristor as it combines the behavior of memory and a resistor.

    + +

    Image 3

    + +

    The image shows the schematic diagram of a memristor. On application of a positive bias across the electrodes the oxygen vacancies spread towards the undoped region which leads to an increase in conductivity. Now if we remove the bias, the device remains in this state forever theoretically. Similarly, application of a negative bias across the device pulls back the oxygen vacancies into the doped region thereby increasing the resistance of the device. So data is stored in memristor regarding resistance. A high resistance corresponds to one logic level, and low resistance corresponds to the other. In place of TiO2 other compounds such as HfO2 can be used.

    + +

    Classification of Memristors

    + +

    Memristors can be classified into different types, depending on how they are built. Memristors are classified into two types, and a brief overview of different memristors is explained below.

    + +

    Image 4

    + +
      +
    1. Ionic thin film and Molecular Memristors
    2. +
    + +

    Molecule and Ionic thin-film memristors mostly rely on different material properties of the thin film atomic lattices that display hysteresis below the application of charge.

    + +
      +
    1. Magnetic and spin-based memristors
    2. +
    + +

    Spin-based memristors are opposite to ionic nanostructure and molecule-based systems and rely on the property of degree in electronic spin. In this type of system, the polarization of electronic spin is aware

    + +

    Applications

    + +

    These promising characteristics may potentially revolutionize nanoelectronics. It can find applications in analog and digital circuits, which are part of everyday use systems such as sensors and mobile phones. Some of the most promising applications of memristors are:

    + +

    The most observable application of a memristor is the memory. A memristor can store a single bit of data in DRAM – where the capacitors are restored with memristors. When compared to DRAM and SRAM, this kind of memory has many benefits like – it is non-volatile; it displays good scalability, and it has no leakage power. This type of memory is superior to flash memory regarding scalability and speed.

    + +

    Memristors perform equally well like the biological synapses. This feature makes good building blocks in neuromorphic systems, where synapses and neurons are formed as electronic systems. This kind of memory has many benefits when we compare it with the DRAM and SRAM.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-new-biometric-brainprint/index.html b/blog/the-new-biometric-brainprint/index.html new file mode 100644 index 0000000..cb18328 --- /dev/null +++ b/blog/the-new-biometric-brainprint/index.html @@ -0,0 +1,492 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Since the conception of computers, mobile phones, tablets and most importantly, Internet, securing our devices and data has become crucial. Personal data ranging from shopping wishlists to bank details are either stored in PCs or are available online, all protected by passwords - a rather impotent sentinel, as it turns out. There have been several methods used by computers as well as the different websites to authenticate its user.

    + +

    The first passwords were simple and easily stored since sophisticated hacking networks did not exist yet. One such example is, Cryptographer Robert Morris, who created the infamous Morris worm, developed a one-way encryption function for his UNIX operating system, known as “hashing”, which translated a password into a numerical value. The actual password was therefore not stored in the computer system, making the information less readily accessible to hackers. Recently, the two-step authentication has brought in development by adding an extra layer of protection by requiring verification from two different sources. But this too is not foolproof, but a challenge to intrepid hackers. Therefore, a more promising solution can be multi-factor authentication which demands more than one authentication method, one of which can be biometric authentication like fingerprint, facial recognition, etc. But the multi-factor authentication calls for extra efforts from the user.

    + +

    Recently, researchers at Binghamton University have discovered that, with a bit of training, your computer can identify you based on the way your brain reacts to certain words. This could be another type of biometric authentication. This means that instead of a password you could simply listen to a few words and unlock your secret files. The idea is for a person to authenticate their identity with electroencephalogram (EEG) readings. You simply have to sit down with the brain scanner on. The user’s response is measured via an EEG headset. EEG signatures are unique and are more complex than a standard password, making them difficult to hack. For this, it is required to make an algorithm which can be educated about the user’s reaction for particular character. This can be made by giving the user to type a few characters and learning and registering the responses of the user.

    + +

    Researchers at the University of Washington have demonstrated another way to extract private information using an EEG headset. They created games that subliminally flashed up images such as bank logos and noted when a person’s brain waves registered recognition.

    + +
    +

    If someone’s fingerprint is stolen, that person can’t just grow a new finger to replace the compromised fingerprint — the fingerprint for that person is compromised forever. Fingerprints are ‘non-cancellable.’ Brainprints, on the other hand, are potentially cancellable. So, in the unlikely event that attackers were actually able to steal a brainprint from an authorized user, the authorized user could then ‘reset’ their brainprint,

    +
      +
    • said Sarah Laszlo, an assistant professor of psychology and linguistics involved in the project.
    • +
    +
    + +

    Although this method is accurate upto 94% as of now, it still has confounding fallacy like, the effect of drugs(opioids, caffeine and alcohol) on the neural systems, and hence, the brain waves. This manipulation of brain waves due to the external factors comes out as a challenge. John Chuang at the University of California, Berkeley, last year published research into the impact of exercise on EEG authentication and found that accuracy degrades immediately after a workout (though it quickly recovered). He suggests that other factors such as hunger, stress or fatigue could also reduce reliability. To overcome this, if accuracy under different conditions were required, it could be possible to collect multiple brainwave “templates” for a user by separately mapping their EEG signature when drunk, tired and so on. It is possible to tweak the EEG data analysis using machine learning to improve the results for participants who were inebriated, as suggested by another researcher Tommy Chin and Peter Muller, a graduate student.

    + +

    Nevertheless, given that it is difficult to copy another person’s exact thought process, the technology is certainly advantageous. Considering the advancement in the technology, we will likely see uptake of biometric applications based on brainprints soon – especially as part of multi-factor system for enhanced authentication.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/the-revolution-called-ddr/index.html b/blog/the-revolution-called-ddr/index.html new file mode 100644 index 0000000..76ab759 --- /dev/null +++ b/blog/the-revolution-called-ddr/index.html @@ -0,0 +1,539 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    DDR

    + +

    DDR SDRAM

    + +

    img1

    + +

    DDR memory stands for Double Data Rate memory, this is actually called DDR SDRAM but since it has become so widespread we just say DDR. To understand how this works and why is this so important lets go back to simple memory components such as latches. Latches and Flip -Flops store data at either the rising or falling edge of the clock cycle, and this was the case with the initial SDRAM (Synchronous Dynamic Random Access Memory).

    + +

    What makes DDR SDRAM so different is that it does the same functions as SDRAM but at both rising and falling edges of the clock cycle. Doing so effectively doubled the transfer rate (measured in transfers per second). The first generation of DDR memory had transfer rates between 266-400 MT/s (Mega Transfers per Second). All these RAMs have some prefetch buffer associated with them which acts as a cache for the RAM. DDR had a 2bit prefetch buffer, which is double that of SDRAM. We usually see DDR memory as DDR4 in laptops and desktops. This is the 4th generation of DDR memory.

    + +

    DDR2

    + +

    The second-generation DDR2 memory could operate the external bus at twice the speeds of its previous generation while maintaining the same internal clock. It had a prefetch buffer of 4bits.

    + +

    DDR3

    + +

    A major drawback of DDR2 was that it consumed a lot of power than DDR1 causing it to heat up frequently. This was dealt with DDR3, it consumed 40% less power than DDR2 and added 2 extra functions of ASR (Automatic Self-Refresh) and SRT (Self-Refresh Temperature) which allowed for the memory to control its refresh rate according to temperature variations. DDR3 has a prefetch buffer of 8bits.

    + +

    DDR4

    + +

    DDR4 is the current generation of DDR memory and has even lower operating voltages and higher transfer rates. DDR4 has something called Bank Groups, it has 4 bank groups allowing to process 4 data in a clock cycle. DDR4 also offers better signal integrity due to functions such as DBI (Data Bus Inversion), CRC (Cyclic Redundancy Check), and CA parity.

    + +

    Bank groups

    + +

    Previous generational improvements were brought about by increasing but having too high of a pre-fetch is also not ideal. As per the figure below, if the trends were to continue then DDR4 would have had a 16N prefetch. This isn’t ideal so what we do is divide it into 2 8N groups, each such group is considered to be a bank group.

    + +

    img2

    + +

    img3

    + +

    A comparison of all the generations of DDR memory is shown in the table below. We can see that through various generations DDR becomes faster and more power-efficient.

    + +

    img4

    + +

    LPDDR

    + +

    In layman’s terms, LPDDR can be considered as DDR but for mobile devices where power consumption is a major factor. Unlike PCs, mobile devices don’t have the liberty to draw as much power as they need. They are restricted to manage with whatever the battery can provide while also ensuring that they don’t gulp it all at once, instead they have to sip it slowly to maintain good battery life for the device.

    + +

    LPDDR4 is the mobile equivalent of DDR4 memory, with a few key differences. LPDDR4 has dual 16-bit channels resulting in a 32-bit total bus per DIMM (DIMM or Dual In-line Memory module could be just considered as RAM ). In comparison, DDR4 has 64-bit channels per DIMM. At the same time, LPDDR4 has a wider prefetch than DDR4. This means that to consume low power LPDDR4 sacrifices some of the bandwidth, this results in battery life of anywhere between 8-10 hours. However, the real-world battery life depends on how it is implemented and varies from device to device. LPDDR4 is in no way slower than DDR4 and data rates of 3200 MT/s aren’t hard to come by.

    + +

    GDDR

    + +

    GDDR stands for Graphics Double Data Rate and can be seen in VRAMs of graphics cards, with the standards such as GDDR6, GDDR6X, and GDDR5 being pretty common in modern cards. In design, it similar to DDR but has several differences that make GDDR have much better performance.

    + +

    Differences between GDDR and DDR -

    + +
      +
    • GDDR has a wider memory bus as compared to DDR and thus has a higher bandwidth
    • +
    • GDDR can request as well as receive in the same clock cycle unlike DDR
    • +
    • GDDR is much more power-efficient and gives off less heat. This allows for keeping higher performance modules with just a simple cooling solution
    • +
    + +

    The latest standard of GDDR is GDDR6X and is significantly faster than previous generations. Usually, when we send or receive data we do so in two power levels 1 or 0, but GDDR6X uses four power levels which are 00, 01, 10, and 11. This doubles the amount of data present in each cycle. Each 8Gb (1GB) chip of GDDR6X memory has the bandwidth to transfer 84GB/s.

    + +

    Resources

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/thermal-imaging/index.html b/blog/thermal-imaging/index.html new file mode 100644 index 0000000..f3944c9 --- /dev/null +++ b/blog/thermal-imaging/index.html @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Have you ever tried talking to people about Thermal camera .Well, the general response you receive is , “ohh.. , the night vision camera .” +If you also have the same notion , you actually don’t know about this wonderful technology.

    + +

    Although Thermal imaging is used for night vision ,both are not the same, and also ,apart from that thermal imaging has got a much wider area of application, to which people are unaware.

    + +

    This main aim of this article is to demonstrate the various exiting use of thermal imaging .

    + +

    Hope, after reading it you would appreciate thermal imaging more than you do it now. +So,

    + +

    1.jpg

    + +

    But First,

    +

    What is Thermal Camera

    +

    A thermal camera is basically a bunch of infrared sensors that capture or sense the infrared, radiated from an object. The image is based on the difference of thermal radiation emitted from an object w.r.t to it’s surrounding . + #### So do we see Infrared radiation ? + well, actually not.Human eyes are not sensitive to it. The data from the thermal sensors are processed in form of an image and color is assigned based on camera settings. + Here is the general working of thermal camera:

    + +

    2.jpg

    + +

    Are thermal imaging and night vision not the same thing?

    +

    well, technically not. Both, Thermal imaging and Night Vision increases visibility in low lighted areas but the technology used are different. Night vision camera capture both visible spectrum as well as short wave infrared, on the other hand thermal imaging capture just long wave infrared. +Thermal imaging gives a high contrast image and thus identifying living targets is much easier in thermal imagery

    + +

    Here is a nice comparison video between Thermal Imaging and Night Vision +Clearly night vision is much popular in army and forest ranging

    + +

    Can we use thermal camera in daylight

    +

    Yes, of course. Thermal Camera do not capture visible light, hence the picture are almost same in day as it is in night.

    + +

    However , the surrounding is much cooler in night as compared to day , hence the pictures taken in daylight is not as contrast as they are in night and is a bit corrupted by noise +You can compare the performance in this video

    + +

    Hey, but still Thermal Imaging is a night vision technique only , right?” . If you are also pondering over the same question , here are some other cool stuffs for which Thermal Imaging is used for: +Let us start with common use

    +

    Some common use of Thermal Imaging

    +

    Fire Fighting

    +

    Fire fighters use thermal imaging to see through smoke +Wait a sec, But is smoke not warmer than it’s surrounding? +Well may be , but smoke particles are too small to radiate enough infrared. Thermal cameras capture the infrared radiation and not the absolute heat of a body, hence smoke and fog is invisible to Thermal imaging +(PS: Dense fog may interfere with Thermal vision)

    + +

    3.jpg

    + +

    Electronics and Machinery

    +

    Thermal imaging is used to find out which part of a circuit is hot and consuming more power. It ,hence helps in conserving power or preventing hazards

    + +

    4.jpg

    + +

    Medical Field

    +

    Thermal Imaging is popularly used to detect cancerous cells. +HOW? +The answer is that cancerous cells multiply really fast and hence radiate higher heat than other cells which is easily captured by thermal imaging.

    + +

    Bored? Just Wait a sec +These were the general uses of Thermal Imaging. +However, the stuffs that are most astonishing are upcoming

    +

    Thermal Biometry

    +

    Biometric scanning systems were developed with an approach to create an unbeatable security system, however the fingerprint scanner and even the iris scanner could be easily hacked today. +Hence, a more efficient technology is required for highly secure purpose. Well Thermal imaging provide us the way. +Thermal waves are generated due to heat from the body. Thermal image of a human face contains the heat from the superficial blood vessel lying just beneath the face.

    + +

    5.jpg

    + +

    The blood vessel pattern can be easily created by Thermal imaging.The blood vessel pattern of face are unique for each person and can be used for biometric imaging and scanning

    +

    Forgery

    +

    Well, not a good use of this wonderful technology, but yes, thermal imaging may be used to wrongfully access your passwords or pins. +What Really? +Yes, Thermal imaging can easily detect the buttons those were touched. In fact with a good quality camera you can even judge the order in which button are pressed. + So,a little application of brain and your pin is out.

    + +

    6.jpg

    + +

    A Research conducted for the same ,states that there is about 80% chance of getting the pin , if the image was +taken just after the entering the pin and 60% chance of getting the pin even if the image is taken after a minute time interval. +The good thing is thermal imaging fail on metal keyboards(like the ones in the ATM). +But still, the best thing to do is to press some random key after entering your pin.

    +

    The Green building project

    +

    The most innovative use of Thermal Imaging was carried out by Brian Harper, who was a part of the team that created the first thermal camera. +He came up with an idea of carrying out an internal Thermal Survey of buildings. The thermal imaging showed the points in the building from where the energy leakage were the most. +This made the people more likely to take action.

    + +

    7.jpg

    + +

    The survey was a great success as the householders who got the thermal survey reports were about 5 times more likely to take action. +The project also made Thermal Camera cheaper and portable. Earlier ,the least cost of a Thermal Camera was around 10,000 US dollars(about 7,00,000 INR),but now it is available in about 400US dollars(28,000 INR) +Even, now thermal devices are available for mobile phones. You just need to attach them to the camera of your mobile and you are good to go.

    + +

    Conclusion

    +

    Thermal Imagery is quite new technology and hence is expensive. + , but even after that it find its scope everywhere, say industry , home, defense , fun and much more. For sure it has got a lot of scope in the future, the requirement is only of an innovative mind to employ it in right way

    + +

    Some more exciting stuffs in Thermal Imaging

    +

    BBC-Future-The man who makes you see the invisible

    + +

    Thermal World of Chemical Reactions

    + +

    FLIR SC6800 Midwave Research & Science Thermal Imaging Camera

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/through-the-eyes-of-a-computer/index.html b/blog/through-the-eyes-of-a-computer/index.html new file mode 100644 index 0000000..8573981 --- /dev/null +++ b/blog/through-the-eyes-of-a-computer/index.html @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Intro

    + +

    Robot – A word that might remind you of a Rajnikanth starrer or give you the picture of a metallic body going here and there and doing things that humans do quite naturally, on their own. All of us have at least once thought of owning a robot that could do our assignments, or just do things that we are lazy to do. And then, as you enter your college, you take online courses for learning how to build robots that follow lines, identify colours and do all sorts of things that you think it should do. You brag about it in front of your friends and later come to me and say, “Oh well, I have designed a robot that can follow a line!” and I would ask you a simple question. Can your robot see the line? Now, when I ask you this question, I mean to know if the robot can see like humans. A robot isn’t fully automated if you restrict what it should see. You can use sensors to detect lines but that doesn’t mean that the robot has its own vision. Our ability to see and perceive the things around us is perhaps the greatest ability we all have. And when you pass on this ability to a computer or any machine per se, that’s what you called Computer Vision or more generally, Machine vision. Many of you would have already heard a lot about it, it’s the future of artificial intelligence. But truly speaking, this futuristic topic isn’t that new.

    + +

    Have you heard about the Robot Sony Aibo, if not you got to look at this video!

    + + + +

    These robots were conceptualized in the 1990s and made available to the general public in 1999. They went on to become very popular and stayed in the market till 2005. Millions of models were sold world wide! But what made these robots so popular?

    + +

    img2

    + +

    They were one of a kind. They could identify charging stations around the house and charge themselves. They behaved like actual dogs, they would grow and learn based on their owner ,who could teach their dog whatever they wanted using visual cues. They made use of the most efficient CV and ML algorithms of those times. Many of you would have heard of the famous SIFT ( Scale Invariant Feature Transform ) detector. It was patented by David Lowe ( who is currently working as a research scientist at Google) in 1999. This feature detection algorithm was readily used in Aibo making it very autonomous. Eventually, Sony came up with Sony Qrio, which was a human-like robot that was so efficient that it could learn a dance by looking at the choreography! +Have a look at this video!

    + + + +

    It’s not only the robots that steal the show. We all are fascinated by the idea of self-driving cars and would want to own one. There are numerous other examples illustrating how Computer Vision had its aura in the past and has been continuing to amaze us with inventions happening almost every day.

    + +

    With the advancements happening in this field, it’s good to have some genuine idea of what takes you into this field and how you can build upon it.

    + +

    I’m pretty sure, that by now, you are ready to take a dive into the world of Computer Vision!

    + +

    First of all, let me make somethings clear! There are many misconceptions people have about Computer Vision, atleast I was one of them and I always thought it was a perfect blend of Image Processing and Machine Learning. So, I went on to learn Image processing and Machine learning separately and when I arrived at a real CV problem during my internship, I realised that this perfect blend isn’t complete without a few other important ingredients that go into the making. So, I am going to tell you some important topics you need to know before you start with Computer Vision. Of course having the knowledge of Image processing helps us a lot in getting acquainted with some basics of Feature Extraction. But the real world of Computer Vision is full of cameras and geometry.

    + +

    img3

    + +

    Didn’t like Geometry in school? I bet you will start loving it when you are introduced to problems that transform basic geometry into a higher level of application. Loved geometry, you will start loving it more! :P

    + +

    Most of the online tutorials on Computer Vision properly cover the basics of Cameras and Geometry but the major struggle is understanding the algorithms without a proper knowledge of Linear algebra. Reducing huge matrices and finding eigenvectors (oh! Jargons: P) never made so much sense when we were doing them in our 3rd semester. But as they say, everything happens for good :P. You will realise that it is indeed true and it’s worth spending time on basics of linear algebra. It not only helps in the understanding the existing algorithms, but also helps in getting the intuition with which those great scientists came out with those algorithms. And when you know this formula, you are ready to devise algorithms of your own!

    + +

    img4

    + +

    When you start learning the epipolar constraints and camera calibration, it does get intimidating at first. But don’t worry my friend, it’s just a phase :P. It’s just a simple change of coordinates – You project your point in the world frame to the camera frame (using Extrinsics) and then bring it from the camera frame to the image frame(using Intrinsics). Well, it’s not this simple , but trust me, it’s really interesting. And if you want to go further, you can use Machine Learning to unleash the power of your CV algorithms.

    + +

    I will give some references in the end so that you can also embark onto this journey.

    + +

    Talking about applications, I forgot to mention about Virtual Reality (ahh! That’s what we wanted to hear :P). There is an enormous scope of Computer Vison in this field. Imagine clicking pictures of a place you are holidaying at and your friend gets to see the entire place in a 3D view in Real time! Won’t that be cool? Well, of course it will be unless you spent lakhs to actually go to that place :P.

    + +

    That was a lot of introduction I suppose. So, let’s start learning! +Here are some good resources to get started :D

    + + +
      +
    • The book “Multi view Geometry” for those who want to go into the depths of geometry.
    • +
    + +

    These are the resources that should be more than enough to get a little idea on how you do things. To actually do things, you can solve problem sets online or pick up OpenCV documentation and start exploring. By the way, OpenCV is a library that has millions of functions already implemented for you so that you can get yourself involved in what’s yet to be done :)

    + +

    Now that you have read this loooong post, Go explore the fascinating and futuristic world of Computer Vision!

    + +

    Happy CV :)

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/to-infinity-and-beyond/index.html b/blog/to-infinity-and-beyond/index.html new file mode 100644 index 0000000..10dc378 --- /dev/null +++ b/blog/to-infinity-and-beyond/index.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Ever since the dawn of space exploration in 1957, humankind has seen an unprecedented amount of growth in the domain of space exploration. With the innovation of new and advanced space technologies, both the government and private companies are competing to make space travel more accessible and affordable for the future, but let us ask the right questions. What is the future of space exploration?

    + +

    Shoot for the Stars, Reach the Moon

    + +

    For more than 50 years since the first moon mission, we have continued to push the boundaries of knowledge to accomplish feats unlike ever before. With the current plans of NASA to achieve the goal of an initial human landing by 2024 in its Artemis Mission, we are moving forward to setting new records in space exploration every decade.

    + +

    Artemis I or formerly regarded as Exploration Mission-1, will be one of the most significant challenges to NASA’s deep space exploration systems and the first in a series of increasingly complex missions. It will lay the foundation steps for human space exploration and force us to make new technological and scientific advancements.

    + +

    We are not just limited to just reaching the Moon; plans for developing an Artemis Base Camp at the lunar South Pole are also underway. These planned Base camps would include all the future one can imagine - such as a lunar terrain vehicle, a habitable mobility platform, a lunar foundation habitation module, power systems, and many more.

    + +

    The Red Planet

    + +

    After taking notes from the Artemis program, we will begin preparing for the next major feat in space exploration - Mars Colonization. NASA’s Space Launch System rocket and the renowned Orion spacecraft will be the backbone to build the Gateway and set up transportation for astronauts to and from Earth. SpaceX is not far behind the space race either; The Starship program proposed by Elon Must will act as a pioneer for a very cost-friendly and effective solution to space travel. It will provide a fully reusable transportation system designed to carry both crew and cargo to Earth orbit, the Moon, Mars, and beyond.

    + +

    Starship will be the world’s most powerful launch vehicle ever developed, with the ability to carry over 100 metric tonnes to Earth orbit. Adding to its capabilities, Starship will also feature tanker vehicles capable of allowing Starship to refill in low-Earth orbit prior to departing for Mars, enabling the transport of up to 100 tons to Mars.

    + +

    Crossing Horizons

    + +

    The dream of crossing horizons and reaching the stars is closer to reality than ever before. The renowned NASA Voyager 1 has made very important and significant strides in space exploration. The probe has broken through the sun’s magnetic bubble to be the first and only probe to touch the interstellar wind. Voyager 2 is not that far behind either.

    + +

    It goes without a doubt that space exploration will continue to serve as the world’s leading hub for researchers to conduct cutting-edge research and technology development. Moreover, it will also facilitate the growth of other technologies in transportation domains, materials engineering, and many more, leading us to a better and brighter tomorrow. Cheers to science and discovery!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/trying-to-understand-trie/index.html b/blog/trying-to-understand-trie/index.html new file mode 100644 index 0000000..145df84 --- /dev/null +++ b/blog/trying-to-understand-trie/index.html @@ -0,0 +1,583 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    A trie is a rooted tree that maintains a set of strings. Each string in the set is stored as a chain of characters that starts at the root. If two strings have a common prefix, they also have a common chain in the tree. Consider the following set of strings {canal, candy, there, the} and let us make an example trie from these.

    + +

    Example Trie

    + +

    The * character in the node means that a string in the set ends at that node. Such a distinction is needed because a string may be a prefix of another string like “the” is of “there”.

    + +

    The 2 basic operations of a trie is search and insert :

    + +

    Search - We can check if a trie contains a string of length n in O(n) time because we can just follow the corresponding chain starting from the root and suppose a character in that string is not present in the trie then it means that string does not exist.

    + +

    Insert - We can also insert a string of length n in O(n) time by initially following the chain till the longest matching prefix available and then adding nodes as necessary. So in the end the extra nodes that we will have to insert are just the ones not in the longest matching prefix.

    + +

    The size of a trie is equal to the number of distinct prefixes of all the strings in the set. The height of a trie is defined as the length of the longest string in the set.

    + +

    Applications

    + +

    Trie is an incredibly useful data structure for many real life applications which are based on string processing and handling. Some examples are given below:

    + +

    Auto Complete - One could say autocomplete is the most useful application of trie. It is a process through which the software predicts the rest of the word a user is typing based on the string prefix. It helps to optimize search engine results and also improves the user experience. Various software applications such as web browsers, command line interpreters, email, database query tools and others use autocomplete. To improve the quality of the suggested words we can store additional information like a key value and prefer those words with the same prefix that have a history of being used more often, this is similar to browser history.

    + +

    Spell Checkers - Trie is used to store the data dictionary and can check for the word in the dictionary and if it is not present then generate potential valid suggestions of words that can be constructed instead. Then sort these suggestions with the higher priority ones on top and present it to the user.

    + +

    DNA Sequencing - It is used to store and process large DNA sequences and search for matching patterns present in it. Since this process requires significant computation and memory a trie is quite an efficient data structure for this.

    + +

    PseudoCode

    + +

    Trie Node Structure

    + +
    struct TrieNode
    +{
    +    struct TrieNode *children[26];
    +    bool is_end;
    +    TrieNode()
    +    {
    +        is_end = false;
    +        for(int i=0; i<26; i++)
    +        children[i] = NULL;
    +    }
    +};
    +
    +struct TrieNode *root;
    +
    + +

    Insert Operation

    + +
    void insert(string key)
    +{
    +    struct TrieNode *pwalk = root;
    +    
    +    for(int i = 0; i < (int)key.length(); i++)
    +    {
    +        int index = key[i] - 'a';
    +        if(!pwalk->children[index])
    +        pwalk->children[index] = new TrieNode();
    +        pwalk = pwalk->children[index];
    +    }
    +    
    +    pwalk->is_end = true;
    +}
    +
    + +

    Search Operation

    + +
    bool search(string key)
    +{
    +    struct TrieNode *pwalk = root;
    +    
    +    for(int i = 0; i < (int)key.length(); i++)
    +    {
    +        int index = key[i] - 'a';
    +        if(!pwalk->children[index])
    +        return false;
    +        
    +        pwalk = pwalk->children[index];
    +    }
    +    
    +    return pwalk->is_end;
    +}
    +
    + +

    Improving efficiency of a solution using Trie

    + +

    Consider the problem where we need to find the maximum value xor pair in an array of numbers.

    + +

    The Naive approach would be to calculate the xor value of all pairs of numbers in the array and then find the maximum value out of it. However this is not very efficient as the time complexity is O(N^2).

    + +

    Here we can use trie to store the binary representation of each number in the array and then we search for each number the maximum xor value we can get by taking the path opposite to the value of that bit in the number. Suppose the current bit is 1 then we look for a path with the bit set to 0 and we take the path with the opposite bit as long as it exists. In this manner for each number we will end up with the maximum value xor pair it can form and then take the maximum of these values.

    + +

    Comparison with other data structures

    + +

    Trie and hash tables are used in many similar applications. There are many advantages of a trie over a hash table : +There are no collisions of different keys in a trie. +Because of the above property the worst case look up time in a trie is better ( O(length) ) than hash table which can be ( O(n) ) due to collisions. Best case for both is the same ( O(length) ). +Trie provides an alphabetical ordering of entries. +Trie does not require buckets unless a single key is associated with more than one value.

    + +

    There are some drawbacks also for trie in comparison to hash table: +They require more memory for storing strings. +When keys are floating point numbers it can lead to long chains that are not really meaningful. However this can be handled by using a variant of trie called bitwise trie.

    + +

    Here is a list of some resources to get a better understanding of trie and also some common interview problems.

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/updatedekranoplan/index.html b/blog/updatedekranoplan/index.html new file mode 100644 index 0000000..8e2e30b --- /dev/null +++ b/blog/updatedekranoplan/index.html @@ -0,0 +1,487 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Here’s a closer look at the Ekranoplan +ekranoplan

    + +

    Often referred to as the Caspian monster, the ekranoplan is one of the most freakish designs that were actually brought to life in a period where people were peaking at innovation in military hardware. It was designed to stay above the surface of water like a hovercraft but travel at far greater speeds like that of a commercial aeroplane. This was achieved with the help of an air cushion.

    + +

    Hovercrafts have downward facing fans which generate the necessary lift while Ekranoplans used its wings and built up speed to do the same. In addition to this with the help of something called the ground effect (this reduces induced drag as the wingtip vortices aren’t formed) helps it travel at much higher speeds thana conventional aeroplane while retaining its ability to cover large distances and carry loads . This was very important for the Russians during the cold was as its primary purpose was to get troops in and out of the battle field under the radar.

    + +

    The Ekranoplan is part of a larger fleet of the navy called ‘Lun’ in the Russian military. Capable of cruising at around 450kmph and a max speed of 550 kmph and a massive range of around 2000km. This 286-ton beast was powered by eight Kuznetsov NK-87 turbofans each producing a massive thrust of 127.4 KN each.IT had a wingspan of 44m and a length of 73.8m and a height of 19.2m. It needed a crew of 15 to operate it. +This was used more than just a reconnaissance vehicle , sometimes it was often used as an ayyach vehicle too. It was equipped with two 23mm cannons and and two twin turret forward and backward facing missile tubes .

    + +

    It’s offensive and definsive objectives included interception and neutralisation of other aeral, ground and naval combat vehicles and missiles. It was one of the most formidable weapons of the time and had several nicknames including the aircraft carrier killer, all of them well earned . The art of war created this masterpiece and it will not be forgotten in time. The ekranoplan never reached the battlefield in time , it was a bit too late which furthermore led to it’s decommissioning.

    + +

    This beautiful work of art never reached completion as the war had come to an end , it was finally named the ‘spastel’ which meant rescue . The work was about 90% complete when the military stopped funding the project. MD-160 was the sole completed Lun-class ekranoplane.The sole piece entered service in the Black Sea fleet in 1987. It was finally decommissioned in the late 1990’s. Now it’s remains can be found in an abandoned naval base in Kaspiysk.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/using-mdns-in-iot/index.html b/blog/using-mdns-in-iot/index.html new file mode 100644 index 0000000..7aa5f13 --- /dev/null +++ b/blog/using-mdns-in-iot/index.html @@ -0,0 +1,539 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A project in Iot often requires multiple devices communicating with each other. This is usually done through sending messages over sockets. To locate a device, usually addresses are used. This is good technique, but due to commom use of DHCP, the IP addresses change constantly. So one needs to keep track of these changing IP addresses.

    + +

    What if you don’t need to remember the changing IP addresses? That’s where mDNS comes into picture.

    + +

    What is mDNS?

    + +

    mDNS stands for Multicast Domain Name System. Apple needed to use readable machine names on a local network without a nameserver, so implemented multicast DNS in their Bonjour. Multicast DNS uses a special domain called local. Host names are automatically registered in this domain.

    + +

    mDNS uses multicast address 224.0.0.251 and UDP as it’s transport layer protocol on port 5353.

    + +

    How to use mDNS?

    + +

    I found about this cool feature recently. Most of the modern OSes support mDNS out of the box. In dedication to popular Iot device Raspberry Pi, I will tell you the usage of mDNS in linux.

    + +

    Linux uses Avahi library for mDNS. To install Avahi on your linux/ubuntu system

    + +
    $ sudo apt-get install avahi nss-mdns
    +
    + +


    +Most probably above packages are installed by default. Now start avahi-daemon which will handle mDNS functions.

    + +
    $ system-ctl start avahi-daemon
    +$ system-ctl enable avahi-daemon
    +
    + +


    +Now we’ll need to configure our system to listen to mDNS. To do this, edit /etc/nsswitch.conf and modify the host : line as follows:

    + +

    hosts: files mdns_minimal [NOTFOUND=return] dns mdns

    + +

    If you’re using IPv4 only, then use mdns4_minimal and mdns4 instead.

    + +

    Now you are all set to go. You can check by resolving your own domain:

    + +
    $ dig +short <hostname>.local @224.0.0.251 -p 5353
    +
    + +


    +Here the <hostname> is the system’s hostname. If you don’t know this, then execute hostname to get it. For example, my hostname is hrily, so following is the output of hostname.

    + +
    $ hostname
    +hrily
    +
    + +


    +So when I resolved my hostname, I got:

    + +
    $ dig +short hrily.local @224.0.0.251 -p 5353
    +10.50.47.112
    +
    + +


    +

    +

    Applications

    + +

    Now that we know how to use hostnames instead of IP addresses, we have a cool set of applications. Whenever you want to ssh to your RPi with hostname myrpi, you just need to do:

    + +
    $ ssh user@`dig +short myrpi.local @224.0.0.251 -p 5353`
    +
    + +


    +This is really good usage that I need constantly. When I’m in my cammpus network, but not in reach of my laptop and need to do some work on it, I just ssh into it using my phone using above command. I don’t really need to know what IP address was assigned to my laptop.

    + +

    I hope you find mDNS useful. Untill then, this is hrily signing off…

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/varistor/index.html b/blog/varistor/index.html new file mode 100644 index 0000000..c42398c --- /dev/null +++ b/blog/varistor/index.html @@ -0,0 +1,539 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Varistor

    + +

    The name itself might have given you some idea about what it is, varistor stands for variable resistor

    + +

    What is a varistor?

    + +

    Varistor is a varying resistor whose resistance depends on applied voltage,one of the special features of varistor is that it possesses non ohmic characteristics, which defines themselves as a non linear type of resistors

    + +

    It has two semiconductor elements fixed in a particular fashion (i.e. anti-parallel to each other) as to provide same characteristics for both directions of traversing current

    + +

    Its composition might have provided you with the insight that as it is made of semiconductor, it’s resistance will decrease as voltage across it increases

    + +

    Its symbol is

    + +

    Image1

    + +

    One of the major applications of varistors is its ability to suppress voltage transients in the cut

    + +

    Voltage transient - short duration surges of electrical energy that are result of sudden release of energy that are previously stored or induced by other means, such as heavy inductive loads or lightning

    + +

    Waveform of AC Transient

    + +

    Image2

    + +

    The above characteristics might actually lead you to think that varistor behaves like a potentiometer or a rheostat

    + +

    Two characteristics that makes varistor a different entity is

    + +

    i) resistance cannot be changed manually

    + +

    ii) resistance decreases with increase in voltage

    + +

    Varistor vs voltage graph

    + +

    Image3

    + +

    Working of a varistor

    + +

    As I have already told that its characteristics are similar to that of Zener diode, its V-I characteristics are also similar to that Zener diode

    + +

    V-I characteristics of varistor

    + +

    image4

    + +

    As the varistor operates in first and third quadrant, it makes it a suitable device to connect it in a circuit with AC or DC source

    + +

    As the voltage increases above the clamping voltage, there is an abrupt increase in current

    + +

    This helps during voltage transients, as when the circuit experiences high transient voltage, the voltage across the varistor increases, to a value greater than its clamping voltage, which in turn increases the current and acts as a conductor, it basically acts like a self-regulator at the event of voltage transient keeping the voltage input in check

    + +

    Steep nonlinear curve indicates excessive currents can be passed through varistor over narrow range of voltage

    + +

    Capacitance of varistor

    + +

    A varistor in non-conducting state acts like a capacitor more than a resistor

    + +

    Non-conducting state-the voltage applied across the varistor is less than the clamping voltage

    + +

    Since the semiconductor body of the Varistor acts like an insulator during its insulating state, it can be regarded as the dielectric material, while the two terminals can be regarded as the two electrodes

    + +

    Types of Varistor

    + +

    Silicon carbide varistor

    + +

    Metal oxide varistor

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/vortices/index.html b/blog/vortices/index.html new file mode 100644 index 0000000..9c3172c --- /dev/null +++ b/blog/vortices/index.html @@ -0,0 +1,508 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Vortices

    + +
    +

    When everything seems to be going against you, remember that an airplane takes off against the wind, not with it” – Henry Ford

    +
    + +

    This article has been written especially for those who are interested in aerodynamics and also for people who are curious to know how small modifications in design help make an airplane or a car more aerodynamically efficient. The content is from an aerodynamic point of view, in an airflow.

    + +

    Fig.1

    + +

    A Vortex (Fig. 1) is nothing but a region in a fluid which revolves about a certain axis. These vortices often disturb an airflow and induce a lot of drag. Wingtip vortices in an airplane are due to the tendency of air to flow from a higher pressure region to lower pressure region, which induce drag. These vortices might seem to be unnecessary and drag inducing when it comes to vehicle performance. The good news is, these vortices have a good side and have made things easy in so many ways. +In what way are these vortices helpful?

    + +

    Fig.2

    + +

    A vortex by nature helps keep the air stuck to the surface it is flowing around (Fig. 2). It also acts as a boundary between airflows. Let us consider an F1 car. There are regions such as the intake vents and under a spoiler where smooth airflow is required. By generating vortices in front of these regions or before the airflow splits up, the airflow can be directed smoothly into the required region. This also reduces drag as the airflow sticks to the vehicle body.

    + +

    Fig.3

    + +

    Air has a natural tendency to flow over a car as shown in Fig. 3. This flow is highly inefficient which induces drag behind the car and also involves the turbulence generated by the high-speed tires. By introducing vortices in specific regions, we can create a boundary between the airflow regions and keep them contained as shown in Fig. 4.

    + +

    Fig.4

    + +

    This clever trick is also used in airplanes. In supersonic jets such as the Concorde and Tupolev Tu 144, the airflow separates from the wing surface easily at high speeds. Hence they use vortices to keep the airflow stuck to the wings. (Fig. 5).

    + +

    Fig.5

    + +

    Economically speaking, in order to shorten the runway, the aircrafts need to have higher lift at lower speeds. This can be achieved by either increasing the surface area of the wing (increases drag and weight) or increasing the lift coefficient by generating vortices (increase in drag only). It is obvious that generating vortices is more economical.

    + +

    How to generate such Vortices? If you look at the front wing of an F1 car (Fig. 6) you can find slit like structures called ‘Vortex generators’. Air flows over these vortex generators creating high pressure at the top and low pressure at the bottom (Fig. 7). As a result, air leaks around the tips from the top to the bottom creating a spiral motion of air carried by the airflow creating vortices.

    + +

    Fig.6
    +Fig.7
    +Fig.8

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/war-of-the-currents/index.html b/blog/war-of-the-currents/index.html new file mode 100644 index 0000000..0ed7067 --- /dev/null +++ b/blog/war-of-the-currents/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    current +Thomas Edison

    + +

    current +Nikola Tesla

    + +

    At the end of the 19th century, the world witnessed one of the greatest scientific feuds of all times, which changed the course of the history.

    + +

    Three brilliant inventors, Thomas Edison, Nikola Tesla and George Westinghouse, battled over which electricity system—direct current (DC) or alternating current (AC)–would become standard. This would go on to be known as the ‘War of the Currents’.

    + +

    By 1880, Edison had created a model for the incandescent lamp that was commercially viable. But to make a profit out of the electric lights that he had invented, he realized that electricity would have to be brought to people’s homes. Thus he began devising a system for generation and distribution of power. Edison’s distribution system would supply 110 V DC voltage. In 1882, Edison opened the first ever electric power plant in Pearl Street, New York. The problem with Edison’s system was that it could only deliver electricity within a half-mile radius from the plant.

    + +

    current

    + +

    The First Induction Motor

    + +

    Two years later, A young Serbian engineer, Nikola Tesla immigrated to America and started working under Edison. He improved Edison’s existing DC system in order to interest him in an AC motor that he had been developing. But Edison, a firm supporter of DC, said that AC has no future.

    + +

    Tesla quit his job in 1885 and a few years later received a number of patents for his AC technology. In 1888, he sold his patents to industrialist George Westinghouse, whose Westinghouse Electric Company had quickly become an Edison competitor. Feeling threatened by this competition, Edison started a propaganda to malign George Westinghous and his AC System in the eyes of the public. As a part of this propaganda, Edison electrocuted a number of animals just to prove how dangerous high voltage AC is. Edison even suggesting electrocution as way of executing criminals and in 1890 convicted murderer William Kemmler became the first person to die on an electric chair which was powered by a Westinghouse generator. This marked one of the darkest events of the war.

    + +

    With the advent of the alternating current transformer, high voltage AC produced by the generators could be stepped down to lower voltages within the safety standard. This was an important event in the War of The Currents. Now AC could be safely supplied at everyone’s doorstep.

    + +

    This made Edison’s argument obsolete.

    + +

    Despite all his efforts to discredit AC, Edison failed. Westinghouse won the contract to supply electricity to the 1893 World’s Fair in Chicago—beating out rival General Electric, which was formed in 1892 by a merger involving Edison’s company—and the expo became a dazzling showcase for Tesla’s AC system. Westinghouse also received an important contract to construct the AC generators for a hydro-electric power plant at Niagara Falls; in 1896, the plant started delivering electricity all the way to Buffalo, New York, 26 miles away. Thus the first electric grid came into being. The achievement was regarded as the unofficial end to the War of the Currents, and AC became dominant in the electric power industry.

    + +

    The war pushed Westinghouse into bankruptcy. To save his friend, Tesla gave up all his perks that he had gained from his patents. As he grew old, the genius mind of Tesla took a toll on him and it drove him towards insanity. In his last days, Tesla lived in a hotel alone and without any cash. In 1943, Nikola Tesla died. Tesla was never given credit for his works and he ended penniless when he could have earned millions from his patents. Tesla’s story is one of the most tragic story in the history of science.

    + +

    The war of the currents changed the course of history. We cannot imagine our lives without electricity. Today, we reap the benefits of the pioneering works of Edison and Tesla. Although today AC is the standard, DC is gaining importance with the advent of digital electronics. So it appears the War of the Currents may not be over yet. But instead of continuing in a heated AC vs. DC battle, it looks like the two currents will end up working parallel to each other in a sort of hybrid armstice.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/washable-electronics/index.html b/blog/washable-electronics/index.html new file mode 100644 index 0000000..0312daa --- /dev/null +++ b/blog/washable-electronics/index.html @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Washable electronics? Water-repellent graphene circuits make it possible!

    + +

    New graphene printing technology can produce electronic circuits that are low-cost, flexible, highly conductive and water repellent.

    + +

    Landing image +The nanotechnology “would lend enormous value to self-cleaning wearable/washable electronics that are resistant to stains, or ice and biofilm formation,” according to a recent paper describing the discovery.

    + +

    According to Jonathan Claussen, an Iowa State University assistant professor of mechanical engineering, an associate of the U.S. Department of Energy’s Ames Laboratory, they’re taking low-cost, inkjet-printed graphene and tuning it with a laser to make functional materials.

    + +

    The research group used inkjet printing technology to create electric circuits on flexible materials. In this case, the ink is flakes of graphene – the wonder material can be a great conductor of electricity and heat, plus it’s strong, stable and biocompatible.

    + +

    The printed flakes, however, aren’t highly conductive and have to be processed to remove non-conductive binders and weld the flakes together, boosting conductivity and making them useful for electronics or sensors.

    + +

    Typically, post processing involves heat and chemicals, but here Claussen and his research group developed a rapid-pulse laser process that treats the graphene without damaging the printing surface – even if it’s paper.

    + +

    Claussen further added that they’re micro-patterning the surface of the inkjet-printed graphene and the laser aligns the graphene flakes vertically like little pyramids stacking up, and that’s what induces the hydrophobicity.

    + +

    The energy density of the laser processing can be adjusted to tune the degree of hydrophobicity and conductivity of the printed graphene circuits. +The technology could also have applications in flexible electronics, washable sensors in textiles, microfluidic technologies, drag reduction, de-icing, electrochemical sensors and technology that uses graphene structures and electrical simulation to produce stem cells for nerve regeneration.

    + +

    The graphene printing, processing and tuning technology is turning out to be very useful. After all, “electronics are being incorporated into everything.”

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/water-jet-guided-laser-cutting/index.html b/blog/water-jet-guided-laser-cutting/index.html new file mode 100644 index 0000000..a361afc --- /dev/null +++ b/blog/water-jet-guided-laser-cutting/index.html @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Laser

    + +

    The term ‘Laser’ originated as an acronym for Light Amplification by Stimulated Emission of Radiation. The difference between a Laser and other Light sources is the coherence. The spatial coherence of lasers allows them to be focused on a tight spot, enabling applications such as lithography, laser printing, refractive surgery, and of course, Laser Cutting.

    + +

    Laser cutting is one of the most popular applications of Lasers. Compared to conventional mechanical cutting techniques, laser cutting is more accurate, eco-friendly, and efficient.

    + +

    Water-Jet Guided Laser Cutting

    + +

    In Water-Jet Guided Laser Cutting, the laser beam used is guided to the workpiece through a high-pressure water jet. The water jet functions like an optical surface, resulting in total internal refraction of the laser due to the difference in refractivity index of water and air. Similar to an optical fiber, the beam is reflected many times on the surface of the jet before reaching the workpiece.

    + +

    Diagram for the process

    + +

    Figure 1

    + +

    The nozzle diameter for a typical water jet ranges between 20µm and 150µm. The pressure of the filtered, deionized, degassed water can reach 600bar on smaller nozzles. The nozzles are made from diamond or sapphire. Degassed and deionized water is used to minimize energy absorption within the water jet. The laser beam gets reflected at the interface of water and air as it comes into contact with the pressurized water exiting the nozzle. The laser on reaching the workpiece causes it to melt and vaporize. The water jet also assumes a secondary role here, cooling the workpiece to reduce the generation of harmful fumes.

    + +

    Leading commercial lasers used in materials processing applications include carbon dioxide (CO2) laser, Nd-YAG laser, ytterbium (Yb) doped fiber laser, ytterbium (Yb) doped disk laser, excimer lasers, and high-power diode lasers.

    + +

    Initially, the waterjet guided laser was developed to reduce the Heat Affected Zone (HAZ). The use of a water jet instead of a conventional assist gas stream led to several additional benefits. The divergence of the beam is reduced, which proves advantageous when cutting metals thicker than 1mm. There is an immediate cooling of the cut, and the high momentum of the water jet efficiently removes the molten materials, resulting in a clean, burr-free cut.

    + +

    This technology has many advantages over conventional laser cutting and water jet cutting. Focal optics are not required in this technology. The water jet's mechanical force is significantly less compared to that of conventional jet cutting (0.1N as opposed to 1-5N), and thus the scathing of the workpiece surface is negligible.

    + +

    Limitations of Water-Jet Guided Laser Cutting

    + +
      +
    1. The laser beam's high-power density is attenuated dramatically by the water jet, reducing the efficiency of this method, which is particularly visible when cutting thick materials.
    2. +
    3. It is challenging (and expensive) to obtain degassed and deionized water without air bubbles.
    4. +
    5. The machining of the nozzle hole has to be extremely precise to avoid the laser ablating the nozzle.
    6. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/water-memory-what-a-memory/index.html b/blog/water-memory-what-a-memory/index.html new file mode 100644 index 0000000..80a979d --- /dev/null +++ b/blog/water-memory-what-a-memory/index.html @@ -0,0 +1,504 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What would you preferably use to store your precious data - a hard disk, a pen-drive, a DVD; or perhaps WATER!

    + +

    Scientists from Germany now believe that water has a memory, meaning that what once was seen as a simple commodity has been closely examined to reveal a scientific revelation, uncovering a mind-blowing truth.

    + +

    Theory

    + +

    Individual drops of water from the same sample were examined at incredibly high magnification, probably the first experiment of this kind and surprisingly scientists were able to physically see that each droplet of water has its own individual microscopic pattern, distinguishable from the next and uniquely beautiful.

    + +

    Different droplets possess varying

    + +

    physical structure under high resolution

    + +

    Experiments

    + +

    In a scientific experiment, a group of students were made to obtain one drop of water from the same body, all at the same time. On examination, each of them produced different images.

    + +

    In the second experiment, a real flower was placed into a body of water, and after a while droplet from the same were sampled and examined. The result produced a mesmerising pattern when hugely magnified, but all of the droplets of this water looked very similar. When the same experiment was one with a different species of flower, the magnified droplet looked completely different, thereby determining that a particular flower is evident in each droplet of water.

    + +

    Conclusion

    + +

    Through this discovery which shows that water has a memory, according to scientists, a new perception of water can be formed. The German scientists believe that as water travels it picks up and stores information from all of the places that it has travelled through, which can thereby connect people to a lot of different places and sources of information depending on the journey that it has been on.

    + +

    This has even been compared to the human body, of which each is incredibly unique and has an individual DNA unlike any other. Whilst the human body is made up of 70% water, conclusions could be drawn from these new discoveries that human tears can hold a unique memory of an individual being, through the body's store of water hosting a complete store of information that is linked to individual experience suggesting that everyone is globally connected by the water in the human body which travels through ongoing journeys, whereby information along the way is always stored.

    + +

    Reference:

    +
      +
    • Jess Murray Truth Theory
    • +
    • This video will give you a brief insight into the basic of water - Memory Theory. +Youtube
    • +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/web-3-0/index.html b/blog/web-3-0/index.html new file mode 100644 index 0000000..643baaf --- /dev/null +++ b/blog/web-3-0/index.html @@ -0,0 +1,523 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Web 3.0?? What in the world is that???!!!

    +

    There is a lot of buzz around web 3.0 and the changes it can bring in the world of tech. But only a few know what it actually is…Before hopping into web 3.0 let us know a little about its predecessors.

    + +

    The Web 1.0 , which started the whole damn internet and the Web 2.0 that we all use and love so much. Web 1.0 was just a set of static websites . It comprised of a load of websites with no interactive information. But as the internet got faster and faster, web wasn’t only restricted to viewing content. People started participating. Interactive content started flourishing on the servers worldwide. This is the web we all know and love spending so much time on. This is the age of the Facebook, Twitter, Youtube…

    + +
    +

    So, now that we all are enjoying the web 2.0, why don’t we let it stay as it is?? Why do we have to disturb this amazingly fun world???

    +
    + +

    Now, there is a catch. Web 2.0 is not all goodies as one might think.

    + +

    The web 2.0 makes the rich richer and poor poorer. It hinders the flow of money which is needed for a better economy. The consumers’ data is being collected and used the way the huge companies want, without the consumers being paid for their data and also they don’t have any control over how the data is being used. (Eg: PRISM) So, think twice before you ask Alexa anything :p.

    + +

    Web 2.0 removes the opportunities for the budding startups to compete with the tech giants like Google, Microsoft etc. who have the best human and computational resources in the world. Web 2.0 promotes the monopoly in a field. +Companies that control internet

    + +

    Data Breach

    + +

    Data Ownership

    +

    Web 3.0 to the rescue.

    +

    Web 3.0 removes all these problems of web 2.0 and also provides much more… +Web 3.0 gives:

    +
      +
    1. No central point of failure. : Servers are the place where all the data are stored and this makes it very easy for the bad forces to do the misdoings. This is also a problem during natural calamities or anything where the failure in the server makes the whole network go down
    2. +
    3. Ownership of data: the end users have much more control over their data. In web 2.0 the companies have complete control over the users’ data and may choose to use it however they want. This also is lucrative as the ad-agencies give them handsome amount of money for the users’ data
    4. +
    5. Data Permanence: the data can be stored permanently on the web as the data is actually stored in the network(ipfs link) instead of a single server.
    6. +
    7. Good economy: Web 3.0 allows for the better rotation of money. It provides tokens which can be used for the monetization
    8. +
    9. Censorship Resistant: As the storage is not in a server but in the network , it gets very hard to stop the data from being accessed by people
    10. +
    + +

    So what are required for building Web 3.0 stuff??

    +

    The main technology that made the Web 3.0 possible is the blockchain. Blockchain which is mainly known in the context of the cryptocurrencies, can also be used to build decentralized applications or the dApps. Ethereum is the blockchain which promotes the dApps. Ethereum provides smart contracts which can be used to build dapps. Ethereum provides the developers with a bunch of technology,called the web 3.0 stack, but that’s a discussion for another blog post

    + +

    Ethereum Stack

    + +

    Ethereum Stack detailed view

    + +

    Like any emerging technology is still being refined. For access to the decentralized web, people will only need a seed. This will be a single asset which enables the interaction with dApps and other services. Individuals will still use a web browser to access the internet, and visually it will be Web 2.0 user-friendly.On the surface, the learning curve from 2.0 to 3.0 will be gentle. But behind the scenes, the framework connecting users with digital services are markedly different. Transactions are signed and verified manually, to prevent platforms from stealing away personal information.

    + +

    Web 3.0 alternatives to Web 2.0 things

    +
      +
    • Instead of Google Drive or Dropbox, we have services like Storj, Siacoin, Filecoin or IPFS technology to distribute and store files.
    • +
    • Instead of Skype we have platforms like Experty.io.
    • +
    • Instead of WhatsApp and Wechat we have Status, that uses the Whisper protocol in the Ethereum stack
    • +
    • Instead of operating systems such as iOS and Android, frameworks such as Essentia.one and EOS provide a gateway to the new web.
    • +
    • Akasha or Steemit will play the role of Facebook, the Brave browser will serve as Chrome and Ethlance can take over from Upwork.
    • +
    + +

    Web 3.0 alternatives

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/web-vulnerabilities/index.html b/blog/web-vulnerabilities/index.html new file mode 100644 index 0000000..b623b6c --- /dev/null +++ b/blog/web-vulnerabilities/index.html @@ -0,0 +1,546 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Web Vulnerabilities

    + +

    A vulnerability is a hole or a weakness in the application, which can be a design flaw or an implementation bug, that allows an attacker to cause harm to the stakeholders of an application. +Websites across the world are programmed with different programming languages. +Although each specific language have specific vulnerabilities ,issues exist fundamental to the internet that can show up disregarding the choosen language or framework used.

    + +

    Some Web Vulnerabilities

    + +
      +
    • +

      SQL Injection

      +
    • +
    • +

      Cross Site Request Forgery

      +
    • +
    • +

      Cross Site Scripting

      +
    • +
    • +

      Server Side Request Forgery

      +
    • +
    + +

    SQL INJECTION

    + +

    SQL Injection is a vulnerability where an application takes input from a user and doesn’t vaildate that the user’s input doesn’t contain additional SQL. To make an SQL Injection attack, an attacker must first find vulnerable user inputs within the web page or web application. A web page or web application that has an SQL Injection vulnerability uses such user input directly in an SQL query.

    + +

    SQL is a query language that was designed to manage data stored in relational databases. You can use it to access, modify, and delete data. Many web applications and websites store all the data in SQL databases. In some cases, you can also use SQL commands to run operating system commands. Therefore, a successful SQL Injection attack can have very serious consequences.

    + +

    A simple Example:

    + +

    <?php +$username = $_GET[‘username’]; // kchung + $result = mysql_query(“SELECT * FROM users WHERE username=’$username’”); +?>

    + +

    what if we input ‘OR 1=1?

    + +

    Here as 1=1,this equates to true to sql .This will then return every row in the table becuase each row that exists must be true.

    + +

    Using this technique of adding SQL statements to an existing query we can force databases to return data that it was not meant to return.

    + +

    ## CROSS SITE REQUEST FORGERY

    + +

    CSRF is an attack that tricks the victim into submitting a malicious request. It inherits the identity and privileges of the victim to perform an undesired function on the victim’s behalf. For most sites, browser requests automatically include any credentials associated with the site, such as the user’s session cookie, IP address, Windows domain credentials, and so forth. Therefore, if the user is currently authenticated to the site, the site will have no way to distinguish between the forged request sent by the victim and a legitimate request sent by the victim.

    + +

    ## CROSS SITE SCRIPTING

    + +

    Cross Site Scripting or XSS is a vulnerability where a user of an application can send JavaScript that is executed by the browser of another user of the same application.This is a vulnerability because JavaScript has a high degree of control over a user’s web browser.That is Javascript has the ability to send more HTTP requests,modify the page,access the cookies.

    + +

    XSS is typically broken down into two categories:

    + +
      +
    • +

      Reflected XSS

      +
    • +
    • +

      Stored XSS

      +
    • +
    + +

    REFLECTED XSS

    + +

    Reflected XSS is done through URL manipulation.One of the deficiencies of reflected XSS however is that it requires the victim to access the vulnerable page from an attacker controlled resource. Notice that if the data parameter, wasn’t provided the exploit wouldn’t work.

    + +

    STORED XSS

    + +

    Stored cross-site scripting arises when an application receives data from an untrusted source and includes that data within its later HTTP responses in an unsafe way.If an attacker can control a script that is executed in the victim’s browser, then they can typically fully compromise that user.Difference between reflected and stored XSS is that a stored XSS vulnerability enables attacks that are self-contained within the application itself.The self-contained nature of stored cross-site scripting exploits is particularly relevant in situations where an XSS vulnerability only affects users who are currently logged in to the application.The web site itself is serving up the XSS payload to other users. This makes it very difficult to detect from the browser’s perspective and no browser is capable of generically preventing stored XSS from exploiting a user.

    + +

    SERVER SIDE REQUEST FORGERY

    + +

    Server Side Request Forgery is when an attacker is able to cause a web application to send a request that the attacker determines.The attacker can abuse functionality on the server to read or update internal resources. The attacker can supply or a modify a URL which the code running on the server will read or submit data to, and by carefully selecting the URLs.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/what-makes-a-smart-home-smart/index.html b/blog/what-makes-a-smart-home-smart/index.html new file mode 100644 index 0000000..4465b32 --- /dev/null +++ b/blog/what-makes-a-smart-home-smart/index.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    When you leave your home have you been bothered by these little doubts like have I turned the water heater off? Did I set the security at home? Did I switch off the TV?

    + +

    With the introduction of smart homes these will no longer be a bother to us anymore. Any electrical component, may it be a fan or your TV or even your coffee maker, every electrical appliance in our homes can be hooked up to the home network. This will basically allow us to control our entire house with our laptops or something as simple as our smart-phone. These smart homes are now very common and have now started to create a revolution.

    + +

    What is the principle behind it?

    + +

    So people generally ask themselves, what exactly makes these smart homes so smart?

    + +

    Well, it’s due to the ability to connect multiple devices to your net and then wirelessly use them. This allows us to easily give commands to the system and control them.

    + +

    How is this possible you ask? It’s all thanks to The Internet of Things. This basically allows a person to interconnect multiple things to the internet and then use them to exchange data with one another and execute appropriate commands according to the data. You may find yourself what these “things” are. These “things” (also known as smart devices) could be anything ranging from sensors to even our daily appliances.

    + +

    What actually happens in the network?

    + +

    What do you think happens when you send a command to one your appliances?

    + +

    Let’s visualize this with an example.

    + +

    Now you want to turn one of your appliance, let’s say your water heater. You will send a command through one of your transmitters ( phone, laptop or even one of your interfaces that is connected to the network) which will be later sent to the receivers with the help of the network. Two of the most used networks are Z-ware and ZigBee.

    + +

    These transmitters will first issue a command to the system its giving the command. Then it will identify the corresponding device with its item number. Once confirmed it will send the main command, that is the OFF command which will alter the state of the appliance and thereby allowing you to control the working of the device.

    + +

    How does this help Us?

    + +

    Now let’s look at how these homes work and how they help us.

    + +

    Smart Homes

    + +

    With the help of this picture we can get a pretty good picture as to how a smart house works. So basically in a smart house all the appliances are connected to the net and with the help of controllers like laptop, mobile phones and other interfaces we can controls all the appliances wirelessly. It is not only about controlling them wirelessly. They can be automated as well so that we need not bother with all the minor details in our day to day life.

    + +

    Having doubts? Let us take an example.

    + +

    All of us find it hard and very troublesome to go and buy grocery for our kitchen when they get over. Now imagine a situation where you need not do any of this. You can now automate your refrigerator to sense when your supplies are getting over and then directly place an order for new stock of supplies. This would save so much time and effort.

    + +

    This is just the beginning. You would be able to control all the LEDs in the house, adjust their color and brightness as you would like it. You can even deactivate all your appliances except your security systems when you are leaving.

    + +

    Control

    + +

    Combined with a smooth interface this system is really user friendly and really reduces the amount of work that we do and not only saves our time but also saves our other resources as well. All these factors make these smart homes really smart and a great place to live in.

    + +

    For further references about Smart home systems and the principles

    + +
      +
    1. Smart Home
    2. +
    3. Home Automation
    4. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-50hz/index.html b/blog/why-50hz/index.html new file mode 100644 index 0000000..7bdb123 --- /dev/null +++ b/blog/why-50hz/index.html @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Why do most of the countries use a 50/60 Hz, 110/220 V power supply and not any othervalue?

    + +

    The answer to this question is not definite but quite a few technical and historical reasons can be found to support this which date back to the very beginning of the development of the electrical power system.

    + +

    What is supply frequency and why is it an important parameter in the electrical grid?

    + +

    Example

    + +

    The electrical power grid consists of a massive network of generators, transmission lines, transformers, substations and a variety of loads drawing real and reactive power. The grid frequency is decided by the speed at which the synchronous generators at various thermal, hydro and nuclear power stations operate (f = N*P/120, P = no. of poles in the machine).

    + +

    In turn the frequency determines the size, efficiency and power producing capacity of the machine. The frequency also decides the inductive reactance of the transmission line, hence the power losses in the line. One thing that must be kept in mind is that the frequency is a global parameter of the grid and must be kept almost exactly at the given value with a variation of at most 0.2Hz. If disturbed, the entire grid may fail to cause a blackout.

    + +

    So why do some countries use 50 Hz while others use 60?

    + +

    Most of the North & South Americas, parts of Japan and Europe operate at 60Hz while the rest of the world operates at 50Hz. There isnt much of a difference between the two numbers but one may be curious to know what is the reason for the difference.

    + +

    The first ever alternating current experiment was conducted by an inventor named William Stanley in a small town called Great Barrington in Massachusetts, funded by the Westinghouse Electric Company. At that time in the US used Arc Lighting systems, on which calculations showed that they operated with the best efficiency at 60Hz. Also, back then the US used the duodecimal numbering system which made calculations easier at a 60Hz frequency. Simultaneously in Europe, the AEG (German acronym for General Electric Company) started to build power stations with generators producing 50Hz to compete with the western system of 60Hz. They started manufacturing electrical equipment which operated at 50Hz.

    + +

    Westinghouse

    + +

    When and how did the 50Hz frequency come to the Indian subcontinent?

    + +

    By the beginning of the 20th century 50Hz had become standardized across all of Europe. At that time, as we all know, India was colonized by the British. India’s first small hydroelectric power plant of 130kW capacity was set up in Darjeeling in 1897. After 5 years India’s first major power plant near Shivanasamudram falls in Karnataka, of 4.5MW was commissioned to provide power to the Kolar Gold mines located about 150km away. Both of these plants had generators operating at 50Hz.

    + +

    Why 50 Hz

    + +

    Why do aviation systems operate at a 400Hz frequency, which is about 8 times the frequency of mainland power systems?

    + +

    The major tradeoff that an aviation engineer has to keep in mind is between efficiency and size. Modern day aircrafts have highly sophisticated communication systems, complex avionics, and a lot of passenger entertainment systems which increase the power requirement of the aircraft. The primary requirement of an airplane is fuel efficiency. When an AC generator is operated at a higher frequency the number of windings that are needed to produce the same amount of voltage is reduced drastically. This modification brings down the weight of the machine which in turn saves vast amount of fuel. The drawback of high frequency is large amounts of reactive power losses in the system, but as mentioned earlier, our primary requirement is not reducing the losses but to reduce the weight and size. Hence, it can be concluded that the frequency of the system has to be chosen to satisfy the end needs.

    + +

    img7

    + +

    Why is the supply voltage 110V in some countries while 220V in India and others?

    + +

    Once again, we go back to the late 19th century during the time when Thomas Alva Edison invented the first incandescent lamp. He set up the first ever DC power supply line on Pearl Street, Manhattan. A voltage of 110V was supplied from the sending end to feed the incandescent lamp loads which were designed to run at 100V. The extra 10V was provided at the supply end to account for the transmission line losses.

    + +

    Since then always an extra voltage of 10% with respect to the desired receiving end voltage is supplied (That is why we see transformers of rating such as 11kV, 110kV, 220kV) etc. Since then the US has followed the practice of 110V live wire voltage with respect to the neutral. In European countries, a 220V line voltage was preferred due to the increased transmission efficiency even though it is more dangerous.

    + + + +

    img9

    + +

    The latest emerging technology is the smart grid technology. This technology aims at integrating control systems with the grid to provide a more detailed information about power demand to the engineers in various regions of the grid. It also aims at using Artificial Intelligence to solve power system related issues and also automatic rerouting of power from generating station to homes in case of any environmental damage caused to the transmission line. The smart grid also aims at merging renewables such as wind and solar energy to the existing grid. This technology will help in saving this precious resource that all of us take for granted.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-do-GANs-matter/index.html b/blog/why-do-GANs-matter/index.html new file mode 100644 index 0000000..751140a --- /dev/null +++ b/blog/why-do-GANs-matter/index.html @@ -0,0 +1,592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    A new class of Generative Models was proposed in 2014 by Ian Goodfellow (a.k.a The GANfather) which brought in a novel method of dealing with issues in ML and AI. The Invention of Generative Adversarial Networks (GANs) can be regarded as one of the path-breaking innovations in making computers do useful stuff. GANs have seen some crazy development from an application perspective and has been one of the hottest topics for research in the past 5 years.

    + +

    So what does a Generative Model do?

    + +

    The main objective of a Generative Model is to create more samples of the same type as training data. The basic idea is to take a set of training examples and develop a probability distribution. Based on that distribution, it generates more samples. There are two ways of generative modeling - one is to explicitly define a density function, for instance, a Gaussian density function or log-likelihood which tells the probability distribution that generated them and the other is observing many samples from a particular distribution and generating more samples from the same distribution. GANs come under the latter category, where learning the function is left to the model itself.

    + +

    How do GANs work?

    + +

    GANs form a subclass of implicit Generative models that rely on adversarial training of two networks: the Generator G, which attempts to produce samples that mimic the reference distribution, and the Discriminator D, which tries to differentiate between real and generated samples and, in doing so, provides a useful gradient signal to the Generator. GANs have proven to be useful in various domains like unsupervised feature learning, image and video generation. They are illustrated with an analogy in the image.

    + +

    Generative Adversarial Network

    + +

    Why are Generative Models useful?

    + +

    The first question that comes to mind is that why do we even care about generating more samples (say images) with tons of them lying around? The applications are pleasing enough to reason for it:

    + +
      +
    • Generative models can be used in Curiosity-driven Exploration in Deep Reinforcement Learning. One of the biggest problems in RL is balanced Exploration and Exploitation in high dimensional space. Without efficient Exploration techniques, the agent may just wander around until it stumbles into a rewarding state. This can waste a lot of computation and training time even if we use a heuristic approach. In this paper, Rein Houthooft and colleagues propose VIME, a practical approach to exploration using uncertainty on Generative models.
    • +
    + +

    The following illustration compares the two approaches. The agent in the left is trained using VIME approach while the right one using Naive approach.

    + + + + + + + + +
    VIME approachNaive approach
    + +
      +
    • +

      We can use Generative models to simulate possible futures for Reinforcement Learning. We can have an agent learn in a simulated environment built entirely using generative models rather than building it physically. The advantage of using this model-based RL approach is that it can be parallelized easily across different machines and the mistakes in it are not as costly as if we make them in the real world.

      +
    • +
    • +

      Generative models can to fill in missing inputs and learn even when some of the labels in the data are missing. They handle missing inputs much more effectively than the traditional input to output mappings in machine learning models. GAINs are a type of GANs where the generator imputes a vector of real data, which is then fed back to the discriminator to figure out which data was originally missing. MisGAN is another variety that can learn from complex, higher-dimensional incomplete data using a pair of generators and discriminators. Semi-Supervised Learning is an application where we may have very few labeled inputs but by leveraging many more unlabeled examples, we can do good on the test set.

      +
    • +
    + +

    MSE v/s Adversarial appraoch

    + +
      +
    • The picture shows two approaches to finding the next frame in the video. Since there are many possibilities in a video in the next time step, traditional approaches like Mean Squared Error (MSE), result in the output being a bit blurry as a consequence of averaging out various results. Using generative techniques and adversarial particularly results in getting a sharp output towards the eyes as well as ears.
    • +
    + +

    GANs Demystified…

    + +

    GANs are turning out to be better than the traditional approaches in various applications of Machine Learning. Following are some of the recent developments in GANs:

    + +

    High Fidelity Speech Synthesis with GANs

    + +

    The Text-to-Speech (TTS) task consists of the conversion of text into speech audio. There has been a lot of development in this field using Neural Autoregressive models. However, an essential disadvantage of this technique is that it is difficult to parallelize. Every time step in the audio needs to be considered sequentially which is computationally expensive.

    + +

    Using GANs can help in parallel waveform generation. GAN-TTS, a Generative Adversarial Network for Text-to-Speech is a novel architecture proposed for this. It consists of a feed-forward generator, which is a Convolutional Neural Network, paired with an ensemble of multiple discriminators which evaluate the generated and real data. Mean Opinion Score (MOS), as well as quantitative metrics - Frechet DeepSpeech Distance and Kernel DeepSpeech Distance, are used as evaluation metrics.

    + +

    GAN-TTS architecture

    + +

    The generator’s input is pitch and linguistic features and output is a raw waveform at a certain frequency. GBlock shows the design of the generator in the above diagram. The output convolutional layer uses tanh activation function to produce a single-channel audio waveform. The discriminator consists of an ensemble instead of a single model as in DBlock. Some discriminators take the linguistic conditioning into account while others ignore the conditioning and can only assess the general realism of the audio.

    + +

    Connecting GANs and Actor-Critic methods in RL

    + +

    Both GANs in unsupervised Learning and Actor-Critic methods in Reinforcement Learning are difficult to optimize and stabilize since they often end up giving degenerate solutions. Both are multi-level optimization methods where we do not have a single unified objective function and consist of hybrid models where each tries to minimize its private cost function. Each level is optimized with respect to the optimum of the other model. This makes the traditional optimization methods like Gradient Descent and its variants not work very well since they are oriented towards solving a common cost function.

    + +

    GANs and AC methods cycle

    + +

    The main aim of AC methods is to simultaneously learn an action-value function along with a policy, thereby predicting the reward, while GANs learn to produce more samples of the same type as training data. Both have a feed-forward propagation step where one model controls the agent’s behavior (Actor A) or generates samples (Generator G) and the second evaluates how good the action is (Critic C) or classifies samples as fake or real (Discriminator D). The second model has access to some additional information from the environment - reward in case of AC and real data samples in case of GANs. These similarities suggest that heuristics and optimizations for one can be applied for the other.

    + +

    Illustration of agent-environment setting like a GAN-pipeline

    + +

    The GAN minimax game can be thought of as an agent-environment set up where the actor chooses to set pixels of the image. The environment then stochastically chooses to show a real image and give reward 1 or show the actions and give reward 0. The critic has to predict what the reward is. Here the actor never actually sees the true environment analogous to the generator in GANs where it does not see the real data samples. They rely only on the gradient signal given by the other model. However, this is a sort of unusual setting where the actor does not get to influence the reward, hence making both components adversarial instead of cooperative.

    + +

    GANs in Medical Imaging

    + +

    GANs have received state-of-art performance in many image generation tasks. Their ability to create more data without explicitly learning probability density function has a huge scope in Computer Vision. There are two ways in which GANs can be applied in medical imaging. One is the use of a trained generator model to generate images of various body parts. Other is that the discriminator, trained on normal images can be used as a regularizer or detector for abnormal images. GANs have an edge over traditional ML approaches in medical imaging in terms of cell structure exploration and detecting abnormalities.

    + +

    GANs in Medical Imaging

    + +

    Reconstruction is a major issue in medical imaging. Many times the image and scans obtained might have some noise or blurriness associated with it. This can be due to various reasons like patient comfort, constraints in clinical settings, etc. A pix2pix framework and pre-trained VGG-net have been used to solve the problem but appreciable results are difficult to achieve in case of pumping organs like the heart. The use of CycleGAN has achieved improvement in cardiac CT denoising.

    + +

    GANs have also been used for classification tasks in medicine. The semi-supervised training scheme of GANs for chest abnormality detection and cardiac disease diagnosis has achieved comparable results with the original supervised CNN approach with considerably less labeled data.

    + +

    Liquid Warping GANs

    + +

    Liquid Warping GAN is a unified approach towards Human Motion Imitation, Appearance Transfer, and Novel View Synthesis. These techniques are extremely useful in animation, video and game making, virtual clothes try-on, etc. Previous works separately handled these tasks with specific pipelines. Recently, GANs have proven to be useful in successfully solving all three tasks together. Motion imitation inputs a source image and a reference pose image and outputs the person in the former with a pose in the latter. Appearance Transfer is quite similar to Neural Style Transfer in Computer Vision, where the aim is to produce a human image preserving the reference identity with clothes (style). Novel View Synthesis aims to produce images of the person from different angles and views.

    + +

    Human motion imitation, Appearance transfer, Novel view synthesis

    + +

    As in many Computer Vision applications, traditional methods use 2D landmarking techniques to predict human body structure. However, these can capture only positional details with no modeling of limb rotations and characterization of body shape, which makes the output a bit less realistic. Using Liquid Warping GANs, we can capture the 3D body mesh and simultaneously preserve texture, color, style, and other finer details.

    + +

    The pipeline consists of 3 stages which are same for all the three tasks:

    + +

    Body Mesh recovery

    +

    In this module, the basic body structure, shape and 3D mesh of the person in source and reference images are reconstructed using Human Mesh Recovery (HMR) which involves parsing of the image into a feature vector using ResNet-50 followed by a regression network which predicts pose and shape. A bunch of parameters calculated as a function of pose and shape is passed to the next module in the pipeline.

    + +

    Flow Composition

    +

    This step involves the construction of a map of the source and reference mesh followed by calculating the weighted geometric centroid coordinates of each mesh face. A transformation flow vector T is obtained and warped with the source image to get the warped image.

    + +

    Liquid Warping GAN

    +

    This stage focuses on producing high-fidelity images with desired conditions like style, texture, etc. We use Liquid Warping Block (LWB) to preserve these conditions.

    + +

    Liquid Warping Block

    + +
      +
    • +

      Generator: The generator works as 3 streams. The first stream of GANs works on generating a realistic background image. The second or source identity stream is a convolutional auto-encoder that identifies the source content, extracts the features required to keep the source details and reconstructs the source front image. The third or the transfer stream synthesizes the final result. LWB links the latter two streams. Advantage of using LWB is that it takes care of multiple sources, like in Appearance Transfer, preserving the head of source one and wearing the upper outer garment from the source two, while wearing the lower outer garment from the source three.

      +
    • +
    • +

      Discriminator: For discriminator, a pix2pix model is followed.

      +
    • +
    + +

    References

    +
      +
    1. Generative Adversarial Networks, Ian Goodfellow et al., 2014
    2. +
    3. GAN Tutorial, NIPS 2016
    4. +
    5. Open AI article on Generative Models
    6. +
    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-machine-learning-matters/index.html b/blog/why-machine-learning-matters/index.html new file mode 100644 index 0000000..c202baa --- /dev/null +++ b/blog/why-machine-learning-matters/index.html @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Hello everyone !

    + +

    This article is for people who want a primer on Machine Learning and anyone who is curious about how Machines think.If you are already familiar with ML, this may not be the right place for you.

    + +

    Why Machine Learning matters ?

    +

    Artificial intelligence will shape our future more powerfully than any other innovation this century. +The rate of acceleration is already astounding. After a couple of AI winters and periods of false hope over the past four decades, rapid advances in data storage and computer processing power have dramatically changed the game in recent years.

    + +

    In 2015, Google trained a conversational agent (AI) that could not only convincingly interact with humans as a tech support helpdesk, but also discuss morality, express opinions, and answer general facts-based questions. +The same year, DeepMind developed an agent that surpassed human-level performance at 49 Atari games, receiving only the pixels and game score as inputs. Soon after, in 2016, DeepMind obsoleted their own achievement by releasing a new state-of-the-art gameplay method called A3C.

    + +

    Meanwhile, AlphaGo defeated one of the best human players at Go — an extraordinary achievement in a game dominated by humans for two decades after machines first conquered chess. Many masters could not fathom how it would be possible for a machine to grasp the full nuance and complexity of this ancient Chinese war strategy game, with its 10¹⁷⁰ possible board positions (there are only 10⁸⁰atoms in the universe).

    + +

    Artificial intelligence is the study of agents that perceive the world around them, form plans, and make decisions to achieve their goals. Its foundations include mathematics, logic, philosophy, probability, linguistics, neuroscience, and decision theory. Many fields fall under the umbrella of AI, such as computer vision, robotics, machine learning, and natural language processing.

    + +

    Machine learning is a subfield of artificial intelligence.

    + +

    Image 1

    + +

    Strong AI will change our world forever; to understand how, studying Machine Learning is a good place to start …

    +

    Machine Learning covers a lot

    +

    Machine Learning is self-explanatory. Instead of you telling the machine what decisions and rules to make, you teach it. A machine that learns. So that leaves the methods of teaching and learning pretty wide open. So what can you teach a machine, and what can it learn?

    + +

    Image 2

    + +
    +

    Classification algorithms can be taught to split existing data into classes, like say names of animals.Then when you give it new data, it will tell you which class it belongs to, like say this is a cat and not a dog.

    +
    + +
    +

    Regression algorithms basically try to learn the function of a dataset,by predicting future data based on past data.

    +
    + +
    +

    Unsupervised Learning can be used if you’ve got lots of data and you can’t make sense of it,so you teach the machine to try and make sense of it instead.

    +
    + +
    +

    Reinforcement Learning is how to beat every human on Earth in games like GO and Chess,or drive autonomous cars and drones. And a lot more.

    +
    + +

    So let us talk about Supervised Learning now.

    + +
    +

    How much money will we make by spending more dollars on digital advertising? +Will this loan applicant pay back the loan or not? +What’s going to happen to the stock market tomorrow?

    +
    + +

    In supervised learning problems, we start with a data set containing training examples with associated correct labels. For example, when learning to classify handwritten digits, a supervised learning algorithm takes thousands of pictures of handwritten digits along with labels containing the correct number each image represents. The algorithm will then learn the relationship between the images and their associated numbers, and apply that learned relationship to classify completely new images (without labels) that the machine hasn’t seen before. This is how you’re able to deposit a check by taking a picture with your phone!

    + +

    To illustrate how supervised learning works, let’s examine the problem of predicting annual income based on the number of years of higher education someone has completed. Expressed more formally, we’d like to build a model that approximates the relationship f between the number of years of higher education X and corresponding annual income Y.

    + +

    Image 3

    + +

    X (input) = years of higher education

    + +

    Y (output) = annual income

    + +

    f = function describing the relationship between X and Y

    + +

    ϵ (epsilon) = random error term (positive or negative) with mean zero

    + +

    In supervised learning, the machine attempts to learn the relationship between income and education from scratch, by running labeled training data through a learning algorithm. This learned function can be used to estimate the income of people whose income Y is unknown, as long as we have years of education X as inputs. In other words, we can apply our model to the unlabeled test data to estimate Y.

    + +

    The goal of supervised learning is to predict Y as accurately as possible when given new examples where X is known and Y is unknown.

    + +

    Therefore predicting annual income comes under classic regression problem. Your input data X includes all relevant information about individuals in the data set that can be used to predict income, such as years of education, years of work experience, job title, or zip code. These attributes are called features, which can be numerical (e.g. years of work experience) or categorical (e.g. job title or field of study).

    + +

    You’ll want as many training observations as possible relating these features to the target output Y, so that your model can learn the relationship f between X and Y.

    + +

    The data is split into a training data set and a test data set. The training set has labels, so your model can learn from these labeled examples. The test set does not have labels, i.e. you don’t yet know the value you’re trying to predict. It’s important that your model can generalize to situations it hasn’t encountered before so that it can perform well on the test data.

    + +

    Regression

    + +

    Y = f(X) + ϵ, where X = (x1, x2…xn)

    + +

    Training: machine learns f from labeled training data

    + +

    Test: machine predicts Y from unlabeled testing data

    + +

    IMAGE4

    + +

    So how do we solve these problems?

    + +

    How do we build models that make accurate, useful predictions in the real world? We do so by using supervised learning algorithms. +The above problem of predicting annual income can be solved using Linear regression method and gradient descent algorithm.

    + +

    Do read on supervised learning algorithms for better uderstanding and you can take a well known and free course - MACHINE LEARNING by ANDREW NG on coursera.

    + +

    Feel free to contact me for any queries, complaints or suggestions.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-not-chemical-engineering/index.html b/blog/why-not-chemical-engineering/index.html new file mode 100644 index 0000000..6b69ee7 --- /dev/null +++ b/blog/why-not-chemical-engineering/index.html @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    I don’t know what kind of fascination it is, probably parents sermon their little ones or the Indian school teachers are rather pedagogues, but this one notion of securing admission for undergraduation in a leading institute with specialisation in computer science is considered to be victory. I too was once a prey to this concept. The D-day shattered my dreams and landed me to choose one among the core branches. Hence, by elimination, the same technique one might use in the exams (xD), I chose chemical.

    + +

    Preliminary thoughts: Chemical engineering = Chemistry. Bury myself. Very disinclined to the idea of studying chemistry, infact chemistry is despicable.

    + +

    Society: People are incorrigible, my neighbour even blurted it out unconscionably – “Somehow try to get a branch change to ECE, not much future in chemical you see.” + “Why did you choose chemical of all branches?” +“Oh mechanical? Not for girls, good that you chose chemical.”

    + +

    Now that I’ve chosen my branch turned a deaf ear to people’s prophecies.

    + +

    The present: Absolutely no regrets.

    + +

    Chemical Engineering

    + +

    Chemical engineering infact is a convergence of physics and mathematics. Chemistry is just the basis. A graduate might perform groundbreaking scientific research, work as a field engineer, or occupy a senior management position. Graduates employed by multinational companies often travel all over the world.

    + +

    One aspect that dissuades students is the salary package one receives soon after graduation. One might argue, but salary is a concern. Frankly, I too had similar thoughts. But let me set it right, a chemical engineer requires specific, additional long periods of tireful training pertaining to the needs and type of the company. During the probation periods, one is paid and is also given privilege to a number of benefits, let alone the safety and risk management steps the company considers for you. Hence the difference. As you progress, your pay-scale shoots, probably in 5-10 years of experience.

    + +

    Even those graduates who choose not to accept jobs in industry are highly employable in other areas because they are experienced at solving problems and have good analytical and management skills. Chemical engineering graduates can go on to successful careers in finance, consultancy or scientific journalism, to name but a few.

    + +

    Chemical engineers work to improve the quality of people’s lives. Most items used by people everyday have needed chemical engineers to produce them. Chemical engineers are helping to end starvation, disease and poverty. They are working to save the environment by developing alternative technologies to combat acid rain, lead pollution and the greenhouse effect.

    + +

    Chemical also offers a wide range of areas for specialization. Nanotechnology, petrochemicals, material sciences, colloidal and polymer science, agricultural production, biotechnology, catalysis, electro-mechanical systems, energy, kinetics, modelling and simulation, instrumentation, industrial safety and pollution control, environment, chemical process and plant design, manufacturing………

    + +

    Chemical engineering @NITK

    + +

    The topmost institute for undergraduate studies in chemical engineering among NITs and in the top fifteen in India. These are just the statistics picked up from the internet, what’s more vital is the holistic development as a student as well as expertise in the subject. A well balanced curriculum having both theory and practice, well qualified and friendly faculty have been the hall mark of the department right from its inception. Every faculty will know you inside-out in just one semester! They give good suggestions and always encourage you for your betterment.

    + +

    I opine, given the experience of professors on-site and off-site, their concern towards every student, beyond any doubt should be one of the unparalled options.

    + +

    A considerable amount of PSUs along with private companies do come to pick up eligible students on campus. Over and above, one also has an innumerable opportunities for higher studies in India and abroad. Though these programs are common across other branches as well, the most exhilarating facet is live experimentation and multifaceted instrumentation.

    + +

    Recently, I had been working on self healing materials, as a replacement for muscles in the human body, and for two days I just saw myself enthralled with cutting the material and joining it back again using different crosslinkers. (xD), and it’s not that I have lost my touch with computer science (I once craved for), I model it by coding. See, it’s MULTIFACETED.

    + +

    Ping me for any thoughts and doubts!

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-python-shouldnt-be-your-first-programming-language/index.html b/blog/why-python-shouldnt-be-your-first-programming-language/index.html new file mode 100644 index 0000000..040daf2 --- /dev/null +++ b/blog/why-python-shouldnt-be-your-first-programming-language/index.html @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Python is a programming language that has found its way into practically every field of software development. With its immense collection of openly available libraries, easy to learn syntax, and a plethora of available resources to learn from, both online and offline, the knowledge of Python has become one of the most sought-out skills in the industry. The beauty of the language lies in the ability to perform tasks with simple, readable syntax and lesser code to write.

    + +

    Python Logo

    + +

    All the hype around Python is what attracts a lot of beginners to pick up the language as their first programming language. However, the pythonic way of writing code usually abstracts a lot of essential information about the very basics of programming, which is crucial for beginners to understand. Here’s a few points on why Python shouldn’t be your first programming language:

    + +

    Variables don’t require a type

    + +

    In Python, variables can simply be declared by assigning any value to a variable name of the user’s choice. Under the hood, Python stores all variables, irrespective of its datatype, in the form of objects. The Python interpreter then binds names to these objects. This makes the syntax of declaring variables simpler, but it abstracts the way the data is stored in memory. For example, C programming language gives you the option to define the datatype of the variable you are storing, which allows the user to understand how many bytes of data that specific variable is taking up. This enables users to understand how the data is stored at the bit level. For beginners, understanding how memory allocation works for specific data types can help in building good coding habits.

    + +

    Pointers do not exist

    + +

    Another abstracted feature that deals with memory is pointers. Pointers are invaluable while accessing members of a list-like data structure, creating certain data-structures like linked lists and trees, or passing variables to a function. In Python, there are two types of objects, namely mutable objects that can be changed and immutable objects which cannot be changed. When a function is called with an object as a parameter, mutable objects such as lists or dictionaries are passed by reference, and immutable objects such as strings(str) or integers(int) are passed by value. This does not give the user the ability to choose how to pass variables to functions. This interaction with memory locations, and the user defined dynamic allocation of memory are important concepts to be familiar with in order to create memory efficient programs.

    + +

    Encapsulation isn’t safeguarded

    + +

    Data Encapsulation is one of the key features of object oriented programming. In Python, however, the only encapsulation of features within a class is a convention that is to be upheld (putting underscores before the function name). There is no definition of private and public class members, which means that certain members which should actually be immutable can easily be changed by any function in the program. The concepts behind private, public and protected class members are essential for beginners to fully understand, so that they can properly implement data encapsulation.

    + +

    The speed isn’t real, and errors show up at the last second

    + +

    Python is an interpreted language, and therefore runs much slower than a language like C, which is a compiled language. Due to Python’s interpreted nature, each line of code is executed in succession, which means that if there are any errors in the code it won’t show up until the program executes all the lines of code before the line with the bug. This can be frustrating and discouraging for beginners when they are learning the language.

    + +

    Parallel Processing is not supported

    + +

    CPython, which is the standard implementation of Python, has a feature known as the Global Interpreter Lock (GIL), which essentially locks one flow of execution to hold control of the Python interpreter. This means that two separate flows of execution, more commonly known as threads, cannot be run on the same CPU. Since Python programs run as a single process with a single thread of execution, only one CPU core is used, regardless of the number of cores the CPU contains. This increases the runtime of programs that require heavy CPU computation, when compared to languages which support multithreading.

    + +

    In conclusion, we can all agree that Python has found good use in many fields of computer science, and it is definitely an asset to learn the language in today’s day and age. Nonetheless, a beginner in programming should consider learning a different Object Oriented Programming language like C++ or Java to gain a better grasp on the core concepts of OOPs. Although this is advice from a programming perspective, if the user’s goal is to learn Python only for a specific application like Machine Learning or Data Science, they can go ahead and learn the language to start off.

    + +

    References

    + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-you-need-gpu/index.html b/blog/why-you-need-gpu/index.html new file mode 100644 index 0000000..20a79b7 --- /dev/null +++ b/blog/why-you-need-gpu/index.html @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Why you need GPU

    + +

    You’ve probably wanted to buy a laptop/desktop with a GPU to play those awesome high graphics games that your friends keep talking about, and yes your parents wouldv’e probably said “You’re not going to get that. You need to study now”. But is that all the use there is for a GPU?

    + +

    GPU vs CPU

    + +

    Yeah we all know what they stand for, so let’s skip that and get a little technical.

    + +

    GPUvsCPU

    + +

    To put it in one line, we can say that if the CPU is being used for computations, then the GPU is a computational warehouse. What I mean is that while a normal CPU has 4-16 cores which can each run a few threads at once, a GPU has around 1000-4000 cores with each core capable oh handling a certain number of threads.
    +You might want to take a look at this link if you aren’t sure about what I just said https://www.howtogeek.com/194756/cpu-basics-multiple-cpus-cores-and-hyper-threading-explained/

    + +

    flops

    + +

    Now yes, this means that the graphics in a game will render faster with a GPU than without and everything appears fast and smooth, but it also has other implications. It literally means that the GPU can process more infomation that a CPU in the same time.

    + +

    Now does this mean that a GPU is the same as many CPUs put together? This will answer your doubt
    +https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu/
    +which brings us to the point of this article - GPU computing

    + +

    GPU Computing

    + +

    Now how a GPU can process more information per second might be a doubt to few of you. It is all because of the concept of parallelism. With so many cores in a GPU and with each core capable of running numerous threads, each thread runs parallely and is independent of the other. To understand the significance of this, let us take the example of running errands. Let us say we have 10 items to buy and each item is available in a different store. The CPU version of running these errands would be that a single person would go to each of the stores one by one and buy all the required items whereas the GPU version would be that there are ten people and each person would go to a store and buy the item. Get the idea?

    + +

    A simple practical problem where this can be used is calculating the sum of two large arrays. We can have the CPU compute the sum of respective array elements one by one or we can make the GPU compute the sum of the elements parallelly. Yes GPU can make executing a lot more efficient in some cases and in some, the presence of the GPU makes no difference (as in suppose the same store had all 10 items).

    + +

    A major practical applications some of you might come across is using GPU for training neural networks

    + +

    waiting for my neural network to train

    + +

    Yeah we’re gonna use GPUs for this.

    + +

    The end goal of all of this is to get high performance and for that, NVIDIA provides a parallel programming or heterogenous computing model called CUDA which help developers create more efficient applications or achieve high performance in their task.

    + +

    Also, note that this doesn’t mean everything can be made better with a GPU. Considering different factors such as cost, increase in performance as compared to CPUs, sometimes GPUs are not a good idea. So I hope that you have a better understanding of GPUs now and that gaming isn’t the only thing that comes to your mind when you hear GPU.

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/why-you-should-learn-flutter/index.html b/blog/why-you-should-learn-flutter/index.html new file mode 100644 index 0000000..e952d04 --- /dev/null +++ b/blog/why-you-should-learn-flutter/index.html @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    What is Flutter?

    + +

    Flutter is an open-source Mobile Application Development SDK launched by Google back in May 2017. It is used to create apps for both Android and iOS Operating Systems. It is also the primary method of developing applications for Google Fuchsia. Flutter 1.0 was announced on December 4th, 2018 at Flutter Live.

    + +

    Why Flutter?

    + +

    Incredibly easy to setup and get started! - Download the Flutter SDK from the official website. Extract it and add the flutter sdk path to your PATH variable. Download the Flutter plugin in your favourite editor / IDE and you’re good to go. It’s that simple!

    + +

    Flutter provides great tooling support - Flutter development is supported on major IDEs like Android Studio, IntelliJ IDEA and VS Code so development is going to feel right at home.

    + +

    Flutter ❤️ Dart - Dart is a programming language developed by Google which is very easy to pickup if you know JavaScript or Java. So native Android and react-native developers can learn Flutter easily.

    + +

    Hot Reload - Unlike Instant Run in Android Studio (which never works!) Flutter has sub-second stateful hot reload. With stateful hot reload, you can make changes to the code of your app and see the results instantly without restarting your app or losing its state. This improves the development experience.

    + +

    Hot reload in action

    + +

    Documentation - Flutter is documented very well which makes app development process easy and productive (one click away!).

    + +

    Large number of widgets - Flutter provides rich set of beautiful, customisable Material Design and Cupertino (iOS-style) widgets which makes it very easy to build beautiful UIs.

    + +

    Develop for Android as well as iOS - Flutter is compiled into native ARM code for both Android and iOS. So you can serve both the platforms with a single codebase. This is beneficial for companies which have small teams and need to cater to users of both platforms.

    + +

    Flutter app on Android as well as iOS

    + +

    Open sourced - Flutter is open-sourced and has a great community which strives to make it better and it’s backed by Google.

    + +

    Early adoption by various enterprises - Alibaba made use of Flutter to build Xianyu app. Google themselves use Flutter to develop the Google Ads app. Similarly many enterprises have started to use Flutter to develop their apps even though Flutter hit 1.0 very recently. This clearly shows that Flutter has lot of potential and will be the next leading framework in mobile development.

    + +

    How is Flutter different?

    + +
      +
    • Hot reload is one of the most popular features of Flutter. In Android significant time is spent to build the app then navigate to the activity which had a bug and try to fix it but in Flutter you can quickly iterate on a screen deeply nested in your app, without starting from the home screen after every reload.
    • +
    • Flutter does its own rendering using Skia. It doesn’t rely on native views which are often not powerful and fast enough. It paints every pixel on screen. This means that your UI can be written once and shared across iOS and Android and it will look identical in both platforms unless you want it to be different.
    • +
    • Flutter makes use of reactive views like react-native but without the JavaScript bridge.
    • +
    • Flutter uses composition. As a result it’s very easy to build custom Widgets. In Android (which uses inheritance to build UI components), if you nest a lot of UI components then you can run into performance issues really quickly but we don’t have that problem in Flutter.
    • +
    • Flutter compiles to native ARM code on both Android and iOS so the apps built using Flutter have absolutely no performance issues. Flutter has 60fps animations and can also handle 120fps provided the device is capable of 120Hz updates which clearly shows that apps built using Flutter are performance-driven.
    • +
    + +

    Future of Flutter?

    + +

    Google plans to update the ‘stable’ channel of Flutter on a quaterly basis. Apart from the obvious support for iOS and Android devices Google is planning to release Flutter for web and the project is called Hummingbird, which takes support from the Dart platform for compiling it with ARM code and JavaScript. It allows Flutter to operate on Standard web apps without any changes.

    + +

    Google has also started to work on Flutter Desktop Embedding, which is still in its early days. With this project, Google intends to introduce Flutter in the world of desktop Operating Systems along with Windows, MacOS, and Linux.

    + +

    Google also published an informal guideline on how to use Flutter on Raspberry Pi to show that Flutter can be embedded into smaller-scale devices.

    + +

    Conclusion

    + +

    Flutter is designed to be fast, productive and beautiful. It bridges the gap between iOS and Android. It bridges the gap between developers and designers and helps them build beautiful, functional, productive apps. Often new technologies are not adopted by enterprises which makes the developers think twice before learning but this is not the case with Flutter. Alibaba adopted Flutter when it was in beta. So clearly enterprises are interested in this framework. Moreover, Flutter is the primary way of developing apps for Google Fuchsia which gives more incentive to learn it. Flutter makes mobile development fun!

    + + + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/wireless-power-transmission/index.html b/blog/wireless-power-transmission/index.html new file mode 100644 index 0000000..3137f6a --- /dev/null +++ b/blog/wireless-power-transmission/index.html @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    We cannot imagine the world without electric power. Generally power is transmitted through wires, however there is an idea to eradicate the hazardous usage of electrical wires which involves a lot of confusion particularly in organizing them. Some of these devices might not even need their bulky batteries to operate.

    + +

    Here are the techniques of transmitting power without using wires with an efficiency of about 95% with non-radiative methods, due to which it does not affect the environment.

    + +

    In any system of coupled resonators there often exists a so-called “strongly coupled” regime of operation. If one ensures to operate in that regime in a given system, the energy transfer can be very efficient. Scientists have tried to develop methods of wireless power transmission that could cut the clutter or lead to clean sources of electricity.

    + +

    The attempt to transmit power wirelessly is not new. A revolutionary attempt towards this was made by Nikola Tesla by inventing the wonder of physics, The Tesla Coil, was built with an aim to provide electricity without wires but it failed miserably due to many drawbacks which made it highly uneconomical.

    + +

    Quick Physics: The Tesla coil creates an electric field that pushes electrons through the light bulb. This is the same way the lights in your house work, except in your house, the electricty comes through a wire instead of through the air.

    + +

    A Tesla coil makes electricity, which is basically flow of charges. If a fluorescent light bulb is held near the coil, the electricity will then go through the light bulb to the ground, which makes it light up.

    + +

    The modern Techniques developed so far

    + +

    Short distance induction

    + +

    These methods can reach at most a few centimetres. The action of an electrical transformer is the simplest instance of wireless energy transfer. The primary and secondary circuits of a transformer are electrically isolated from each other. The transfer of energy takes place by electromagnetic coupling through a process known as mutual induction. This method is known as inductive coupling.

    + +

    Moderate distance

    + +

    Since a magnetic field spreads in all directions, making a larger one would waste a lot of energy. An efficient way to transfer power between coils separated by a few meters is that we extend the distance between the coils by adding resonance to the equation, i.e. the frequency at which an object naturally vibrates. It’s easy to get objects to vibrate at their resonant frequency. This process is known as Resonant inductive coupling

    + +

    Long-distance Wireless Power

    + +

    The secret to the SHARP’s(the unmanned plane’s) long flight time was a large, ground-based microwave transmitter. The SHARP’s circular flight path kept it in range of this transmitter. A large, disc-shaped rectifying antenna, or rectenna, just behind the plane’s wings changed the microwave energy from the transmitter into direct-current (DC) electricity. Because of the microwaves’ interaction with the rectenna, the SHARP had a constant power supply as long as it was in range of a functioning microwave array.

    + +

    Conclusion

    + +

    The crucial advantage of using the non-radiative field lies in the fact that most of the power is not picked up by the receiving coil, remains bound to the vicinity of the sending unit, instead of being radiated into the environment and lost. With such a design, power transfer for laptop-sized coils are more than sufficient to run a laptop that can be transferred over room-sized distances nearly omni-directionally and efficiently, irrespective of the geometry of the surrounding space, even when environmental objects completely obstruct the line-of-sight between the two coils. As long as the laptop is in a room equipped with a source of such wireless power, it would charge automatically, without having to be plugged in. In fact, it would not even need a battery to operate inside of such a room.

    + +

    Resources

    + +

    Wireless Power Transmission: An Innovative Idea

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/you-dont-really-know-arduino/index.html b/blog/you-dont-really-know-arduino/index.html new file mode 100644 index 0000000..b6e9534 --- /dev/null +++ b/blog/you-dont-really-know-arduino/index.html @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Is he kiddin? Well I am not (just be patient enough to reach the end). Arduino is a very good platform to start making witty electronics projects instead of dumb L.E.D blinking circuits (apologies to the 555) but after some time electronic hobbyists loose interest due to one or more of the following reasons:

    +
      +
    • It is too simple
    • +
    • It’s performance is limited
    • +
    • It does not feels like embedded programming
    • +
    • There is a library for literally everything (sounds like an advantage?)
    • +
    + +

    Well the amount of abstraction Arduino offers hides vital details of the micro-controller that powers the board. “It Kills the Spirit of Embedded Programming.” And thus people tend to move over to MSP430 and PIC development boards without appreciating the power of AVR controllers (Yup it’s the family of controllers that power Arduino UNO, Mega, Nano, Mini and Duemilanove). And while people do use ATMEL’s (now owned by Microchip) AVR Studio to program these boards, it’s yet another IDE meant only for AVRs. Arduino on the other hand with proper libraries and compiler integration acts as a standalone IDE for micro-controllers by different manufacturers like the popular ESP8266. Arduino does have advantages over its primitive alternatives.

    + +

    What’s my point then?

    + +

    My point is that Arduino is good for building projects quickly and hassle-free but it does not let’s the user learn the details of the micro-controller. The user friedly libraries are not so learner friendly because they make you lazy. Every one using Arduino be like “hmmm so I need to control a servo(or anything) well I can use timers in arduino but wait…

    + +
    #include <servo.h> 
    +
    +

    Done!

    + +

    So to learn Arduino one needs to stop using the user-friendly abstract fuctions of Arduino and get down a level deeper into the realm of Embedded C coding. And to one’s comfort Arduino IDE supports it out of the box. (right after installation?)

    + +

    The conservative face of Arduino

    + +

    Not many people might know but Arduino is backward compatible. For those who do not come from programming background (like myself) backward compatibility means support for primitive functions on which the newer abstract functions are based. For example the function cout and cin in C++ are the abstract functions while scanf and printf are the primitive ones. C++ however supports both so if performance is a major concern using printf (which is faster) instead of cout might save you a couple of micro-seconds. The analogy in embedded implies that instead of digitalWrite(8,HIGH), PORTB = 0b00000001 will do the exact same thing but a lot faster.

    + +

    Another example is the widely used analogWrite() function in arduino that outputs a PWM signal with a rather low frequency of 980 Hz and 490 Hz which might be slow depending on the application. In such a case instead of using the rather good looking analogWrite(), set the clocks to the counter units manually to achieve frequencies as high as 200KHz. All this might sound very simple to a person with a lot of experience programming micro-controllers but where does a noob starts from? Don’t worry, I got your back.

    + +

    How and where to begin?

    + +

    To start off how about reading some theory on the architecture? Sounds very interesting right? Well yeah it might not be the most entertaining part but it is indeed an essential part (especially the register view of peripherals). A basic image of the architecture in mind allows the programmer to use architectural exploits to make the code run faster.

    + +
      +
    • +

      Quality tutorials can be found on avr-tutorials with examples. Added bonus is their assembly equivalent for every line of C code.

      +
    • +
    • +

      Ever feel lost? All good projects are complimented with ever helping communities. People at AVRfreaks will be glad to help you.

      +
    • +
    • +

      Although there will be examples on internet explaining how to manipulate registers to do certain tasks (like setting up ADC) it is recommended to figure that out using the data sheet of the micro-controller used in Arduino.

      +
    • +
    + +

    An Example

    +

    Enough with the blabbering, lets look at a simple example.

    + +
    #define BLINK_DELAY_MS 1000
    +void setup()
    +{
    + //set pin 5 of PORTB to output
    + DDRB |= _BV(DDB5);
    + }
    + 
    +void loop()
    +{
    +  //set pin 5 high to turn led on
    +  PORTB |= _BV(PORTB5);
    +  _delay_ms(BLINK_DELAY_MS);
    +  //set pin 5 low to turn led off
    +  PORTB &= ~_BV(PORTB5);
    +  _delay_ms(BLINK_DELAY_MS);
    +}
    +
    + +

    If you copy-paste the above code to Arduino IDE and upload it, it will mimic the classic Blink LED code. The catch is that the built in Blink example takes 928 bytes of program memory while the above code takes just 486 bytes. (Almost half the space!)

    + +

    ATmega 328P pinmapping to Arduino UNO Pins

    + +

    Comparison of performance

    + +

    Still not convinced about the boost in performance possible by coding using primitive methods? Julian Ilett did a nice comparison video so you might want to check that out.

    + +

    If you think that speed and space is the only argument then let me include power considerations. AVR micro-controllers come with a bunch of peripherals that may or maynot be used by your code. In a scenario where the entire setup runs on a battery you might want to shut down unused peripherals (like ADC or counter units) to save power and increase the running time. Kevin Darrah’s video will help you appreciate the power saver modes the micro-controller offers.

    + +

    On the already fantastic recipe of Arduino the icing is yet to come. You can code the blocks that need to be fast for your project using primitive C codes and still use the abstract arduino functions for the less time critical part of the code. For example, If you are working on a fast multiplexing application like an LED cube where data is sent to Arduino from PC, you would want to make sure that multiplexing is done at a very high speed (enough to fool human eyes at least) whereas you can still use the Serial.read() function to fetch data over serial port.

    + +
    +

    A word of advice: While programming in such a mixed style make sure the code doesn’t create conflicts with itself (like trying digitalWrite() on a pin which is configured to read analog values).

    +
    + +

    Ready, Steady, Go!

    + +

    Congratulations if you made it till the end of this blog. Hopefully your arduino sketches are more optimized and gives you that sense of pride. Now what are you waiting for? Find your arduino and maybe make an 8x8x8 multiplexed L.E.D cube or something!

    + +

    Credits AVRfreaks

    + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file diff --git a/blog/zero-knowledge-proof/index.html b/blog/zero-knowledge-proof/index.html new file mode 100644 index 0000000..9bee54d --- /dev/null +++ b/blog/zero-knowledge-proof/index.html @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog | IEEE NITK + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +

    Introduction

    + +

    Introduction

    + +

    In cryptography, zero knowledge proof or zero knowledge protocol is a method by which one party proves to another party that they know some kind of secret without revealing any information about the secret, except the fact that they know it. This principle is based on an algorithm that takes some data as input and returns either true or false.

    + +

    Understanding the concept behind ZKPs

    +

    The complexity of zero-knowledge proofs results in them typically being described with abstract examples, which elucidate the concept well.

    + +

    Example 1:

    + +

    Suppose there is an underground cave with a door at the end of the cave that can only be opened with a magic word. Alice claims that she knows the word and that she can open the door. At the beginning, Alice and Bob are standing at the entrance (point P). Alice enters the cave and reaches a fork (point Q). Bob cannot see Alice from the entrance and the game starts:

    + +
      +
    • Alice chooses to go either right or left
    • +
    • After Alice disappears into the cave, Bob comes to the fork
    • +
    • Bob asks Alice to come up from either the right or left
    • +
    • If Alice knows the magic word, she can come up from the requested +side. She may have to use the magic word (if she’s on the wrong side) +or she can just come up without using the magic word (if she is at +the right side). So, Alice may come up from the correct side even if +she does not know the magic word by guessing Bob’s challenge with a +probability of ½. +Underground Cave +When this is repeated multiple times the probability that Alice comes up the right side without knowing the magic word reduces to (½)N where N is the number of times the test is run.
    • +
    + +

    Example 2:

    + +

    Let us assume there is a colour-blind person and two balls, one red and one green. You would like to prove to the colour-blind person that these balls are of differing colours without revealing the individual colours of each ball. For this, you ask the colour-blind person to hide both balls under the table and bring one ball back up for you to see. After that, he should hide the ball back under the table and then either show the same ball or the other one. As a result, you can prove to the colour-blind person that the colours are different by stating whether he changed the balls under the table or not.

    + +

    Obviously, the other person might think that you were just lucky and is not yet completely convinced that both balls have different colours. Zero-knowledge proofs solve this problem by repeating the experiment over and over again. After every round, your chance of being consistently right by pure luck goes down by half.

    + +

    So by repeating this experiment N times, the probability that you guessed right every time, when the balls were truly identical, reduces to (½)N , which is very unlikely.

    + +

    Why are Zero Knowledge Proofs required?

    + +

    Enterprise businesses would not like to share their proprietary information which can get into the hands of hackers or their competitors. Businesses also want to ensure that the information is securely delivered to the intended party. Ordinary blockchains can accomplish this, but with Zero Knowledge Proofs, businesses can share proofs about the data without sharing the data itself.

    + +

    ZKP can impact any industry which involves transactions, identity systems, and other proprietary information. ZKP can be used as a diligence, security, and verification tool in some of the most highly regulated industries like financial services, insurance, audit firms, and retail just to name a few.

    + +

    A few start-ups and enterprises like ZCash, QED-it, ING and Nuggets use ZKP as a part of their blockchain applications. Blockchain provides a decentralized database, or digital ledger, of transactions that everyone on the network can see. This network is essentially a chain of computers which must all approve an exchange before it can be verified and recorded.

    + +

    Zero-knowledge Proof enables the transfer of assets across this distributed, peer-to-peer blockchain network with complete privacy. In regular blockchain transactions, when an asset is sent from one party to another, the details of that transaction are visible to every other party in the network. However, in a zero-knowledge transaction, the others only know that a valid transaction has taken place, but nothing about the sender, recipient, asset class and quantity. The identity and amount being spent can remain hidden.

    + +

    Applications

    + +

    Conclusion

    + +

    Zero Knowledge Proofs are computationally expensive. Although ZKP technology has been around for decades, it has started gaining importance now. The ability to verify sensitive information like the amount of a transaction, passwords and other identifiable data without actually revealing the data has become more valuable for everyone with the rising presence of bad actors. I believe that this technology will be used extensively in solving privacy problems in the near future.

    + +

    References

    + + + + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + + + +
    + +
    + + +
    +
    + + + + \ No newline at end of file