How can i use events and parameters in portal 9.0.2 ?

I try to use an search portlet and a report portlet displayd at the same page. If i submit a search the list report portlet should give the correct output. How must i set up the event in the search portlet?

Hi,
The wwsto_api_session is available in 902. It has not been removed. Try granting it to the user.
Thanks,
Sharmila

Similar Messages

  • How can I use undo and redo with run time menu?

    Hi..I try to built my own menu for graphic programming. How can I use undo and redo in labview with run time menu?

    filozof-
    During runtime, by default, LabVIEW has undo/redo data changes under the edit menu. This will undo/redo changes made to controls during runtime. If you want a more extensive undo/redo (custom for your application), you are going to have to do quite a few things
    1) Create a custom runtime menu (Edit>>RunTime Menu) and place your own undo/redo controls on it
    2) Keep an action history in your program
    3) Catch the Shortcut menu event for your custom undo/redo controls
    4) Reverse the last action in your histroy when you catch the event
    This method would allow you undo entire operations (like resize, move, or whatever kind of functionality you are building into your application) unstead of just undoing data changes.
    Xaq

  • How can I use OmniPortlet and Web Clipping Portlet?

    How can I use OmniPortlet and Web Clipping Portlet?

    You find information on OmniPortlet and Web Clipping in the Portal Developer's Guide.
    o Building Portlets with OmniPortlet
    o Building Content-Based Portlets with Web Clipping
    Peter

  • How can I use excel and word on the IPAD2

    How can I use excel and word documents on my Ipad 2

    There are apps such as Documents To Go which support reading/editting/creating those sorts of documents :
    standard version  -  http://itunes.apple.com/us/app/documents-to-go-office-suite/id317117961?mt=8
    premium version  -  http://itunes.apple.com/us/app/documents-to-go-premium-office/id317107309?mt=8

  • I have lost all of my keynote templates now that I have upgraded to yosemite.  How can I use Keynotes and pages etc on my computer and not on the cloud.

    I have lost all of my previously created keynote templates now that I have upgraded to yosemite. How can I use Keynotes and pages etc on my computer and not on the cloud.

    Welcome to Apple Support Communities
    All iWork apps allow you to save your documents on your computer. You will be able to choose the destination when you want to save a document.
    You can also disable iCloud for some apps. To do that, go to System Preferences -> iCloud, press "Options" next to "iCloud Drive" and disable the apps you want to.
    If you have lost your old documents, you should have a backup that you made before upgrading to OS X Yosemite, so you only have to restore it.

  • How do i use ranges and parameters together?

    Plz help me...
    I have a selection screen with about 8 parameters out of which two are mandatory, i.e. a flag and the date of creation. What I need to do is delete certain entries from a database table based on the parameters input by the user. Now the problem is when i am using the delete statement using where statement..
    delete from zinbd_delv where vbeln     = vbeln    and             
                                 posnr     = posnr    and
                                 lfimg     = lfimg    and
                                 lfdat     = lfdat    and
                                 created  = created and
                                 status   = status.
    But suppose the user enters data in only the two mandatory fields and say status = 'X' and created = 'XX/XX/XXXX'. In that case it should delete all the entries from the table where status = X and creation date as specified but since it will find the other parameters as blank it will fail. Can we use range table for this...plz tell me how to do it.

    i think if you are using parameters then you have to enter the value in that.
    or
    select-options : sop for mara-matnr no intervals no-extension.
    for single entry.
    data : itab like zinbd_delv occurs 0 with header line.
    select * from zinbd_delv ito table itab where vbeln in vbeln and
    posnr in posnr and
    lfimg in lfimg and
    lfdat in lfdat and
    created in created and
    status in status.
    delete zinbd_delv from table itab.
    commit work.
    regards
    shiba dutta

  • How can I use Spark and Mx Components in a NativeWindow?

    Hi,
    First of all, please, excuse my english... I'll try to express in the best way I can...
    I'm working in a AIR application, with Flash, Flex Builder y Action Script 3. I'm creating a new interface, and the main class extends from NativeWindow. The design and look&feel of my application is much different so I plan to create my own components, but I want to use some Spark or mx components and make some skinning or styling.
    When I've tried add some components in the stage of my main class (NativeWindow), the component doesn't appear or a compilation error if a try differents ad bizarre things. After reading and searching a lot. I think that Spark or MX component need a Spark or MX container. I've done some tests and if I add a WindowedApplication, I can use Spark/MX components, but I have two differents "windows": my own window and the Spark window.
    What am I searching? I solution to add Spark/MX components under my NativeWindow and integrate with the rest of my components.
    My main MXML file is:
    <?xml version="1.0" encoding="utf-8"?>
    <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            xmlns:b="*"
            xmlns:a="com.copmadrid.arioco.window.*"  windowActivate="this.close()">
    <fx:Declarations>
      <!-- Place non-visual elements (e.g., services, value objects) here -->
      <a:MainWindow id="ariocoWindow">
      </a:MainWindow>
    </fx:Declarations>
    </s:WindowedApplication>
    In Declarations, I create my own window. If I add Spark/MX components in this file, they're added in another Flex-like window. I have two windows. For this reason I put this.close() to close the Flex Window. It's a trick for the moment.
    Inside <a:MainWindow>, I can't add anything becouse Flex Builder 4 said that I can't add component in declaration - trying to add a component inside the NativeWindow. If I add Spark/MX components in the ActionScript class of MainWindow, even if I add a Spark WindowedApplication, they aren't appear.
    I have to ways, and I'll be very thankful if someone could help me:
    1. How can add in the MXML file Spark/MX components under the MainWindow after the delcaration block. I've searched but I haven't found a way to do it.
    2. Inside de ActionScript class file of MainWindow, add Spark/MX components but I supposse that I have to make an instance of a class that I can add to the stage of MainClase (extends from  NativeWindow) and will be visible there and a valid container for Spark/MX components. I have no idea about which class could be a bridge between NativeWindow and a valid Spark/MX coontainer.
    Thanks in advance! Greetings from Spain!!!

    Spark.components.Window is used for secondary windows.

  • How can we use Cloudscape and JDBC, JNDI

    Hello all,
    I was trying to install the example included in the J2EE called RMS but have problems to do that.
    I got this message:
    reference java:comp/env/CloudscapeDB is using a JNDI name that is not bound jdbc/CloudscapeDB
    How can I edit in the default file in J2EE.
    Please help.
    Thank you

    Please, help and reply

  • How can i use minutes and seconds in my job interval

    Sir,
    I want to use minutes and seconds in my job interval.
    suppose i want to run my job on 1:15:10 AM what will be the syntax. my code is below.
    Declare
    jobno number;
    BEGIN
    DBMS_JOB.SUBMIT(jobno,'DEL_DEPT;',trunc(SYSDATE + 1) + (1/24),'trunc(SYSDATE + 1) + (1/24)');
    END;
    Thanks in advance.

    Declare
    jobno number;
    BEGIN
    DBMS_JOB.SUBMIT(jobno,'DEL_DEPT;','trunc(SYSDATE + 1) + 4510/86400','trunc(SYSDATE + 1) + 4510/86400');
    END;
    number of hours in a day = 24
    number of minutes in a day = (24 * 60) = 1440
    number of seconds in a day = (24 * 60 * 60) = 86400
    4510 is the number of seconds in 1 hour 15 minutes and 10 seconds.

  • How can i use the AND opperator to AND to arrays

    hi, i have two large arrays of booleans and i need to copy all the true values from array 1 to array2 without losing the trues that are already in array 2. From my knowledge of asm, i know that using the AND opperator is perfect for this, seeing as each boolean only takes one bit.
    Searching and is kinda useless, so my search failed, could someone give me a quick code example, say x = 1 AND 2 or something. Thats all i need, thanks.
    PS: x should = 3
    Message was edited by:
    dead

    thanks guys, and btw, if your trying to join two arrays like i am, its OR, not AND, lol woops, not enough coffee.
    EDIT: now ive just been playing around and it appears you cant OR arrays, im guessing theres no way around this than to just increment through each one. This code needs to be as fast as possible as its in a loop, so if anyone who has a lot of experience with computers has a better way please let me know. I was originally going to make my code in assembler, and just read the array as an qword and OR it, then read it as an array again, but to be truthful im not entirely sure if its faster to to OR a qword once or a bit 64 times, lol.

  • How can I use Drap and Drop in Linux system?

    I try to use DnD in a item from "explorer" in Linux into my application, but it does atually not work. The same version is work well on Windows. Below is code (3 separated files):
    * FileAndTextTransferHandler.java is used by the 1.4
    * DragFileDemo.java example.
    import java.io.*;
    import java.util.*;
    import java.awt.*;
    import java.awt.datatransfer.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
    class FileAndTextTransferHandler extends TransferHandler {
        private DataFlavor fileFlavor, stringFlavor;
        private TabbedPaneController tpc;
        private JTextArea source;
        private boolean shouldRemove;
        protected String newline = "\n";
        //Start and end position in the source text.
        //We need this information when performing a MOVE
        //in order to remove the dragged text from the source.
        Position p0 = null, p1 = null;
        FileAndTextTransferHandler(TabbedPaneController t) {
           tpc = t;
           fileFlavor = DataFlavor.javaFileListFlavor;
           stringFlavor = DataFlavor.stringFlavor;
        public boolean importData(JComponent c, Transferable t) {
            JTextArea tc;
            if (!canImport(c, t.getTransferDataFlavors())) {
                return false;
            //A real application would load the file in another
            //thread in order to not block the UI.  This step
            //was omitted here to simplify the code.
            try {
                if (hasFileFlavor(t.getTransferDataFlavors())) {
                    String str = null;
                    java.util.List files =
                         (java.util.List)t.getTransferData(fileFlavor);
                    for (int i = 0; i < files.size(); i++) {
                        File file = (File)files.get(i);
                        //Tell the tabbedpane controller to add
                        //a new tab with the name of this file
                        //on the tab.  The text area that will
                        //display the contents of the file is returned.
                        tc = tpc.addTab(file.toString());
                        BufferedReader in = null;
                        try {
                            in = new BufferedReader(new FileReader(file));
                            while ((str = in.readLine()) != null) {
                                tc.append(str + newline);
                        } catch (IOException ioe) {
                            System.out.println(
                              "importData: Unable to read from file " +
                               file.toString());
                        } finally {
                            if (in != null) {
                                try {
                                    in.close();
                                } catch (IOException ioe) {
                                     System.out.println(
                                      "importData: Unable to close file " +
                                       file.toString());
                    return true;
                } else if (hasStringFlavor(t.getTransferDataFlavors())) {
                    tc = (JTextArea)c;
                    if (tc.equals(source) && (tc.getCaretPosition() >= p0.getOffset()) &&
                                             (tc.getCaretPosition() <= p1.getOffset())) {
                        shouldRemove = false;
                        return true;
                    String str = (String)t.getTransferData(stringFlavor);
                    tc.replaceSelection(str);
                    return true;
            } catch (UnsupportedFlavorException ufe) {
                System.out.println("importData: unsupported data flavor");
            } catch (IOException ieo) {
                System.out.println("importData: I/O exception");
            return false;
        protected Transferable createTransferable(JComponent c) {
            source = (JTextArea)c;
            int start = source.getSelectionStart();
            int end = source.getSelectionEnd();
            Document doc = source.getDocument();
            if (start == end) {
                return null;
            try {
                p0 = doc.createPosition(start);
                p1 = doc.createPosition(end);
            } catch (BadLocationException e) {
                System.out.println(
                  "Can't create position - unable to remove text from source.");
            shouldRemove = true;
            String data = source.getSelectedText();
            return new StringSelection(data);
        public int getSourceActions(JComponent c) {
            return COPY_OR_MOVE;
        //Remove the old text if the action is a MOVE.
        //However, we do not allow dropping on top of the selected text,
        //so in that case do nothing.
        protected void exportDone(JComponent c, Transferable data, int action) {
            if (shouldRemove && (action == MOVE)) {
                if ((p0 != null) && (p1 != null) &&
                    (p0.getOffset() != p1.getOffset())) {
                    try {
                        JTextComponent tc = (JTextComponent)c;
                        tc.getDocument().remove(
                           p0.getOffset(), p1.getOffset() - p0.getOffset());
                    } catch (BadLocationException e) {
                        System.out.println("Can't remove text from source.");
            source = null;
        public boolean canImport(JComponent c, DataFlavor[] flavors) {
            if (hasFileFlavor(flavors))   { return true; }
            if (hasStringFlavor(flavors)) { return true; }
            return false;
        private boolean hasFileFlavor(DataFlavor[] flavors) {
            for (int i = 0; i < flavors.length; i++) {
                if (fileFlavor.equals(flavors)) {
    return true;
    return false;
    private boolean hasStringFlavor(DataFlavor[] flavors) {
    for (int i = 0; i < flavors.length; i++) {
    if (stringFlavor.equals(flavors[i])) {
    return true;
    return false;
    * TabbedPaneController.java is used by the 1.4
    * DragFileDemo.java example.
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    * Class that manages area where the contents of
    * files are displayed.  When no files are present,
    * there is a simple JTextArea instructing users
    * to drop a file.  As soon as a file is dropped,
    * a JTabbedPane is placed into the window and
    * each file is displayed under its own tab.
    * When all the files are removed, the JTabbedPane
    * is removed from the window and the simple
    * JTextArea is again displayed.
    public class TabbedPaneController {
        JPanel tabbedPanel = null;
        JTabbedPane tabbedPane;
        JPanel emptyFilePanel = null;
        JTextArea emptyFileArea = null;
        FileAndTextTransferHandler transferHandler;
        boolean noFiles = true;
        String fileSeparator;
        public TabbedPaneController(JTabbedPane tb, JPanel tp) {
            tabbedPane = tb;
            tabbedPanel = tp;
            transferHandler = new FileAndTextTransferHandler(this);
            fileSeparator = System.getProperty("file.separator");
            //The split method in the String class uses
            //regular expressions to define the text used for
            //the split.  The forward slash "\" is a special
            //character and must be escaped.  Some look and feels,
            //such as Microsoft Windows, use the forward slash to
            //delimit the path.
            if ("\\".equals(fileSeparator)) {
                fileSeparator = "\\\\";
            init();
        public JTextArea addTab(String filename) {
            if (noFiles) {
                tabbedPanel.remove(emptyFilePanel);
                tabbedPanel.add(tabbedPane, BorderLayout.CENTER);
                noFiles = false;
            String[] str = filename.split(fileSeparator);
            return makeTextPanel(str[str.length-1], filename);
        //Remove all tabs and their components, then put the default
        //file area back.
        public void clearAll() {
            if (noFiles == false) {
                tabbedPane.removeAll();
                tabbedPanel.remove(tabbedPane);
            init();
        private void init() {
            String defaultText =
                "Select one or more files from the file chooser and drop here...";
            noFiles = true;
            if (emptyFilePanel == null) {
                emptyFileArea = new JTextArea(20,15);
                emptyFileArea.setEditable(false);
                emptyFileArea.setDragEnabled(true);
                emptyFileArea.setTransferHandler(transferHandler);
                emptyFileArea.setMargin(new Insets(5,5,5,5));
                JScrollPane fileScrollPane = new JScrollPane(emptyFileArea);
                emptyFilePanel = new JPanel(new BorderLayout(), false);
                emptyFilePanel.add(fileScrollPane, BorderLayout.CENTER);
            tabbedPanel.add(emptyFilePanel, BorderLayout.CENTER);
            tabbedPanel.repaint();
            emptyFileArea.setText(defaultText);
        protected JTextArea makeTextPanel(String name, String toolTip) {
            JTextArea fileArea = new JTextArea(20,15);
            fileArea.setDragEnabled(true);
            fileArea.setTransferHandler(transferHandler);
            fileArea.setMargin(new Insets(5,5,5,5));
            JScrollPane fileScrollPane = new JScrollPane(fileArea);
            tabbedPane.addTab(name, null, (Component)fileScrollPane, toolTip);
            tabbedPane.setSelectedComponent((Component)fileScrollPane);
            return fileArea;
    * DragFileDemo.java is a 1.4 example that
    * requires the following file:
    *    FileAndTextTransferHandler.java
    *    TabbedPaneController.java
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;
    public class DragFileDemo extends JPanel
                              implements ActionListener {
        JTextArea fileArea;
        JFileChooser fc;
        JButton clear;
        TabbedPaneController tpc;
        public DragFileDemo() {
            super(new BorderLayout());
            fc = new JFileChooser();;
            fc.setMultiSelectionEnabled(true);
            fc.setDragEnabled(true);
            fc.setControlButtonsAreShown(false);
            JPanel fcPanel = new JPanel(new BorderLayout());
            fcPanel.add(fc, BorderLayout.CENTER);
            clear = new JButton("Clear All");
            clear.addActionListener(this);
            JPanel buttonPanel = new JPanel(new BorderLayout());
            buttonPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
            buttonPanel.add(clear, BorderLayout.LINE_END);
            JPanel upperPanel = new JPanel(new BorderLayout());
            upperPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
            upperPanel.add(fcPanel, BorderLayout.CENTER);
            upperPanel.add(buttonPanel, BorderLayout.PAGE_END);
            //The TabbedPaneController manages the panel that
            //contains the tabbed pane.  When there are no files
            //the panel contains a plain text area.  Then, as
            //files are dropped onto the area, the tabbed panel
            //replaces the file area.
            JTabbedPane tabbedPane = new JTabbedPane();
            JPanel tabPanel = new JPanel(new BorderLayout());
            tabPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
            tpc = new TabbedPaneController(tabbedPane, tabPanel);
            JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                upperPanel, tabPanel);
            splitPane.setDividerLocation(400);
            splitPane.setPreferredSize(new Dimension(530, 650));
            add(splitPane, BorderLayout.CENTER);
        public void setDefaultButton() {
            getRootPane().setDefaultButton(clear);
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == clear) {
                tpc.clearAll();
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
        private static void createAndShowGUI() {
            //Make sure we have nice window decorations.
            JFrame.setDefaultLookAndFeelDecorated(true);
            //Create and set up the window.
            JFrame frame = new JFrame("DragFileDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Create and set up the menu bar and content pane.
            DragFileDemo demo = new DragFileDemo();
            demo.setOpaque(true); //content panes must be opaque
            frame.setContentPane(demo);
            //Display the window.
            frame.pack();
            frame.setVisible(true);
            demo.setDefaultButton();
        public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();

    I'm currently using Linux Fedora system.
    Doesn't matter. There's no standard way for D&D on Linux, no single API.
    Every application has its own mechanism which may or may not be compatible with any other.
    Gnome and KDE groups are doing some work to provide a common standard but as you know the Linux zealots are completely opposed to anyone telling them what to do (such as creating standards) and won't in general follow them.

  • How can I use REQ1 and REQ2 at the same time to send two different groups of data to two blocks of buffers?

    I want to use REQ1 to send data1(16bits) in th rate of 10MHZ to buffer1 and REQ2 to send data2(16bits) in the rate of 1KHz to buffer2. The first part(sending data1) has been done(using the attached file).How to re-cofigure the ports to send data2 to buffer2?
    Attachments:
    DIsingleBufExtTrig653x.C ‏6 KB

    Greetings,
    Essentially, this is a matter of duplicating this code for use with the second group. However, be certain to change the group parameter to 2 for the function calls being used with the second group.
    Good luck with your application.
    Spencer S.

  • HT204053 how can i use iTune and Apple apps to doenload applications without using credit card or gift cards?

    Hi Team,
    I have brought new iPhone, and was trying to install Skype & other applications. while using itune its asking for review, and then in registration page asking for
    "Credit card' details..
    help me to know the way without credit cards or gift cards.

    If you only want the free apps, take a look here:
    http://support.apple.com/kb/HT2534
    Read the steps carefully as the order in which you follow them is  critical. Note that you can do this only when creating a new Apple ID. You cannot use an existing ID. 
    You will of course not be able to get anything other than the free apps without entering in some sort of payment method (credit card, prepaid iTunes card, gift certificate, etc.)
    Regards.
    Forum Tip: Since you're new here, you've probably not discovered the Search feature available on every Communities page, but next time, it might save you time (and everyone else from having to answer the same question multiple times) if you search a couple of ways for a topic, both in the relevant forums and in the Apple Knowledge Base, before you post a question.

  • How can I use the procedure parameters here?

    The problem in the following procedure is that the embedded javascript uses the parameter OBJ_NAME and OBJ_VALUE -> that doens't work.. how to solve this? It would be a pleasure for me if this procedure works! greetings Koen
    PROCEDURE KOEN.PROC_SET_FIELD (OBJ_NAME IN VARCHAR2, OBJ_VALUE IN VARCHAR2) as
    begin
    htp.htmlOpen; htp.headOpen;
    htp.p('<SCRIPT language = "JavaScript1.2">');
    htp.p('for (i=0; i < document.forms[0].length - 1; i++)');
    htp.p('{');
    htp.p('var v_name = document.forms[0].elements.name;');
    htp.p('if (v_name.indexOf("." + OBJ_NAME + ".") != -1)');
    htp.p('document.forms[0].elements[i].value = OBJ_VALUE;');
    htp.p('}');
    htp.p('</script>');
    htp.headClose; htp.htmlClose;
    end;

    Hi,
    it looks as if you are creating a new page to hold your javascript.
    the javascript must be on the same page as the form for the code to work.
    put the PL/SQL to generate the javascript code into the "after generating the form" section in the portal form.
    Regards Michael

  • Could you please tell me, how can you, using Lookout and Field Point, program on/off relay actions using a calendar?

    It´s a on/off illuminating ssystem control. Shure the user will need a calendar programing tool to program weekdays, holidays, etc. on of functions.

    Hi Galileo,
    See the following for Lookout side of things:
    http://exchange.ni.com/servlet/ProcessRequest?RHIVEID=101&RPAGEID=135&HOID=506500000008000000DBE90000&USEARCHCONTEXT_CATEGORY_0=_9_&USEARCHCONTEXT_CATEGORY_S=0&UCATEGORY_0=_9_&UCATEGORY_S=0
    As for FieldPoint, you can talk to it from Lookout in couple of ways -- either directly using the native FieldPoint object, or via OPC using the OPCFieldPoint object.
    Based on the timers from above, you would turn On/Off the relays (on the RLY-420 module of your FieldPoint).
    That's in a nutshell. Write back if you have specific questions.
    Good luck!
    Khalid

Maybe you are looking for

  • User exit in the transport proccess by stms

    Hello everyone, I need to do some "abaps" in the event of transporting objects from one enviroment to an other (dev to qa to prod). I know i can make an enhancment in the standard transaction STMS cause i'm in ecc6 version. But, as a programmer, i'm

  • Import only jpg files from a camera that shoots RAW+jpg?

    Is there a way to import only jpg files from a camera that shoots both RAW+jpg? I only want the small jpgs copied, not the RAW file. I have the USB adapter and am about to go on vacation and wanted to use my iPad to upload pictures to Facebook on the

  • SAPRouter Status : Host did not respond

    Hi, When I try to open service connections some times I get it connected. But some times I get this message( Host did not respond ) with a warning sign on it. Please suggest what could be the problem? And why it is just a warning? Thanks & Regards Mr

  • CS3 under 10.6.7 gives Access Privileges error

    Alright. Here's the error message: So we encountered this problem on a teacher's iMac (20" early 2008 models w/ ATi graphics running 10.6.7) last week. I have encountered this before and normally, the steps outlined on this Adobe KB article for deali

  • Mighty Mouse (wired) freezes sometimes. unplugging and replugging fixes it.

    Not a big problem but kind of aggravating at times. The cursor freezes on the screen and the keyboard will not work. When I unplug the keyboard for about 5 seconds and plug it back in it is fine. I AM using an extension cable to extend the keyboard b