Iran scales back nuclear deal commitments as US imposes sanctions
by EuronewsIran launched a new array of 30 advanced centrifuges on Monday, the country's nuclear chief Ali Akbar Salehi told state television in a move that further scaled back Tehran's commitments under the 2015 nuclear deal.
Salehi, the head of Iran's nuclear energy organisation, said the move showed Iran's "capacity and determination".
Salehi appeared to call out the United States while announcing the centrifuges:
"We have to thank our enemies for creating an opportunity for the Islamic Republic of Iran, especially in the nuclear technology industry, to show how we could obtain such an achievement...in such a short time," he said.
Meanwhile, the US Treasury Department announced that they would impose sanctions on nine people connected to Supreme Leader Ali Khamenei.
"This action seeks to block funds from flowing to a shadow network of Ali Khamenei’s military and foreign affairs advisors who have for decades oppressed the Iranian people, exported terrorism, and advanced destabilizing policies around the world," the US treasury department said in a statement.
The actions came on the 40th anniversary of Iranian students' takeover of the U.S. embassy in Tehran when over 50 US diplomats were held hostage for 444 days.
The United States withdrew from the Iran Nuclear Deal last year whereas the European Union has been trying to salvage the deal, maintaining that it is important for security in the region and abroad.
Iran has responded by gradually scaling back its commitments under the agreement.
"Every time Iran makes one of these announcements, it’s nibbling away at that deal and getting closer and closer to having enough material for a nuclear bomb," Richard Johnson from the Nuclear Threat Initiative (NTI) in Washington DC told Euronews.
But Johnson said, the Iranians are still allowing the International Atomic Energy Agency to continue their inspection work, and the steps they are taking in nuclear research are "calibrated and deliberate" meaning they could be reversed in the future.
Watch the Euronews Tonight report in the video player above.


| Package | Description |
|---|---|
| com.khizarms.diygarage.controller | |
| com.khizarms.diygarage.model.dao | |
| com.khizarms.diygarage.model.pojo | |
| com.khizarms.diygarage.view | |
| com.khizarms.diygarage.viewmodel |
| Modifier and Type | Method and Description |
|---|---|
static EditActionFragment
|
EditActionFragment.newInstance(Action action)
New instance edit action fragment.
|
void |
ServiceListActivity.save(Action action)
|
void |
ServiceDetailActivity.save(Action action)
|
void |
EditActionFragment.ActionSaver.save(Action action)
Save.
|
| Modifier and Type | Method and Description |
|---|---|
LiveData<List<Action>>
|
ActionDao.getServiceActions(long serviceId)
Gets service actions.
|
| Modifier and Type | Method and Description |
|---|---|
int |
ActionDao.delete(Action... actions)
Delete int.
|
long |
ActionDao.insert(Action action)
Insert long.
|
int |
ActionDao.update(Action... actions)
Update int.
|
| Modifier and Type | Method and Description |
|---|---|
List<Long> |
ActionDao.insert(Collection<Action> actions)
Insert list.
|
| Modifier and Type | Method and Description |
|---|---|
List<Action> |
ServiceWithActions.getActions()
|
| Modifier and Type | Method and Description |
|---|---|
void |
ServiceWithActions.setActions(List<Action> actions)
|
| Constructor and Description |
|---|
ActionRecyclerAdapter(Context context,
View.OnClickListener listener,
List<Action> actions)
Instantiates a new Action recycler adapter.
|
| Modifier and Type | Method and Description |
|---|---|
LiveData<List<Action>>
|
EditActionViewModel.getActions()
Gets actions.
|
| Modifier and Type | Method and Description |
|---|---|
void |
ServiceDetailViewModel.saveAction(Action action)
Save action.
|
void |
ServiceListViewModel.saveAction(Action action)
Save action.
|


Please Click The Icon Next To File Name To Download
Company Purchase Order
- Ashenberg Law Purchase Order
- Athena Education Purchase Order
- Discover Melody Purchase Order
- MyJobTank Purchase Order
- NYO China Purchase Order
- WL Global Corp Purchase Order
- Wailian Education Purchase Order
- YES Foundation Purchase Order
Kyocera Printer Driver and Instruction
- Please click this LINK to find and download the proper driver for your computer's operating system.
- Kyocera Printer Installation Instruction (Windows & MacOS)


Project Description
A Simple Rich Text File (RTF) Editor that almost always does what it says on the tin. But like a bad puppy it sometimes pees on the carpet. Bad puppy.
General.
This is a learning project for me. I use it to improve my knowledge of C#, which I have been learning over the last year.


Hooting Yard's anagrammatist-in-chief, R., has alerted me to Joel Stickley's How To Write Badly Well blog. A cursory examination suggests I can pick up some very useful tips there. This, for example, entitled “Present your research in the form of dialogue”, is brilliant:
‘My god,’ said Geoff, ‘so it's true. We hold in our very hands the original draft of the hitherto unknown third treaty of the 1648 Peace of Westphalia signed by the Holy Roman Emperor Ferdinand III himself.’
‘Yes,’ confirmed Sally. ‘Who would have thought when we set off this morning for this remote Swiss village that we would end the day in possession of the very document which marked the birth of modern European statehood?’
‘Certainly not me!’ laughed Geoff.
'Nor me!’ guffawed Sally.
‘And to think,’ Geoff extemporised, ‘the Ratification of the Treaty of Münster occurred exactly three hundred and sixty-one years ago today!’
 There is much else there to split your sides to, so go and visit. It may keep you all occupied while I am away. Yes, Mr Key, the so-called “Diogenesian recluse” (© Chris Cutler) will shortly be venturing abroad for a spell, during which postages here will be sparse. More details later, when I have packed my rucksack haversack knapsack pippy bag…


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object com.hp.hpl.jena.reasoner.dig.DIGReasonerFactory
public class DIGReasonerFactory
Factory class for generating instances of DIG reasoners. Implements singleton pattern.
| Field Summary | |
|---|---|
static java.lang.String |
DEFAULT_DAML_AXIOMS
Default axioms location for the DAML variant DIG reasoner |
static java.lang.String |
DEFAULT_OWL_AXIOMS
Default axioms location for the OWL variant DIG reasoner |
static java.lang.String |
URI
Static URI for this reasoner type |
| Method Summary | |
|---|---|
Reasoner |
create(Resource configuration)
Answer a new DIG reasoner instance, optionally configured with the given configuration resource. |
DIGReasoner |
create(Resource language,
java.lang.String axiomsURL,
Resource configuration)
Create a DIG reasoner with the given ontology language, axioms and configuration. |
Reasoner |
createWithDAMLAxioms(Resource configuration)
Answer a new DIG reasoner instance (optionally configured with the given configuration resource) that is pre-loaded with the axioms pertaining to the DAML language. |
Reasoner |
createWithOWLAxioms(Resource configuration)
Answer a new DIG reasoner instance (optionally configured with the given configuration resource) that is pre-loaded with the axioms pertaining to the OWL language. |
Model |
getCapabilities()
Return a description of the capabilities of this reasoner encoded in RDF. |
java.lang.String |
getURI()
Answer the URI of this reasoner factory |
static DIGReasonerFactory |
theInstance()
Answer the singleton instance of the factory. |
| Methods inherited from class java.lang.Object |
|---|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
public static final java.lang.String URI
public static final java.lang.String DEFAULT_OWL_AXIOMS
public static final java.lang.String DEFAULT_DAML_AXIOMS
| Method Detail |
|---|
public static DIGReasonerFactory theInstance()
Answer the singleton instance of the factory.
public Reasoner create(Resource configuration)
Answer a new DIG reasoner instance, optionally configured with the given configuration resource.
create
in interface ReasonerFactory
configuration
- A resource whose properties denote the configuration of
the reasoner instance, or null to rely on the default configuration.public Reasoner createWithDAMLAxioms(Resource configuration)
Answer a new DIG reasoner instance (optionally configured with the given configuration resource) that is pre-loaded with the axioms pertaining to the DAML language.
configuration
- A resource whose properties denote the configuration of
the reasoner instance, or null to rely on the default configuration.public Reasoner createWithOWLAxioms(Resource configuration)
Answer a new DIG reasoner instance (optionally configured with the given configuration resource) that is pre-loaded with the axioms pertaining to the OWL language.
configuration
- A resource whose properties denote the configuration of
the reasoner instance, or null to rely on the default configuration.public DIGReasoner create(Resource language, java.lang.String axiomsURL, Resource configuration)
Create a DIG reasoner with the given ontology language, axioms and configuration.
language
- The URI of the ontology lanuage (owl or daml), or nullaxiomsURL
- The URL of the axioms to load, or nullconfiguration
- The root of the configuration options for the model, or null
public Model getCapabilities()
ReasonerFactory
getCapabilities
in interface ReasonerFactory
public java.lang.String getURI()
Answer the URI of this reasoner factory
getURI
in interface ReasonerFactory
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


Hike on a Graph
问题描述 :
"Hike on a Graph" is a game that is played on a board on which an undirected graph is drawn. The graph is complete and has all loops, i.e. for any two locations there is exactly one arrow between them. The arrows are coloured. There are three players, and each of them has a piece. At the beginning of the game, the three pieces are in fixed locations on the graph. In turn, the players may do a move. A move consists of moving one’s own piece along an arrow to a new location on the board. The following constraint is imposed on this: the piece may only be moved along arrows of the same colour as the arrow between the two opponents’ pieces.
In the sixties ("make love not war") a one-person variant of the game emerged. In this variant one person moves all the three pieces, not necessarily one after the other, but of course only one at a time. Goal of this game is to get all pieces onto the same location, using as few moves as possible. Find out the smallest number of moves that is necessary to get all three pieces onto the same location, for a given board layout and starting positions.
输入:
The input file contains several test cases. Each test case starts with the number n. Input is terminated by n=0. Otherwise, 1<=n<=50. Then follow three integers p1, p2, p3 with 1<=pi<=n denoting the starting locations of the game pieces. The colours of the arrows are given next as a m×m matrix of whitespace-separated lower-case letters. The element mij denotes the colour of the arrow between the locations i and j. Since the graph is undirected, you can assume the matrix to be symmetrical.
输出:
For each test case output on a single line the minimum number of moves required to get all three pieces onto the same location, or the word "impossible" if that is not possible for the given board and starting locations.
样例输入:
3 1 2 3 r b r b b b r b r 2 1 2 2 y g g y 0
样例输出:
2 impossible
这道题主要是要看懂这句话
the piece may only be moved along arrows of the same colour as the arrow between the two opponents’ pieces
意思是说 有3个小块 小块1想移动到小块2 去的条件是 1->2中路线的颜色和2<->3的颜色相同
理解了就好做了 普通的广搜，单步调试得我很郁闷，坑爹啊！
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<iostream> #include<string.h> #include<algorithm> #include<queue> #include<vector> #include<map> #include<string> #define inf 0x7fffffff #define maxn 60 using namespace std; char maze[maxn][maxn]; int vis[maxn][maxn][maxn]; int n,a,b,c; struct node { int x,y,z; }; int bfs() { queue<node> q; while(!q.empty()) q.pop(); memset(vis,0,sizeof(vis)); node s; s.x=a,s.y=b,s.z=c; vis[a][b][c]=1; q.push(s); node cur,next; while(!q.empty()) { cur=q.front(); q.pop(); if(cur.x==cur.y&&cur.y==cur.z) return vis[cur.x][cur.y][cur.z]-1; for(int i=1;i<=n;i++) { if(maze[cur.x][cur.y]==maze[cur.z][i]&&!vis[cur.x][cur.y][i]) { vis[cur.x][cur.y][i]=vis[cur.x][cur.y][cur.z]+1; next.x=cur.x,next.y=cur.y,next.z=i; q.push(next); } if(maze[cur.z][cur.x]==maze[cur.y][i]&&!vis[cur.x][i][cur.z]) { vis[cur.x][i][cur.z]=vis[cur.x][cur.y][cur.z]+1; next.x=cur.x,next.y=i,next.z=cur.z; q.push(next); } if(maze[cur.y][cur.z]==maze[cur.x][i]&&!vis[i][cur.y][cur.z]) { vis[i][cur.x][cur.y]=vis[cur.x][cur.y][cur.z]+1; next.x=i,next.y=cur.y,next.z=cur.z; q.push(next); } } } return -1; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d",&n)==1&&n) { scanf("%d%d%d",&a,&b,&c); getchar(); int i,j; char ch; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%c%c",&maze[i][j],&ch); } } int ans=bfs(); if(ans!=-1) printf("%d\n",ans); else printf("impossible\n"); } return 0; }
(adsbygoogle = window.adsbygoogle || []).push({});
递归实现的代码部分
14句和18句的 wt[n - 1]是不是应该改为 wt[ n ] ?
这道题目的核心一句话是：取还是不取。
如果当前取，则index+1作为参数。如果当前不取，则任用index作为参数。
想问下computeLSPArray那里，if(len!=0) len=lps[len-1]是什么意思
妈呀！这个Dijkstra模板好长OwQ！
因为要修改链表头(指针)，所以要用指针的指针


Gitflow Workflow
The Gitflow Workflow defines a strict branching model designed around the project release. This provides a robust framework for managing larger projects. Gitflow is ideally suited for projects that have a scheduled release cycle.
Getting Started
Gitflow is really just an abstract idea of a Git workflow. This means it dictates what kind of branches to set up and how to merge them together. We will touch on the purposes of the branches below. After installing git-flow you can use it in your project by executing git flow init. Git-flow is a wrapper around Git. The git flow init command is an extension of the default git init command and doesn't change anything in your repository other than creating branches for you.
How it works
Develop and Master Branches
Instead of a single master branch, this workflow uses two branches to record the history of the project. The master branch stores the official release history, and the develop branch serves as an integration branch for features. It's also convenient to tag all commits in the master branch with a version number.
The first step is to complement the default master with a develop branch. A simple way to do this is for one developer to create an empty develop branch locally and push it to the server:
> git branch develop
> git push -u origin develop
This branch will contain the complete history of the project, whereas master will contain an abridged version. Other developers should now clone the central repository and create a tracking branch for develop.
When using the git-flow extension library, executing git flow init on an existing repo will create the develop branch:
> $ git flow init
> Initialized empty Git repository in ~/project/.git/
> No branches exist yet. Base branches must be created now.
> Branch name for production releases: [master]
> Branch name for "next release" development: [develop]
> How to name your supporting branch prefixes?
> Feature branches? [feature/]
> Release branches? [release/]
> Hotfix branches? [hotfix/]
> Support branches? [support/]
> Version tag prefix? []
> $ git branch
> * develop
> master
Feature Branches
Each new feature should reside in its own branch, which can be pushed to the central repository for backup/collaboration. But, instead of branching off of master, feature branches use develop as their parent branch. When a feature is complete, it gets merged back into develop. Features should never interact directly with master.
Note that feature branches combined with the develop branch is, for all intents and purposes, the Feature Branch Workflow. But, the Gitflow Workflow doesn’t stop there.
Feature branches are generally created off to the latest develop branch.
Creating a feature branch
Without the git-flow extensions:
> git checkout develop
> git checkout -b feature_branch
When using the git-flow extension:
> git flow feature start feature_branch
Continue your work and use Git like you normally would.
Finishing a feature branch
When you’re done with the development work on the feature, the next step is to merge the feature_branch into develop.
Without the git-flow extensions:
> git checkout develop
> git merge feature_branch
Using the git-flow extensions:
> git flow feature finish feature_branch
Once develop has acquired enough features for a release (or a predetermined release date is approaching), you fork a release branch off of develop. Creating this branch starts the next release cycle, so no new features can be added after this point—only bug fixes, documentation generation, and other release-oriented tasks should go in this branch. Once it's ready to ship, the release branch gets merged into master and tagged with a version number. In addition, it should be merged back into develop, which may have progressed since the release was initiated.
Using a dedicated branch to prepare releases makes it possible for one team to polish the current release while another team continues working on features for the next release. It also creates well-defined phases of development (e.g., it's easy to say, “This week we're preparing for version 4.0,” and to actually see it in the structure of the repository).
Making release branches is another straightforward branching operation. Like feature branches, release branches are based on the develop branch. A new release branch can be created using the following methods.
Without the git-flow extensions:
> git checkout develop
> git checkout -b release/0.1.0
When using the git-flow extensions:
> $ git flow release start 0.1.0
> Switched to a new branch 'release/0.1.0'
Once the release is ready to ship, it will get merged it into master and develop, then the release branch will be deleted. It’s important to merge back into develop because critical updates may have been added to the release branch and they need to be accessible to new features. If your organization stresses code review, this would be an ideal place for a pull request.
To finish a release branch, use the following methods:
Without the git-flow extensions:
> git checkout master
> git merge release/0.1.0
Or with the git-flow extension:
> git flow release finish '0.1.0'
Hotfix Branches
Maintenance or “hotfix” branches are used to quickly patch production releases. Hotfix branches are a lot like release branches and feature branches except they're based on master instead of develop. This is the only branch that should fork directly off of master. As soon as the fix is complete, it should be merged into both master and develop (or the current release branch), and master should be tagged with an updated version number.
Having a dedicated line of development for bug fixes lets your team address issues without interrupting the rest of the workflow or waiting for the next release cycle. You can think of maintenance branches as ad hoc release branches that work directly with master. A hotfix branch can be created using the following methods:
Without the git-flow extensions:
> git checkout master
> git checkout -b hotfix_branch
When using the git-flow extensions:
> git flow hotfix start hotfix_branch
Similar to finishing a release branch, a hotfix branch gets merged into both master and develop.
> git checkout master
> git merge hotfix_branch
> git checkout develop
> git merge hotfix_branch
> git branch -D hotfix_branch
> $ git flow hotfix finish hotfix_branch
Example
A complete example demonstrating a Feature Branch Flow is as follows. Assuming we have a repo setup with a master branch.
> git checkout master
> git checkout -b develop
> git checkout -b feature_branch
>
> # work happens on feature branch
>
> git checkout develop
> git merge feature_branch
> git checkout master
> git merge develop
> git branch -d feature_branch
In addition to the feature and release flow, a hotfix example is as follows:
> git checkout master
> git checkout -b hotfix_branch
>
> # work is done commits are added to the hotfix_branch
>
> git checkout develop
> git merge hotfix_branch
> git checkout master
> git merge hotfix_branch
Source
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow


| Using this Transcription | Main Menu |
|---|
| We have tried to make using this web site of the transcriptions as intuitive as possible. These few notes should help you to get the best out of it.
System Requirements are a PC with any reasonably up-to-date web browser. The layout has been optimised for a screen resolution of 800 x 600, but you should get perfectly acceptable results at other resolutions. A Navigation Bar at the top of most pages lets you move between the transcriptions of individual graves, the Index and the Area Plan of the churchyard. When viewing a page, the Next > and < Prev. links let you step to the adjacent graves in the numbering sequence. The Plan of the Churchyard is initially shown at low magnification to give an overview of the whole churchyard, with the separate areas shown in different colours. If you click in any area, you will get a magnified view of that area, showing individual graves. Scroll bars in your browser window, allow you to view the whole area. By clicking on an individual grave number, you will be taken straight to that grave. (Note that on some small graves, the number is placed beside the outline of the grave rather than inside it. In every case, it is the number you should click on, not the outline of the grave). If you want to find other graves in the same area, you will find it best to use the MI Plan link to return to that plan. This will take you back to the magnified plan. Alternatively if you use the Area Plan link on the navigation bar, you will be taken back to the overview plan. The Index of Names provides the easiest way to get to a specific person's grave. Simply clicking on the grave number in the right hand column will take you straight there. If you want to find other members of the same family, you will find it best to use your browser's Back button, to return to the Index of Names. This will take you back to your previous location in the index. Alternatively if you use the Index link on the navigation bar, you will be taken back to the start of the index. You can Magnify most of the pictures, by clicking on the image. This will produce a page containing just the picture, at its full magnification. To return to the normal inscription page, you may either click on the Back link, use your browser's Back button, or simply click on the magnified image. |
| The Parish Church of St. Mary, Cogges, Oxfordshire. | Copyright © St. Mary's Church Cogges Parochial Church Council, 2005 |
| Updated 10th February 2005 | Feedback |


Why I decided to pursue coding!
Here's what I've done so far with lots of help from Natty, Kaveh & Tanner
I have Masters in Social Work from the University of Washington and sell pancakes for a living at the Countryside Cafe!
Videography
Hanging out with chop chop, my pet drone
Attempting to code!


get_subcommand(3f) - [ARGUMENTS:M_CLI2] special-case routine for handling subcommands on a command line (LICENSE:PD)
Synopsis
Description
Returns
Example
Author
License
function get_subcommand()
character(len=:),allocatable :: get_subcommand
In the special case when creating a program with subcommands it is assumed the first word on the command line is the subcommand. A routine is required to handle response file processing, therefore this routine (optionally processing response files) returns that first word as the subcommand name.It should not be used by programs not building a more elaborate command with subcommands.
NAME name of subcommand
Sample program:
program demo_get_subcommand !x! SUBCOMMANDS !x! For a command with subcommands like git(1) !x! you can make separate namelists for each subcommand. !x! You can call this program which has two subcommands (run, test), !x! like this: !x! demo_get_subcommand --help !x! demo_get_subcommand run -x -y -z --title -l -L !x! demo_get_subcommand test --title -l -L --testname !x! demo_get_subcommand run --help implicit none !x!  DEFINE AND PARSE COMMAND LINE !x! ALL DONE CRACKING THE COMMAND LINE. !x! USE THE VALUES IN YOUR PROGRAM. write(*,*)command was ,name write(*,*)x,y,z .... ,x,y,z write(*,*)title .... ,title write(*,*)l,l_ ..... ,l,l_ write(*,*)testname . ,testname contains subroutine parse(name) !x! PUT EVERYTHING TO DO WITH COMMAND PARSING HERE FOR CLARITY use M_CLI2, only : set_args, get_args, get_args_fixed_length use M_CLI2, only : get_subcommand, set_mode character(len=*) :: name ! the subcommand name character(len=:),allocatable :: help_text(:), version_text(:) call set_mode(response_file) ! define version text version_text=[character(len=80) :: & @(#)PROGRAM: demo_get_subcommand >, & @(#)DESCRIPTION: My demo program >, & @(#)VERSION: 1.0 20200715 >, & @(#)AUTHOR: me, myself, and I>, & @(#)LICENSE: Public Domain >, & ] ! general help for "demo_get_subcommand --help" help_text=[character(len=80) :: & allowed subcommands are , & * run -l -L --title -x -y -z , & * test -l -L --title , & ] ! find the subcommand name by looking for first word on command ! not starting with dash name = get_subcommand() select case(name) case(run) help_text=[character(len=80) :: & , & Help for subcommand "run" , & , & ] call set_args( & & -x 1 -y 2 -z 3 --title "my title" -l F -L F,& & help_text,version_text) call get_args(x,x) call get_args(y,y) call get_args(z,z) call get_args_fixed_length(title,title) call get_args(l,l) call get_args(L,l_) case(test) help_text=[character(len=80) :: & , & Help for subcommand "test" , & , & ] call set_args(& & --title "my title" -l F -L F --testname "Test",& & help_text,version_text) call get_args_fixed_length(title,title) call get_args(l,l) call get_args(L,l_) call get_args_fixed_length(testname,testname) case default ! process help and version call set_args( ,help_text,version_text) write(*,(*(a)))unknown or missing subcommand [,trim(name),] write(*,(a))[character(len=80) :: & allowed subcommands are , & * run -l -L -title -x -y -z , & * test -l -L -title , & ] stop end select end subroutine parse end program demo_get_subcommand
John S. Urban, 2019
Public Domain
| Nemo Release 3.1 | get_subcommand (3) | July 22, 2023 |


| Skip to content | |||
|
|
Tip
Speed your search for a link on this page with your browser's "Find" feature: Press CTRL+F on your keyboard. Enter the words you want in the resulting "Find" window and press the "Enter" key. About the Fed
The Federal Reserve Board
The Federal Reserve System
Other Central Banks
Requesting Information (Freedom of Information Act)
Related Web Sites
News and Events
Testimony and Speeches
Press Releases
Conferences
Services
Monetary Policy
Policymaking
Policy tools
Reports
Banking Information and Regulation
Actions and Applications
Banking Data
Banking Structure
Basel II Capital Accord
Community Reinvestment Act Homeland Security Information Legal Developments Regulations Supervision Payment Systems
Payment Policies
Payment Services
Federal Reserve Financial Services
Economic Research and Data
Statistics: Releases and Historical Data
Surveys and Reports Staff Studies Working Papers Federal Reserve Bulletin Research Staff and Resources Conferences Consumer Information
Bank Accounts and Services
ESPAÑOL Cómo puede un consumidor presentar una queja acerca de un banco
ESPAÑOL ¿Cuándo no es su cheque un cheque? Intercambio electrónico de cheques
Consumer Credit
- Your Credit Report: What it Says about You
Identity Theft
(on the web site of the Federal Reserve Bank of San Francisco) - ID Theft: When Bad Things Happen to Your Good Name
(on the web site of the Federal Trade Commission) - When a Criminal's Cover Is Your Identity
Leasing
(on the web site of the Federal Deposit Insurance Corporation) ESPAÑOL Arrendar un vehículo: Guía del consumidor
Mortgages
ESPAÑOL Guía para el consumidor sobre hipotecas a tasa ajustable (ARM)
ESPAÑOL Buscando la hipoteca más favorable: Compare, Verifique, Negocie
ESPAÑOL Utilizar su hogar como garantía para un préstamo es arriesgado
ESPAÑOL Lo que usted debería saber sobre las líneas de crédito con garantía hipotecaria
Personal Finance
- Building Wealth: A Beginner's Guide to Securing Your Financial Future
(on the web site of the Federal Reserve Bank of Dallas) - Personal Financial Education
Resource materials and tools (on the web site of Federal Reserve Education) Community Development
Community Affairs Research Conferences
Community Development Investments
- Profiles of the organizations in which bank holding companies and state member banks have invested
Community Development Publications
Community Reinvestment Act
Fiscal Impact ToolHome Mortgage Disclosure Act Data Public Hearings on Home Equity Lending Community Development Programs in the Federal Reserve System Reporting Forms
Forms by Category
- FFIEC
- Research
Information Collections under ReviewApplication Filing Information Guide to Regulatory and Financial Electronic Reporting Publications and Education Resources
Publications
- Research
Index of Federal Reserve Economic Research
(on the web site of the Federal ReserveBank of San Francisco) - Ordering Publications
From the Federal Reserve System Online Catalog
Education Resources
(on the web site of the Federal Reserve Bank of New York) - In Plain English: Making Sense of the Federal Reserve
(on the web site of the Federal Reserve Bank of St. Louis) - Peanuts & Crackerjacks--Economics of Pro Team Sports
(on the web site of the Federal Reserve Bank of Boston) Career Opportunities
|
||
|
|


| Package | Description |
|---|---|
| com.hazelcast.ascii |
This package contains Ascii functionality for Hazelcast.
|
| com.hazelcast.client |
Contains classes/interfaces related to Client
|
| com.hazelcast.client.impl |
Contains most of the client side HazelcastInstance implementation functionality.
|
| com.hazelcast.client.spi |
Contains classes/interfaces related to Service Provider Interface
such as ClientProxy , ClientClusterService
|
| com.hazelcast.client.spi.impl |
Provides util classes for com.hazelcast.client
|
| com.hazelcast.cluster |
This package contains the cluster functionality.
|
| com.hazelcast.cluster.impl |
This package contains the implementation of the cluster functionality.
|
| com.hazelcast.core |
Provides core API interfaces/classes.
|
| com.hazelcast.instance |
This package contains Hazelcast Instance functionality.
|
| com.hazelcast.jmx |
Contains Hazelcast management bean classes.
|
| com.hazelcast.logging |
This package contains logging functionality for Hazelcast.
Since Hazelcast has a zero dependency policy, Hazelcast provides a logging abstraction like commongs logging, so that different logging frameworks like log4j, can be hooked in. |
| com.hazelcast.management |
Contains classes to provide data/operation interface for Management Center.
|
| com.hazelcast.nio |
This package contains classes related to New IO
|
| com.hazelcast.partition |
Contains the partition logic for Hazelcast.
|
| com.hazelcast.partition.impl |
Contains the actual implementation of the
InternalPartitionService . |
| com.hazelcast.spi |
Provides interfaces/classes for Hazelcast SPI.
|
| com.hazelcast.spi.impl |
Contains implementations for Hazelcast SPI.
|
| com.hazelcast.util |
This package contains classes to support the inner workings of Hazelcast
as well as some backports of newer Java features / data structures to
support older Java versions in a clean and nice way.
|
| com.hazelcast.wan |
This package contains the WAN replication API
|
| com.hazelcast.wan.impl |
This package contains the opensource implementation of WAN replication
|
| Class and Description |
|---|
| Node |
| Class and Description |
|---|
| DefaultOutOfMemoryHandler
Default OutOfMemoryHandler implementation that tries to release local resources (threads, connections, memory)
immediately and disconnects members from the rest of the cluster.
|
| MemberImpl |
| Class and Description |
|---|
| GroupProperties
The GroupProperties contain the Hazelcast properties.
|
| MemberImpl |
| Node |
| Class and Description |
|---|
| MemberImpl |
| Class and Description |
|---|
| MemberImpl |
| Class and Description |
|---|
| MemberImpl |
| Class and Description |
|---|
| MemberImpl |
| Node |
| Class and Description |
|---|
| MemberImpl |
| Class and Description |
|---|
| AddressPicker |
| BuildInfo |
| GroupProperties
The GroupProperties contain the Hazelcast properties.
|
| GroupProperties.GroupProperty |
| HazelcastInstanceImpl |
| LifecycleServiceImpl |
| MemberImpl |
| Node |
| NodeContext |
| NodeExtension
NodeExtension is a Node extension mechanism to be able to plug different implementations of
some modules, like; SerializationService, SocketChannelWrapperFactory etc.
|
| Class and Description |
|---|
| HazelcastInstanceImpl |
| Node |
| Class and Description |
|---|
| BuildInfo |
| MemberImpl |
| Class and Description |
|---|
| HazelcastInstanceImpl |
| Class and Description |
|---|
| Node |
| Class and Description |
|---|
| MemberImpl |
| Class and Description |
|---|
| MemberImpl |
| Node |
| Class and Description |
|---|
| GroupProperties
The GroupProperties contain the Hazelcast properties.
|
| MemberImpl |
| Node |
| Class and Description |
|---|
| GroupProperties
The GroupProperties contain the Hazelcast properties.
|
| MemberImpl |
| Node |
| Class and Description |
|---|
| HazelcastInstanceImpl |
| Node |
| Class and Description |
|---|
| Node |
| Class and Description |
|---|
| Node |
Copyright © 2016 Hazelcast, Inc.. All Rights Reserved.


Crowdsourced table of system capabilities from different devices
Find out more, or contribute device details here!


| Opcode*/Instruction | Op/En | 64/32 bit Mode Support | CPUID Feature Flag | Description |
|---|---|---|---|---|
| F3 0F 53 /r RCPSS xmm1, xmm2/m32 | RM | V/V | SSE | Computes the approximate reciprocal of the scalar single-precision floating-point value in xmm2/m32 and stores the result in xmm1. |
| VEX.LIG.F3.0F.WIG 53 /r VRCPSS xmm1, xmm2, xmm3/m32 | RVM | V/V | AVX | Computes the approximate reciprocal of the scalar single-precision floating-point value in xmm3/m32 and stores the result in xmm1. Also, upper single precision floating-point values (bits[127:32]) from xmm2 are copied to xmm1[127:32]. |
| Op/En | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
| RM | ModRM:reg (w) | ModRM:r/m (r) | NA | NA |
| RVM | ModRM:reg (w) | VEX.vvvv (r) | ModRM:r/m (r) | NA |
Computes of an approximate reciprocal of the low single-precision floating-point value in the source operand (second operand) and stores the single-precision floating-point result in the destination operand. The source operand can be an XMM register or a 32-bit memory location. The destination operand is an XMM register. The three high-order doublewords of the destination operand remain unchanged. See Figure 10-6 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1, for an illustration of a scalar single-precision floating-point operation.
The relative error for this approximation is:
|Relative Error| ≤ 1.5 ∗ 2−12
The RCPSS instruction is not affected by the rounding control bits in the MXCSR register. When a source value is a 0.0, an ∞ of the sign of the source value is returned. A denormal source value is treated as a 0.0 (of the same sign). Tiny results (see Section <IP_ADDRESS>, “Numeric Underflow Exception (#U)” in Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1) are always flushed to 0.0, with the sign of the operand. (Input values greater than or equal to |1.11111111110100000000000B∗2125| are guaranteed to not produce tiny results; input values less than or equal to |1.00000000000110000000001B*2126| are guaranteed to produce tiny results, which are in turn flushed to 0.0; and input values in between this range may or may not produce tiny results, depending on the implementation.) When a source value is an SNaN or QNaN, the SNaN is converted to a QNaN or the source QNaN is returned.
In 64-bit mode, using a REX prefix in the form of REX.R permits this instruction to access additional registers (XMM8-XMM15).
128-bit Legacy SSE version: The first source operand and the destination operand are the same. Bits (MAXVL-1:32) of the corresponding YMM destination register remain unchanged.
VEX.128 encoded version: Bits (MAXVL-1:128) of the destination YMM register are zeroed.
DEST[31:0] ← APPROXIMATE(1/SRC[31:0]) DEST[MAXVL-1:32] (Unmodified)
DEST[31:0] ← APPROXIMATE(1/SRC2[31:0]) DEST[127:32] ← SRC1[127:32] DEST[MAXVL-1:128] ← 0
RCPSS: __m128 _mm_rcp_ss(__m128 a)
None.
See Exceptions Type 5.


Play The
CSS3
Piano!
Ebony and Ivory meet CSS.
Tap a key to play its note
C
C# D♭
D
D# E♭
E
F
F# G♭
G
G# A♭
A
A# B♭
B
C
C# D♭
D
D# E♭
E
F
F# G♭
G
G# A♭
A
A# B♭
B
C
C#
D
D#
E
F
F#
G
G#
A
A#
B


{% extends 'base.html' %} {% block page_title %}Password Reset Complete{% endblock %} {% block content %} {% include 'components/nav.html' %}
Your password has been changed.
You may go ahead and login now.


| print.xgb.cv.synchronous {xgboost} | R Documentation |
Prints formatted results of xgb.cv
.
## S3 method for class 'xgb.cv.synchronous' print(x, verbose = FALSE, ...)
x |
an |
verbose |
whether to print detailed data |
... |
passed to |
When not verbose, it would only print the evaluation results, including the best iteration (when available).
data(agaricus.train, package='xgboost') train <- agaricus.train cv <- xgb.cv(data = train$data, label = train$label, nfold = 5, max_depth = 2, eta = 1, nthread = 2, nrounds = 2, objective = "binary:logistic") print(cv) print(cv, verbose=TRUE)


Inspect that the big images has a low quality, and then that they are replaced with a better one, without leaving white spaces in the layout.


Select exactly one port as the parent port of the trunk to be created. Mandatory.
| Name | IP | Admin State | Status | |||
|---|---|---|---|---|---|---|
|
Select an item from Available items below
|
||||||
| {$ ctrl.nameOrID(item) $} |
{$ address $} on subnet {$ subnet $}
|
{$ item.admin_state | decode:ctrl.portAdminStates $} | {$ item.status | decode:ctrl.portStatuses $} |
|
||
|
|
|
|||||
|---|---|---|---|---|---|
| Name | IP | Admin State | Status | ||
|
No available items
|
|||||
| {$ ctrl.nameOrID(item) $} |
{$ address $} on subnet {$ subnet $}
|
{$ item.admin_state | decode:ctrl.portAdminStates $} | {$ item.status | decode:ctrl.portStatuses $} |
|
|
|


The SAS CPORT is primarily used for transporting data libraries between machines. Stat/Transfer will read, but not write, Windows CPORT files for Versions higher than SAS Seven.
Standard extension: stc
Reading CPORT Files
CPORT files can contain multiple datasets as well as catalogs that contain value labels. When using the user interface, if you select a CPORT file as input, Stat/Transfer will display a Member selection line below the input File Specification line of the Transfer dialog box (see Selecting Members of SAS CPORT and Transport Files). You should select the member from which you want to read your data here.
If you are using the command processor, you select the member by using the '/Tmembername' switch with the Copy command (see Options for Pages and Tables).
If you want to read value labels from the same CPORT file, you can do so by setting the appropriate options (See SAS Value Labels).
Missing Data
Stst/Transfer supports the SAS missing values 'A' - 'Z', '.' and '._'.
On input, when a SAS file is transferred to a Stata file or an ASCII file with extended missing values specified, the SAS input missing values will be transferred to the equivalent ones in the output file, with the exception that any missing values '._' in the input SAS file will be written out as '.' in the output
For all other output formats, all of SAS's missing values are converted to a single internal missing value in Stat/Transfer.


If you implement an on-screen menu with up-down-left-right-select then you could have lots of your challenges on the badge at the same time and demo them to people. Have a look at the github repo for the sample code.
You can also try the following:
Badge.apps["My Foobar"] = function() {
Badge.reset();
// my stuff
// when done, call Badge.menu
// eg. setWatch(Badge.menu, BTNB, { repeat: 1, debounce: 50, edge: "rising" });
};


Angel Room
Beggar
Bomb Bum
Boss Room
Challenge Room
Curse Room
Devil Beggar
Devil Room
Gold Chest
Key Master
Library
Red Chest
Secret Room
Shop
Treasure Room


A new project which enhanch your style with beauty.
At That time we want to create website that people can ue for their own personal use.
Etsy ethnic actually hella Odd Future meggings shabby chic leggings salvia master cleanse stumptown.
Etsy ethnic actually hella Odd Future meggings shabby chic leggings salvia master cleanse stumptown.
Etsy ethnic actually hella Odd Future meggings shabby chic leggings salvia master cleanse stumptown.
Retro chillwave YOLO four loko photo booth. Brooklyn kale chips, seitan hella 3 wolf moon slow-carb paleo.
Retro chillwave YOLO four loko photo booth. Brooklyn kale chips, seitan hella 3 wolf moon slow-carb paleo.
Retro chillwave YOLO four loko photo booth. Brooklyn kale chips, seitan hella 3 wolf moon slow-carb paleo.
Retro chillwave YOLO four loko photo booth. Brooklyn kale chips, seitan hella 3 wolf moon slow-carb paleo.
Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Nulla vitae elit libero, a pharetra augue. Aenean eu leo quam. Pellentesque ornare sem lacinia.


We deliver the joy!
We deliver joy in form of food!
You will get happiness from your orders. Order from us, to get it delivered to wherever you are!


🕯Welcome to🔮Hermetechnics
Learn moreAbout Hermetechnics
When humanity will have invented general AI, and kicked back on a particularly comfortable sofa, they will have started to ponder the future. And what better way to tell the future than referring to the wisdom of the ancients - the old ones who have for millenia taught us the ways of Hermes Trismegistus, the secret permutations of the Qabalah, and the occult science of planets and precious metals. They told us about the telluric currents, and the Serpent which consumed itself. They built markers and gave us clues so hard to miss, and yet we walk across them on our strolls around Warwickshire almost every bank holiday.
We have embarked on a quest to retrieve this ancient knowledge from the Cloud itself. With plentiful VC funding and the correct attitude, We will be able to disrupt the esoteric market, and use magick to create value for our shareholders.
From pioneering innovations in divination, to using the ancient wisdom of alchemy for Microservice Orchestration At Scale, Hermetechnics products have already revolutionised many aspects of our users' experience.
But we didn't stop there. Irure exercitation sit do irure consequat deserunt incididunt eu. Ad proident dolore ipsum consectetur pariatur duis ad aliquip minim quis tempor ea mollit tempor. Tempor sunt Lorem commodo exercitation proident magna. Consequat et ex irure pariatur id cillum officia elit velit culpa quis. Amet laboris eiusmod labore laborum proident fugiat cillum do quis.


You've read {{readCount.read}} books
You have {{readCount.unread}} books to read Hooray!
{{book.title}} -


This program uses your computer as a server to get your live data from your phone, and to get it in a secure way, a self signed certificate is used. Browsers are made to warn about this, but because the server is run on your computer, no risk is posed for you
Detailed Explanation
To get live data from your phone to your computer, this program opens an HTTPS server and communicates with the phone with websockets - a technology used to send data in real-time between a device and a server. In this case, your device is the client, while your computer opens a local server. HTTPS stands for Hypertext Transfer Protocol Secure, that is a protocol used to transfer data in text form between devices on the internet. To achieve the secure status (HTTPS vs HTTPS), a server needs a certificate, which validates the security of the server. Because this program opens a local server on your computer, a new self signed certificate is issued every time the app is opened, thus triggering a warning in your browser. Because the server is on your computer and does not communicate with any other server, your data is safe.


Christian Hadinata
Indonesian Badminton legend as player, coach and comittee
Here's a time line of Christian Hadinata's life:
- 1949- Born in Purwokerto, Central Java
- 1965- Start to play Badminton in Mutiara Club
- 1971- Winning national championships men's doubles with Atik Jauhari, Winning Asian Championships mixed doubles with Retno Kustijah
- 1972- Winning All England men's doubles with Ade Chandra
- 1980- Winning World Championships, Denmark Open men's doubles with Ade Chandra, Winning World Championships mixed doubles with Imelda Wiguno
“Success isn't always about greatness. It's about consistency. Consistent Hard Work leads to Success. Greatness will come”
-- Dwayne "The Rock" Jonshon --
If you have time, you should read more about this incredible human being on his Wikipedia entry


Arriving to Latvia by plane would be the recommended mode of travel, as Riga International Airport (RIX) has many direct flights to most European destinations, and flights to Riga are usually quite cheap. There are also low-cost carriers operating routes to Riga, including Ryanair, Wizz Air, and Norwegian. Air Baltic, the national airline, has the largest selection of direct flights to Riga.
It is usually a good idea to use a flight search engine (e.g. Momondo) to find the cheapest flights.
For our Scandinavian guests, Norwegian and Air Baltic would be the recommended airlines.
We would suggest arriving to Riga on Friday, August 14 (or earlier yet if you can), and do some sight-seeing in Riga before heading off to Jumurda on Saturday. Should that not be possible, we would recommend arriving to Riga no later than 10:00 in the morning (local time) on Saturday, August 15.
We would suggest to plan your return flight from Riga no earlier than ca. 19:30 on Sunday, August 16 (especially if you would like to go by the bus we have chartered). This is because Latvian weddings are traditionally 2-day weddings (as is this one), and all of our guests are welcome to stay in the Jumurda Manor Estate until afternoon of Sunday, August 16. The accommodation for the night from Saturday to Sunday is free of charge for all our guests. It then takes ca. 2 hours to drive from Jumurda to Riga (the departure of the chartered shuttle bus from Jumurda to Riga is scheduled for afternoon of Sunday, August 16).
Once you have arrived to the Riga International Airport, it is best to use either taxi or public transportation to reach your accommodation of choice in Riga.
For taxi services, we would recommend buying a Baltic Taxi pre-paid voucher (a stall on your way out from the Arrivals terminal) in the airport. It costs 14 EUR, and is valid for any destination within Riga. Taxi drivers in Riga sometimes do enjoy taking the longer route (especially if their passenger is a foreigner), so the voucher would assure a fixed price for your trip from the airport.
More information on the vouchers (please note, it is also possible to buy them online, yet purchasing them at the stall in the airport is usually quicker). For public transportation, please remember to have EUR cash with you, preferably in small notes.
It takes ca. 2 hours to drive from Riga to Jumurda. The modes of transportation include:
For our international guests we would recommend opting for the shuttle bus we have chartered
| Route | Departure | Arrival |
|---|---|---|
| Riga, center (near Astor Riga Hotel) - Jumurdas Manor House | Saturday, August 15, 2015 10:30 | Saturday, August 15, 2015 12:30 |
| Jumurdas Manor House - Riga, center (near Astor Riga Hotel) - Riga International Airport | Sunday, August 16, 2015 15:00 | Sunday, August 16, 2015 17:00 (Riga, center) and 17:30 (Riga International Airport) |


You can hide every button of the toolbar and every menu item of the secondary menu.
showToolbar (hiding the toolbar hides every button)
showSecondaryToolbarButton (only shown
if there are menu items)
showSidebarButton showFindButton (requires text layer)
findbarVisible showPagingButtons showZoomButtons showDrawEditor showTextEditor showPresentationModeButton showOpenFileButton showPrintButton showDownloadButton showRotateButton showHandToolButton showScrollingButton showSpreadButton showPropertiesButtonpropertiesDialogVisible
Are you looking for the tabs that used to be here? The reponsive design demos have moved to a dedicated page.


ADOBE GURO | Combine images
ADOBE PS TUTORIALS
One of the most powerful aspects of Adobe Photoshop is its ability to combine images to form imaginative composites.
-
Add texture to an image
Create a textured look with blend modes.
-
Add an object to an image with a layer mask
Use a layer mask to add an object to an image.
-
Replace a background using a layer mask
Use a layer mask to replace one background with another.


Browser Information
The
navigator
object contains the following information about the browser you are using:


Restful API Testing
API testing is a necessary task to do while building APIs.
Instead of using a browser or typing into a UI and clicking buttons, you can test APIs using tools such as Curl and Postman.
Using a Rest Client you can make Rest calls such as for HTTP Verbs such as:
When we test an API, we deal with JSON, XML, and Web Services.
3rd Party APIs
Here is a list of 3rd Party APIs:
Go to Programmable Web to get a complete list of 3rd Party APIs you can utilize
Testing Restful APIs
You can utilize many different types of tools to test APIs such as:
There are other Rest Clients you can use I just listed a few here
Postman Rest Client Advantages
I tend to favor Rest Clients like Postman because it helps to automate testing Restful APIs if you utilize some of its advanced features
Notice here that you can create collection folders that can categorize APIs.
You can do much more than this however
Notice here that Basic {{encodeCredentials}}
has curly braces around encodeCredentials
In Postman you surround variables in double curly braces
If you want to set variables before the HTTP call goes out than using Pre-request Script is what you want
Pre-request scripts are snippets of code associated with a collection request that are executed before the request is sent.
This is perfect for use-cases like including the timestamp in the request headers or sending a random alphanumeric string in the URL parameters.
Pre-request scripts are written in JavaScript, and the syntax is exactly like that of test scripts except that the response object is not present.
Notice here that I am using common js syntax in Postman and in particular require('btoa'
)` which is using Postman Sandbox API
You can find a more complete list in the Postman Sandbox API reference
You can also read Postman Sandbox for other libraries available in Postman Rest Client
Notice here that the Test script section is similar to Pre-Request Script
With Postman you can write and run tests for each request using the JavaScript language.
But more than that you can set variables in the Test script section that you can save for later use
Notice here the use of postman.setEnvironmentVariable("access_token", token_type + " " + access_token);
to set access_token
This is really useful because we can save the access_token for other Rest calls
Instead of manually setting the access token in a variable each day since access tokens tend to expire quickly you can use the tests script section to do that in an automated way.
Notice that we also wrote a test in the test script section as well
// Parse JSON response
var responseBody = JSON.parse(responseBody);
var access_token = responseBody.access_token;
var token_type = responseBody.token_type;
postman.setEnvironmentVariable("access_token", token_type + " " + access_token);
pm.test("Token Type is Bearer", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.token_type).to.eql("Bearer");
});
Notice here we get a passing test since we got an access token from the Paypal API
Notice here that we set the environment for Paypal here
Here we can use global variables that can be used per environment
Here I greyed out the environment variables for security reasons but you can read more about Global Variables at Postman Docs
Another useful feature in Postman is the Presets for Headers which you can read in the Docs
Header Presets are useful if you find yourself reusing a lot of HTTP Header values often and you can simply set a preset to autofill the HTTP headers for you in one click.
Notice here that we can use the group edit feature to quickly set header values in key value pairs in the group edit view.
You can easily go back to the normal view by clicking Key-Value Edit
button again.
Postman supports all of the HTTP Verbs in their dropdown menu
You can easily set query string parameters utilizing the params section in postman
Notice here that we can utilize developer tools in Postman.
This is useful when you want to debug the Pre-request Script and Test script sections in Postman
You can easily set console.log
statements to debug things.
Notice here that we can run all of the collections utilizing the collection runner.
You can read more about the Postman Collection Runner Here
You can import Postman collections easily and if you have Postman Pro account you can share collections with team members.
I covered a good amount of features that Postman offers but read the Fine docs in Postman for more information.


WORLD WIDE SHIPPING
Home
ABOUT US
SERVICES
STATUS
HELP
EXPORT!
fill the following details:
Name:
address:
phone:
Goods type
dry
wet
destination:
address:
SUBMIT
click on submit for pay your amount


{% extends "SacMnnit/base.html" %} {% load staticfiles %} {% block main %} MHRD ACTIVITIES Work Details Management Of Events Ek Bharat Shrestra Bharat Constitution Day Rashtriya Ekta Divas Anti-Terrorism Day Coordinators Faculty In-Charge Dr. Ashish N. Sawarkar, CHED {% endblock main %}


Styled select
CSS Styled Select
Second option
Disabled
CSS Styled Select
Second option
100% wide
CSS Styled Select
Second option
100px wide with overflow
CSS Styled Select
Second option
Alternative styling
CSS Styled Select
Second option


This is not about a once-off experience with coke, but rather me taking a step back from my life and looking at the past few years or so.
I've been using coke, on and off, for about 3 years now. It's a bit weird because sometimes I feel that all those movies and stories about coke don't seem that relevant to my life and then sometimes I feel like I'm a character from a drug story and then I start to feel oh so pathetic.

It's not like I'm not a functional member of society. I'm 26 with a regular well-paying job with a fair deal of responsibility. I'm popular, I have had a few great intimate relationships in the last few years, live at home with the folks who suspect nothing (I think). I work, I play and I don't use coke other than on weekends. Still the thing that really bugs me is that throughout this year, and granted it's only 4 months old, I've only been clean one weekend. That's scary. In 12 weeks I've only been without coke for about 6 days. So I'm wondering (and coming to terms with the fact) that I'm in the throes of mild cocaine addiction. I don't need it, I don't crave it but if a casual suggestion is made about scoring a gram, I'm there like a bear. It's also quite concerning that recently, those casual suggestions seem to be coming from me.
I remember saying to myself that the day I took the name of my dealer off my cell-phone directory, I'd quit. Trouble is that I've used him so often that I know his number by heart.
Most people try to avoid the uglier sides of our characters. Then again, life's got this way of forcing you to take a long, hard look at yourself every now and then. This week I met a lovely girl and we hit it off like a house on fire and I really like her. I would see her this weekend except that she's just booked into rehab for heroin withdrawal. We spent a couple of days together and she said it was the first time in 4 months that she'd been clean and that she was happy. I felt rather proud of myself, thinking that I could be a good influence on her. Now I'm thinking, 'hey kettle, it's the pot, you're black!'
I'm just lucky enough to have chosen a drug with withdrawal symptoms that aren't so bad. (Well not bad enough to book yourself into rehab to go cold turkey.) I wonder if I stay clean for longer than a couple of weeks if I'll still be thinking this way. And I can't stop thinking about her. She's 20 and way too young and beautiful to go through this hell. That in a nutshell is hypocrisy for you.
I was trying to think what I like about coke and there wasn't much. I love the smell, I love numbing my gums, I love the ritual of scoring the gram, making the coke envelope and I absolutely love the very first line. It's pretty much all-downhill from there though. I can't sleep, I think way too much and get really depressed.  I smoke like a chimney and spend the next day coughing my lungs out. And I cry.
Just to end off I'll relate one really funny coke experience I’ve had: Last year my girlfriend and I bought a gram and went back to my place. It was about 1 in the morning and I found it strange that my folks weren't home yet. So we spent the rest of the evening playing backgammon and polishing off what turned out to be a really nice gram, thank you very much. I kept saying to her how worried I was because they never get home this late and that they were very irresponsible for not at least phoning me and telling me where they were. When they finally got home at about 5am, I went to go ask them how they were. After a 5-minute conversation I went back to my room.  My nostrils were clogged with thick white paste as clear as daylight. And to this day, my mum (who's a pharmacist for Christ's sake) and dad never suspected a thing.
Now you tell me who's more ignorant: the coke user or his parents and now tell me who needs to be educated more...
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Created at Hack the Cloud in July 2020
Opportunity Dashboard is a Flask app that uses MongoDB. This website was created to connect students with opportunities like events. It is similar to reddit but focused on providing information on opportunities for students.
Created at Hyphen Hacks in October 2019
Trash sorter is a Flask app that uses ClarifAi. The website can predict where an item should be thrown away by detecting what material the item is made of.
Created at DV Hacks
Educate Green uses Flask and Tom Tom's map API. The website was created to bring awareness to climate change and provides information on climate change facts. It provides a caluclator for emissions based on your form of transportation between two places.
Created at SM Hacks II in November 2018
Maze Runner uses opencv and a custom trained model to detect hand motion. This game is played using hand motions in your camera which makes it accessible to many.
Created at HS Hacks IV in October 2018
Travel Checklist uses Flask and ClarifAI. It would detect an item you packed via object recognition using ClarifAI and would store this data for you. This was created to help users remember what items they packed so they wouldn't forget items when returning home or changing vacation destinations.
Hack the Fog 1.0 in March 2018
I co-founded Hack the Fog and helped organize the first high school hackathon in San Francisco.


Kohl's Black Friday ad includes big discounts and a ton of in-store credit
The cycle begins again! Black Friday is coming and so are the deals. But before the big day even gets here, retailers want you to know what to expect. Kohl's Black Friday ad is out now and includes products ranging from gaming consoles to bath towels. We've already seen Lenovo and Costco release ads, so we'll just be picking up steam from here.
Deals worth considering
While Kohl's might not be the first name you think of when it comes to Black Friday, the retailer has a huge sale every year. If you've ever shopped at Kohl's or would consider doing it, Black Friday will be worth it for you because Kohl's deals get reinforced with extra Kohl's Cash. This is just basically in-store credit you can use on future purchases, and it's good on anything. So it is as good as cash as long as you can make it work at the store.
Xbox One X 1TB NBA 2k20 bundle
Source: Microsoft
You'll save $50 directly off the price of the bundle and get $105 Kohl's Cash to spend. This deal is really only significant if the NBA game matters to you because I'm sure we'll see $50 discounts or more at several retailers and on several different bundles.
Nintendo Switch bundle
Source: Nintendo
For $319.99, you'll get the Nintendo Switch console, a carrying case, and a charging dock for the Joy-Con controllers. The charging docks usually go for $20 alone, so that's not bad savings for some useful accessories. And this deal is $10 better than the bundle Kohl's had on sale last year. It also comes with $90 Kohl's Cash.
Amazon Echo Show 5
Source: Amazon
Amazon's Echo Show 5 is one of the newer pieces of Amazon hardware. So far we have only seen it go on sale for as low as $60 (a deal price that's active at Amazon and Kohl's right now). Kohl's is promising to have them for $50 on Black Friday. While I imagine they won't be the only ones, that's still the best price around and you'll get $15 Kohl's Cash to spend.
Instant Pot Duo Nova pressure cooker
Source: Instant Pot
This is the newest model Instant Pot. It has only been around since August. We have not seen any real deals on it since its introduction. Kohl's will have it for $33 off its regular $100 price. Not a bad discount at all and exactly the sort of thing you go to Kohl's for anyway. The deal includes $15 in Kohl's Cash.
Other deals to keep an eye on:
Deals worth ignoring
Not every deal is a winner. The main problem with Kohl's Black Friday is many of the items on sale are actually a bit cheaper elsewhere, but Kohl's augments the savings with the Kohl's Cash thing. If you're just looking for the best direct price drops, look elsewhere for some of these.
- Fitbit Charge 3 activity tracker
- Echo Dot 3rd-generation smart speaker
- Powerbeats3 wireless headphones
Store information
Get the latest Black Friday deals delivered straight to your inbox!
Kohl's is following the same strategy this year the store followed last year. So if you've shopped there before, you'll know what to expect. The first wave of deals start online at midnight central time on Monday, Nov. 25. These won't be the major Black Friday sales, but the sale might still be worth looking at. Online shoppers will also get a heads up on the Black Friday deals, which kick off at midnight on Thanksgiving Day. If those deals expire too quickly, you can head in store at 5 p.m. on Thanksgiving Day (love that Black Friday creep).
Direct price drops won't be the only way to save at Kohl's during the holiday. You'll also get $15 in Kohl's Cash for every $50 you spend. That's savings that can be used between Nov. 30 and Dec. 9. Just add that Cash on whatever Cash you earn from the deals you're going for, too. During that same time period, use the promo code THANKS15 to save 15% off your entire order whether you shop online or in store (the Black Friday ad has a coupon you can print on Page 3 if you're going in).
 If not, don't worry. We will help you out every step of the way. Be sure to sign up for our Black Friday newsletter, and keep your eye here for more ads and leaks as they are made available.
Get ready for Black Friday
- Black Friday Deals
- Black Friday: Everything You Need To Know
- Amazon Black Friday 2019: Best Deals, Ads, & Sales
- Best Buy Black Friday 2019: Best Deals, Ads, & Sales
- Walmart Black Friday 2019: Best Deals, Ads, & Sales
- Black Friday Carrier Deals: Verizon, Sprint, T-Mobile, Mint Mobile, & more
- Black Friday VPN Deals: ExpressVPN, PIA, NordVPN, & more
We may earn a commission for purchases using our links. Learn more.


Use distribution to solve:
A\times(B + C)
RESULT
Each row has B + C = B+C
rectangles, and there are A
rows.
Counting by color:
Number of orange rectangles: A \times B = A * B
Number of blue rectangles: A \times C = A* C
Total number of rectangles: A * B + A * C = RESULT
Counting by row:
Number of rows: A
Number of rectangles in a row: B + C = B + C
Total number of rectangles: A \times B + C = RESULT
Both ways of counting result in the same number, and this is known as the distributive property.
(A \times B) + (A \times C) = A\times(B + C)
Using the picture below as a guide, what number could replace SYMBOL
?
A\times(B + C) = ( SYM_A \times SYM_B ) + ( SYM_A \times SYM_C )
There are A
rows, and each row has B + C = B+C
rectangles.
MISSING
Counting by color:
Number of orange rectangles: A \times B = A * B
Number of blue rectangles: A \times C = A* C
Total number of rectangles: A * B + A * C = RESULT
Counting by row:
Number of rows: A
Number of rectangles in a row: B + C = B + C
Total number of rectangles: A \times B + C = RESULT
Both ways of counting result in the same number, and this is known as the distributive property.
(A \times B) + (A \times C) = A\times(B + C)
Thus the symbol SYMBOL
could be replaced with MISSING
.


-
<branchName>
Tracks the specified branch. Better use refs/heads/<branchName>
E.g. master
, development
-
Multiple branches
Tracks multiple branches in csv format
E.g. development, master, */master, *feature, feature/**
-
Any branch
E.g. **
-
<Wildcards>
- "*" is recognized as a wildcard
- "**" is recognized as wildcard that includes the separator '/'
Therefore, origin/branches*
would match origin/branches-foo
but not origin/branches/foo
, while origin/branches**
would match both origin/branches-foo
and origin/branches/foo


Structure
of Marvelmind software package.
Release date 2018.01.04
|
File/folder |
Description |
|
Dashboard
software V5.62. Portable
executable. |
|
|
Dashboard
software V5.62. Installer
file. The installer installs dashboard on the computer, installs serial port
driver, places shortcut on the desktop. |
|
|
|
|
|
Folder
with firmware for modem and beacons of hardware version 4.5 |
|
|
Notes
about firmware for hardware version 4.5 |
|
|
hw45_firmware\2018_01_25_beacon_hw45_sw5_85_rd433MHz_bb0fe7e_full.dfu |
Full
version of beacon firmware V5.85 for HW 4.5. Only DFU file is available |
|
hw45_firmware\2018_01_25_beacon_hw45_sw5_85_rd433MHz_bb0fe7e_noNMEAnoSPI.hex hw45_firmware\2018_01_25_beacon_hw45_sw5_85_rd433MHz_bb0fe7e_full.dfu |
Version
of beacon firmware V5.85 for HW4.5 without GPS-like NMEA output. Please refer
to readme.txt DFU and
hex files are available. |
|
hw45_firmware\2018_01_25_modem_hw45_sw5_85_rd433MHz_d90a57d.hex hw45_firmware\2018_01_25_modem_hw45_sw5_85_rd433MHz_d90a57d.dfu |
Version
of modem firmware V5.85 for HW4.5 DFU and
hex files are available. |
|
|
|
|
Folder
with firmware for modem and beacons of hardware version 4.5 |
|
|
hw49_firmware\2018_01_25_beacon_hw49_sw5_85_rd433MHz_84035b9.hex hw49_firmware\2018_01_25_beacon_hw49_sw5_85_rd433MHz_84035b9.dfu |
Version
of beacon firmware V5.85 for HW4.9 DFU and
hex files are available. 433 MHz
default radio band |
|
hw49_firmware\2018_01_25_beacon_hw49_sw5_85_rd915MHz_84035b9.hex hw49_firmware\2018_01_25_beacon_hw49_sw5_85_rd915MHz_84035b9.dfu |
Version
of beacon firmware V5.85 for HW4.9 DFU and
hex files are available. 915 MHz
default radio band |
|
hw49_firmware\2018_01_25_modem_hw49_sw5_85_rd433MHz_d90a57d.hex hw49_firmware\2018_01_25_modem_hw49_sw5_85_rd433MHz_d90a57d.dfu |
Version
of modem firmware V5.85 for HW4.9 DFU and
hex files are available. 433 MHz
default radio band |
|
hw49_firmware\2018_01_25_modem_hw49_sw5_85_rd915MHz_d90a57d.hex hw49_firmware\2018_01_25_modem_hw49_sw5_85_rd915MHz_d90a57d.dfu |
Version of
modem firmware V5.85 for HW4.9 DFU and
hex files are available. 915 MHz
default radio band |
DFU files
are used for uploading firmware via DFU interface. Please refer to section 4.5
of operating manual.
Hex files
are used for uploading firmware using dashboard software. Use ‘Firmware’ menu
for this.


Ok, let's begin by defining who this document is written for. Obviously, some basic knowledge of C is required, unless you only wish to know the basic theory. You do not need to be a code ninja; for the areas likely to be understood only by more experienced programmers, I'll be sure to describe concepts in greater detail. Additionally, some basic understanding of networking might help, given that this is a packet sniffer and all. All of the code examples presented here have been tested on FreeBSD 4.3 with a default kernel.
The first thing to understand is the general layout of a pcap sniffer. The flow of code is as follows:
This is actually a very simple process. Five steps total, one of which is optional (step 3, in case you were wondering.) Let's take a look at each of the steps and how to implement them.
This is terribly simple. There are two techniques for setting the device that we wish to sniff on.
The first is that we can simply have the user tell us. Consider the following program:
#include <stdio.h> #include <pcap.h> int main(int argc, char *argv[]) { char *dev = argv[1]; printf("Device: %s\n", dev); return(0); }
The user specifies the device by passing the name of it as the first argument to the program. Now the string "dev" holds the name of the interface that we will sniff on in a format that pcap can understand (assuming, of course, the user gave us a real interface).
The other technique is equally simple. Look at this program:
#include <stdio.h> #include <pcap.h> int main(int argc, char *argv[]) { char *dev, errbuf[PCAP_ERRBUF_SIZE]; dev = pcap_lookupdev(errbuf); if (dev == NULL) { fprintf(stderr, "Couldn't find default device: %s\n", errbuf); return(2); } printf("Device: %s\n", dev); return(0); }
In this case, pcap just sets the device on its own. "But wait, Tim," you say. "What is the deal with the errbuf string?" Most of the pcap commands allow us to pass them a string as an argument. The purpose of this string? In the event that the command fails, it will populate the string with a description of the error. In this case, if pcap_lookupdev() fails, it will store an error message in errbuf. Nifty, isn't it? And that's how we set our device.
The task of creating a sniffing session is really quite simple. For this, we use pcap_open_live(). The prototype of this function (from the pcap man page) is as follows:
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
The first argument is the device that we specified in the previous section. snaplen is an integer which defines the maximum number of bytes to be captured by pcap. promisc, when set to true, brings the interface into promiscuous mode (however, even if it is set to false, it is possible under specific cases for the interface to be in promiscuous mode, anyway). to_ms is the read time out in milliseconds (a value of 0 means no time out; on at least some platforms, this means that you may wait until a sufficient number of packets arrive before seeing any packets, so you should use a non-zero timeout). Lastly, ebuf is a string we can store any error messages within (as we did above with errbuf). The function returns our session handler.
To demonstrate, consider this code snippet:
#include <pcap.h> ... pcap_t *handle; handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); return(2); }
This code fragment opens the device stored in the strong "dev", tells it to read however many bytes are specified in BUFSIZ (which is defined in pcap.h). We are telling it to put the device into promiscuous mode, to sniff until an error occurs, and if there is an error, store it in the string errbuf; it uses that string to print an error message.
A note about promiscuous vs. non-promiscuous sniffing: The two techniques are very different in style. In standard, non-promiscuous sniffing, a host is sniffing only traffic that is directly related to it. Only traffic to, from, or routed through the host will be picked up by the sniffer. Promiscuous mode, on the other hand, sniffs all traffic on the wire. In a non-switched environment, this could be all network traffic. The obvious advantage to this is that it provides more packets for sniffing, which may or may not be helpful depending on the reason you are sniffing the network. However, there are regressions. Promiscuous mode sniffing is detectable; a host can test with strong reliability to determine if another host is doing promiscuous sniffing. Second, it only works in a non-switched environment (such as a hub, or a switch that is being ARP flooded). Third, on high traffic networks, the host can become quite taxed for system resources.
Not all devices provide the same type of link-layer headers in the packets you read. Ethernet devices, and some non-Ethernet devices, might provide Ethernet headers, but other device types, such as loopback devices in BSD and OS X, PPP interfaces, and Wi-Fi interfaces when capturing in monitor mode, don't.
You need to determine the type of link-layer headers the device provides, and use that type when processing the packet contents. The pcap_datalink() routine returns a value indicating the type of link-layer headers; see the list of link-layer header type values. The values it returns are the DLT_ values in that list.
If your program doesn't support the link-layer header type provided by the device, it has to give up; this would be done with code such as
if (pcap_datalink(handle) != DLT_EN10MB) { fprintf(stderr, "Device %s doesn't provide Ethernet headers - not supported\n", dev); return(2); }
which fails if the device doesn't supply Ethernet headers. This would be appropriate for the code below, as it assumes Ethernet headers.
Often times our sniffer may only be interested in specific traffic. For instance, there may be times when all we want is to sniff on port 23 (telnet) in search of passwords. Or perhaps we want to highjack a file being sent over port 21 (FTP). Maybe we only want DNS traffic (port 53 UDP). Whatever the case, rarely do we just want to blindly sniff all network traffic. Enter pcap_compile() and pcap_setfilter().
The process is quite simple. After we have already called pcap_open_live() and have a working sniffing session, we can apply our filter. Why not just use our own if/else if statements? Two reasons. First, pcap's filter is far more efficient, because it does it directly with the BPF filter; we eliminate numerous steps by having the BPF driver do it directly. Second, this is a lot easier :)
Before applying our filter, we must "compile" it. The filter expression is kept in a regular string (char array). The syntax is documented quite well in the man page for tcpdump; I leave you to read it on your own. However, we will use simple test expressions, so perhaps you are sharp enough to figure it out from my examples.
To compile the program we call pcap_compile(). The prototype defines it as:
int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)
The first argument is our session handle (pcap_t *handle in our previous example). Following that is a reference to the place we will store the compiled version of our filter. Then comes the expression itself, in regular string format. Next is an integer that decides if the expression should be "optimized" or not (0 is false, 1 is true. Standard stuff.) Finally, we must specify the network mask of the network the filter applies to. The function returns -1 on failure; all other values imply success.
After the expression has been compiled, it is time to apply it. Enter pcap_setfilter(). Following our format of explaining pcap, we shall look at the pcap_setfilter() prototype:
int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
This is very straightforward. The first argument is our session handler, the second is a reference to the compiled version of the expression (presumably the same variable as the second argument to pcap_compile()).
Perhaps another code sample would help to better understand:
#include <pcap.h> ... pcap_t *handle; /* Session handle */ char dev[] = "rl0"; /* Device to sniff on */ char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */ struct bpf_program fp; /* The compiled filter expression */ char filter_exp[] = "port 23"; /* The filter expression */ bpf_u_int32 mask; /* The netmask of our sniffing device */ bpf_u_int32 net; /* The IP of our sniffing device */ if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { fprintf(stderr, "Can't get netmask for device %s\n", dev); net = 0; mask = 0; } handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); return(2); } if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return(2); } if (pcap_setfilter(handle, &fp) == -1) { fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return(2); }
This program preps the sniffer to sniff all traffic coming from or going to port 23, in promiscuous mode, on the device rl0.
You may notice that the previous example contains a function that we have not yet discussed. pcap_lookupnet() is a function that, given the name of a device, returns one of its IPv4 network numbers and corresponding network mask (the network number is the IPv4 address ANDed with the network mask, so it contains only the network part of the address). This was essential because we needed to know the network mask in order to apply the filter. This function is described in the Miscellaneous section at the end of the document.
It has been my experience that this filter does not work across all operating systems. In my test environment, I found that OpenBSD 2.9 with a default kernel does support this type of filter, but FreeBSD 4.3 with a default kernel does not. Your mileage may vary.
At this point we have learned how to define a device, prepare it for sniffing, and apply filters about what we should and should not sniff for. Now it is time to actually capture some packets.
There are two main techniques for capturing packets. We can either capture a single packet at a time, or we can enter a loop that waits for n number of packets to be sniffed before being done. We will begin by looking at how to capture a single packet, then look at methods of using loops. For this we use pcap_next().
The prototype for pcap_next() is fairly simple:
u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
The first argument is our session handler. The second argument is a pointer to a structure that holds general information about the packet, specifically the time in which it was sniffed, the length of this packet, and the length of his specific portion (incase it is fragmented, for example.) pcap_next() returns a u_char pointer to the packet that is described by this structure. We'll discuss the technique for actually reading the packet itself later.
Here is a simple demonstration of using pcap_next() to sniff a packet.
#include <pcap.h> #include <stdio.h> int main(int argc, char *argv[]) { pcap_t *handle; /* Session handle */ char *dev; /* The device to sniff on */ char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */ struct bpf_program fp; /* The compiled filter */ char filter_exp[] = "port 23"; /* The filter expression */ bpf_u_int32 mask; /* Our netmask */ bpf_u_int32 net; /* Our IP */ struct pcap_pkthdr header; /* The header that pcap gives us */ const u_char *packet; /* The actual packet */ /* Define the device */ dev = pcap_lookupdev(errbuf); if (dev == NULL) { fprintf(stderr, "Couldn't find default device: %s\n", errbuf); return(2); } /* Find the properties for the device */ if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { fprintf(stderr, "Couldn't get netmask for device %s: %s\n", dev, errbuf); net = 0; mask = 0; } /* Open the session in promiscuous mode */ handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); return(2); } /* Compile and apply the filter */ if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return(2); } if (pcap_setfilter(handle, &fp) == -1) { fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return(2); } /* Grab a packet */ packet = pcap_next(handle, &header); /* Print its length */ printf("Jacked a packet with length of [%d]\n", header.len); /* And close the session */ pcap_close(handle); return(0); }
This application sniffs on whatever device is returned by pcap_lookupdev() by putting it into promiscuous mode. It finds the first packet to come across port 23 (telnet) and tells the user the size of the packet (in bytes). Again, this program includes a new call, pcap_close(), which we will discuss later (although it really is quite self explanatory).
The other technique we can use is more complicated, and probably more useful. Few sniffers (if any) actually use pcap_next(). More often than not, they use pcap_loop() or pcap_dispatch() (which then themselves use pcap_loop()). To understand the use of these two functions, you must understand the idea of a callback function.
Callback functions are not anything new, and are very common in many API's. The concept behind a callback function is fairly simple. Suppose I have a program that is waiting for an event of some sort. For the purpose of this example, let's pretend that my program wants a user to press a key on the keyboard. Every time they press a key, I want to call a function which then will determine that to do. The function I am utilizing is a callback function. Every time the user presses a key, my program will call the callback function. Callbacks are used in pcap, but instead of being called when a user presses a key, they are called when pcap sniffs a packet. The two functions that one can use to define their callback is pcap_loop() and pcap_dispatch(). pcap_loop() and pcap_dispatch() are very similar in their usage of callbacks. Both of them call a callback function every time a packet is sniffed that meets our filter requirements (if any filter exists, of course. If not, then all packets that are sniffed are sent to the callback.)
The prototype for pcap_loop() is below:
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
The first argument is our session handle. Following that is an integer that tells pcap_loop() how many packets it should sniff for before returning (a negative value means it should sniff until an error occurs). The third argument is the name of the callback function (just its identifier, no parentheses). The last argument is useful in some applications, but many times is simply set as NULL. Suppose we have arguments of our own that we wish to send to our callback function, in addition to the arguments that pcap_loop() sends. This is where we do it. Obviously, you must typecast to a u_char pointer to ensure the results make it there correctly; as we will see later, pcap makes use of some very interesting means of passing information in the form of a u_char pointer. After we show an example of how pcap does it, it should be obvious how to do it here. If not, consult your local C reference text, as an explanation of pointers is beyond the scope of this document. pcap_dispatch() is almost identical in usage. The only difference between pcap_dispatch() and pcap_loop() is that pcap_dispatch() will only process the first batch of packets that it receives from the system, while pcap_loop() will continue processing packets or batches of packets until the count of packets runs out. For a more in depth discussion of their differences, see the pcap man page.
Before we can provide an example of using pcap_loop(), we must examine the format of our callback function. We cannot arbitrarily define our callback's prototype; otherwise, pcap_loop() would not know how to use the function. So we use this format as the prototype for our callback function:
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);
Let's examine this in more detail. First, you'll notice that the function has a void return type. This is logical, because pcap_loop() wouldn't know how to handle a return value anyway. The first argument corresponds to the last argument of pcap_loop(). Whatever value is passed as the last argument to pcap_loop() is passed to the first argument of our callback function every time the function is called. The second argument is the pcap header, which contains information about when the packet was sniffed, how large it is, etc. The pcap_pkthdr structure is defined in pcap.h as:
struct pcap_pkthdr { struct timeval ts; /* time stamp */ bpf_u_int32 caplen; /* length of portion present */ bpf_u_int32 len; /* length this packet (off wire) */ };
These values should be fairly self explanatory. The last argument is the most interesting of them all, and the most confusing to the average novice pcap programmer. It is another pointer to a u_char, and it points to the first byte of a chunk of data containing the entire packet, as sniffed by pcap_loop().
But how do you make use of this variable (named "packet" in our prototype)? A packet contains many attributes, so as you can imagine, it is not really a string, but actually a collection of structures (for instance, a TCP/IP packet would have an Ethernet header, an IP header, a TCP header, and lastly, the packet's payload). This u_char pointer points to the serialized version of these structures. To make any use of it, we must do some interesting typecasting.
First, we must have the actual structures define before we can typecast to them.
/* Ethernet addresses are 6 bytes */ #define ETHER_ADDR_LEN 6 /* Ethernet header */ struct sniff_ethernet { u_char ether_dhost[ETHER_ADDR_LEN]; /* Destination host address */ u_char ether_shost[ETHER_ADDR_LEN]; /* Source host address */ u_short ether_type; /* IP? ARP? RARP? etc */ }; /* IP header */ struct sniff_ip { u_char ip_vhl; /* version << 4 | header length >> 2 */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; #define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) #define IP_V(ip) (((ip)->ip_vhl) >> 4) /* TCP header */ typedef u_int tcp_seq; struct sniff_tcp { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ u_char th_offx2; /* data offset, rsvd */ #define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4) u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ };
So how does all of this relate to pcap and our mysterious u_char pointer? Well, those structures define the headers that appear in the data for the packet. So how can we break it apart? Be prepared to witness one of the most practical uses of pointers (for all of those new C programmers who insist that pointers are useless, I smite you).
Again, we're going to assume that we are dealing with a TCP/IP packet over Ethernet. This same technique applies to any packet; the only difference is the structure types that you actually use. So let's begin by defining the variables and compile-time definitions we will need to deconstruct the packet data.
/* ethernet headers are always exactly 14 bytes */ #define SIZE_ETHERNET 14 const struct sniff_ethernet *ethernet; /* The ethernet header */ const struct sniff_ip *ip; /* The IP header */ const struct sniff_tcp *tcp; /* The TCP header */ const char *payload; /* Packet payload */ u_int size_ip; u_int size_tcp;
And now we do our magical typecasting:
ethernet = (struct sniff_ethernet*)(packet); ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); size_ip = IP_HL(ip)*4; if (size_ip < 20) { printf(" * Invalid IP header length: %u bytes\n", size_ip); return; } tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip); size_tcp = TH_OFF(tcp)*4; if (size_tcp < 20) { printf(" * Invalid TCP header length: %u bytes\n", size_tcp); return; } payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);
How does this work? Consider the layout of the packet data in memory. The u_char pointer is really just a variable containing an address in memory. That's what a pointer is; it points to a location in memory.
For the sake of simplicity, we'll say that the address this pointer is set to is the value X. Well, if our three structures are just sitting in line, the first of them (sniff_ethernet) being located in memory at the address X, then we can easily find the address of the structure after it; that address is X plus the length of the Ethernet header, which is 14, or SIZE_ETHERNET.
Similarly if we have the address of that header, the address of the structure after it is the address of that header plus the length of that header. The IP header, unlike the Ethernet header, does not have a fixed length; its length is given, as a count of 4-byte words, by the header length field of the IP header. As it's a count of 4-byte words, it must be multiplied by 4 to give the size in bytes. The minimum length of that header is 20 bytes.
The TCP header also has a variable length; its length is given, as a number of 4-byte words, by the "data offset" field of the TCP header, and its minimum length is also 20 bytes.
So let's make a chart:
| Variable | Location (in bytes) |
| sniff_ethernet | X |
| sniff_ip | X + SIZE_ETHERNET |
| sniff_tcp | X + SIZE_ETHERNET + {IP header length} |
| payload | X + SIZE_ETHERNET + {IP header length} + {TCP header length} |
The sniff_ethernet structure, being the first in line, is simply at location X. sniff_ip, who follows directly after sniff_ethernet, is at the location X, plus however much space the Ethernet header consumes (14 bytes, or SIZE_ETHERNET). sniff_tcp is after both sniff_ip and sniff_ethernet, so it is location at X plus the sizes of the Ethernet and IP headers (14 bytes, and 4 times the IP header length, respectively). Lastly, the payload (which doesn't have a single structure corresponding to it, as its contents depends on the protocol being used atop TCP) is located after all of them.
So at this point, we know how to set our callback function, call it, and find out the attributes about the packet that has been sniffed. It's now the time you have been waiting for: writing a useful packet sniffer. Because of the length of the source code, I'm not going to include it in the body of this document. Simply download sniffex.c and try it out.
At this point you should be able to write a sniffer using pcap. You have learned the basic concepts behind opening a pcap session, learning general attributes about it, sniffing packets, applying filters, and using callbacks.
This document is Copyright 2002 Tim Carstens. All rights reserved. Redistribution and use, with or without modification, are permitted provided that the following conditions are met: