Setting PYTHONPATH using bash
I'm trying to ensure that the PYTHONPATH environment variable in bash always contains a certain directory. The line to do this is, as far as I understand:
export PYTHONPATH="/path/to/directory":$PYTHONPATH
This works if I put it in ~/.profile or ~/.bashrc, but I have to run 'source ~/.profile' or 'source ~/.bashrc' to make PYTHONPATH include /path/to/directory in any Terminal sessions. My question is: how do I make this effective in every Terminal session, without having to use the source command?
Thanks.
~/.profile should work provided you don't have ~/.bash_profile or ~/.bash_login set up already. those files get sourced first and if one of them exists then ~/profile won't get sourced when you start a terminal session.
put your command in ~/.bash_profile and it should execute for sure.
see
man bash
for more info.
Similar Messages
-
Issue in setting classpath using bash
I tried creating a script file for executing my java code in my linux machine.Below is the script which i created.
#!/bin/sh
HOME=`pwd`
JAVA_HOME=$HOME/jre
CLASSES=$HOME/classes
CLASS_PATH=$CLASSES/Testing.jar:$CLASSES/server/Server.jar
"${JAVA_HOME}"/bin/java -cp "$CLASS_PATH" 'com.project.testing.Tester' '10000'
It worked perfectly.But if i put this script in a directory containing spaces in its name, it is not working and it is throwing the below exception
Exception in thread "main" java.lang.NoClassDefFoundError: com/project/testing/Tester
So i modified the script to escape the spaces in the class path variable.Below is the modified script
#!/bin/sh
HOME=`pwd`
JAVA_HOME=$HOME/jre
CLASSES=$HOME/classes
CLASS_PATH=$CLASSES/Testing.jar:$CLASSES/server/Server.jar
CLASS_PATH=$(echo $CLASS_PATH | sed 's/ /\\ /g')
"${JAVA_HOME}"/bin/java -cp "$CLASS_PATH" 'com.project.testing.Tester' '10000'
But still i am getting the same exception.
Please help me to solve this problemjulians wrote:
>
You think?? Why don't you just find out? The classpath is one of the system properties, so just write a Java program which simply writes all of the system properties to stdout. Then look at the system property which contains the classpath.
Sorry you didn't understand my question.Your answer is irrelevant to my questionThen you should explain your question better, using something less totally useless than "not working".
My question is I can read.
It has nothing to do with bash.There is some issue with java in the way it treats the argument after -cp option.If i can find out why should i post it here?.No. Java isn't treating any arguments. Your shell (bash) is treating the arguments. If you think it's Java, then you should investigate that. Which is why I posted what I did. If you think it's irrelevant then it must not be Java causing the problem. Of course you didn't even try it. Time-waster.
Please simulate this issue and respond to my postYou want me to buy a computer and install bash and try to reproduce your problem? Don't be ridiculous. Do your own work. -
Using bash as your file manager?
Hello,
My belief is that all file managers suck. There are no exceptions to this. So, for the past few months, I've been sourcing a file with a bunch of tricks I've invented / found through browsing the web to make using just bash as a file manager much more convenient.
Here's what I currently use:
# fm v1.9.1 by Kiah Morante
# A very simple file manager.
# Depends on pycp/pymv, http://github.com/yannicklm/pycp and feh
# 'source' this file in a BASH shell
showHidden=0 # Hidden files not shown
showDetails=0 # ls is replaced with ls -lh if showDetails is 1
shopt -s autocd # cd to a dir just by typing its name
PROMPT_COMMAND='[[ ${__new_wd:=$PWD} != $PWD ]] && list; __new_wd=$PWD' # ls after cding
# Shortcuts
source ~/.config/fm/shortcuts # Call all custom shortcuts
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias h='cd ~'
alias n='cd "$n"'
# Keybindings
bind '"\C-l":"list\C-m"'
bind '"\C-h":"hide\C-m"'
bind '"\C-o":"details\C-m"'
bind '"\C-f":"makedir\C-m"'
bind '"\C-n":"n\C-m"'
bind '"\C-y":"cpwd\C-m"'
bind '"\C-p":"cd "$OLDPWD"\C-m"' # Hint: You could also type '~-'
# FM prompt appearance
if [[ $(whoami) == 'root' ]]; then
# So that the user knows if they have root privileges:
PS1="\[\e[0;32\]mf\[m\e[m\] \[\e[0;31m\]root\[\e[m\] \[\e[0;34m\]\w \[\e[m\]\[\e[0;31m\]> \[\e[m\]"
else
PS1="\[\e[0;32\]mf\[m\e[m\] \[\e[0;34m\]\w \[\e[m\]\[\e[0;31m\]> \[\e[m\]"
fi
# Functions
# Usage
fmhelp () {
echo "hide - toggle hidden (hidden by default)
ls - lists contents of dir(s) passed in args.
lsd - list directories
cd - changed to directory \$1
cp \$@ \$2 - copies file from \$1 to \$2
mv \$@ \$2 - moves file from \$1 to \$2
rm \$@ - deletes \$@
sc \$1 \$2 - make a shortcut called \$1 pointing to \$2. If no \$2 is passed, it is evaluated as \$PWD
cpwd - copy current working directory
.., ..., .... - cd .. etc.
o \$1 - opens \$1 with xdg-open
hm - how many files are in the current directory
details - show file details (ls -lh)
fmhelp - this help menu
n - Intelligent guess of the next dir you wish to cd to. Last $1 in open, list, or makedir; last argument in copy or move; pwd before a cd
~- - BASH shortcut for \$OLDPWD
img - feh frontend with the following usage:
img -t \$2 - views the dirs/images specified in \$2..\$n as clickable thumbnails
img -s \$2 \$3 - views the images specified in \$3..\$n as a slideshow with a slide change speed of \$2 seconds
img \$@ - views the dirs/images specified
Shortkeys:
Ctrl-f - mkdir
Ctrl-h - hide
Ctrl-l - ls
Ctrl-n - cd \$n
Ctrl-o - details
Ctrl-p - cd \$OLDPWD
Ctrl-y - cpwd
Ctrl-u - clear line # urxvt default"
# Toggle display hidden files
# If $showHidden is 1, hidden files are shown
hide () {
showHidden=$(( 1 - $showHidden ))
list
# Toggle display file details
# If $showDetails is 1, file details are shown
details () {
showDetails=$(( 1 - $showDetails ))
list
# ls
listToggle () {
if [[ $showHidden == 1 && $showDetails == 1 ]]; then
ls -C --color -A -lh "$dir"
elif [[ $showHidden == 1 && $showDetails == 0 ]]; then
ls -C --color -A "$dir"
elif [[ $showHidden == 0 && $showDetails == 1 ]]; then
ls -C --color -lh "$dir"
else
ls -C --color "$dir"
fi
list () {
clear # Unclutter the screen
# List pwd if no $1
if [[ $@ == "" ]]; then
set '.'
fi
# List multiple folders:
for dir in "$@"
do
listToggle
done
n="$1" # See 'n' in fmhelp
# use feh to view thumbnails/images/slideshow
img () {
case "$1" in
-t) nohup feh --thumbnails "${@:2}" --thumb-height 120 --thumb-width 120 -S filename -d --cache-thumbnails -B black > /dev/null 2>&1 & ;;
-s) nohup feh "${@:3}" -S filename -d -B black --slideshow-delay "$2" > /dev/null 2>&1 & ;;
*) nohup feh "$@" -S filename -d -B black > /dev/null 2>&1 & ;;
esac
list
# cp
copy () {
if [[ $showHidden == 1 ]]; then
pycp --interactive --all "$@"
else
pycp --interactive "$@"
fi
list
n="${@:(-1)}" # n is the last argument (where stuff is moved to)
# mv
move () {
if [[ $showHidden == 1 ]]; then
pymv --interactive --all "$@"
else
pymv --interactive "$@"
fi
list
n="${@:(-1)}"
makedir () {
if [[ $1 == "" ]]; then
read -e n
set "$n"
fi
if mkdir -- "$1"; then
list # Update pwd to show new dir(s) that have been made.
n="$1"
fi
# rm
remove () {
rm -rfI "$@"
list
# open files
o () {
# To use xdg-open
#nohup xdg-open "$1" > /dev/null 2>&1 &
if [ -f "$1" ] ; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) rar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.Z) uncompress "$1" ;;
*.7z) 7z x "$1" ;;
*.pdf) nohup zathura "$1" > /dev/null 2>&1 & ;;
*.html) nohup luakit "$1" > /dev/null 2>&1 & ;;
*.blend) nohup blender "$1" > /dev/null 2>&1 & ;;
*.avi) nohup mplayer "$1" ;;
*.wmv) nohup mplayer "$1" ;;
*.rmvb) nohup mplayer "$1" ;;
*.mp3) nohup urxvtc -si -sw -sh 30 -e mplayer "$1" > /dev/null 2>&1 & ;;
*.flv) nohup mplayer "$1" ;;
*.mp4) nohup mplayer "$1" ;;
*.ogg) nohup urxvt -si -sw -sh 30 -e mplayer "$1" > /dev/null 2>&1 & ;;
*.wav) nohup audacity "$1" > /dev/null 2>&1 & ;;
*.jpg) img "$1" ;;
*.jpeg) img "$1" ;;
*.JPG) img "$1" ;;
*.png) img "$1" ;;
*.gif) nohup gpicview "$1" > /dev/null 2>&1 & ;;
*) nohup urxvt -si -sw -sh 30 -e vim "$1" > /dev/null 2>&1 & ;;
esac
else
echo "'$1' is not a valid file"
fi
n="$1"
# Add shortcuts
makeShortcut () {
if [[ $2 == "" ]]; then
set $1 .
fi
echo ""$1"=\""$2"\"
alias "$1"='cd \""$2"\"'
" >> ~/.config/fm/shortcuts
source ~/.config/fm/shortcuts
# Copy pwd to clipboard
cpwd () {
echo \"$(pwd)\" | xclip
# List directories
lsd () {
ls -F "$@" | grep \/$
# Command aliases
alias mv="move"
alias sc="makeShortcut"
alias cp="copy"
alias ls="list"
alias rm="remove"
alias mkdir="makedir"
alias hm="ls -l . | egrep -c '^-'"
list # ls when fm starts
Could all of you fellow file manager-haters post your little tricks, whether just a few lines added to ~/.bashrc or fully fledged files that you source like mine?
Last edited by greenmanwitch (2011-02-07 19:58:40)3]) wrote: once you have video files cluttered all throughout your hard drive and folders all over, thats where the 'bash' filemanager system lacks its use in terms of effectiveness.
Actually, I found this to be one of the best advantages of using bash is that it forces a user to think about file organization and making useful naming schemes for files.
For example, instead of having 1000+ media files in one directory I subcategorize theme by genre or whatever, and then probably subcategorize them again.
Then I usually rename the files to something meaningful, like if I have 50 pictures of my kids birthday, just do a for each loop on the directory and rename all the files donovan_birthdayX.jpg where X is an integer incrementation.
essentially. just don't "have files cluttered all throughout you hard drive and folders all over". and your life will be much happier regardless of how you manage your files. -
Using BASH environment variables in xCode build configuration
Hi All,
Is it possible to use BASH environment variables (exported from /etc/profile, for example) in xcode build settings?
Specifically, I am exporting a "BOOST_HOME" variable, and would like to referencing this variable in "User Header Search Path", but the obvious $BOOST_HOME doesn't seem to work?
Thanks,
AndrewI don't know much about XCode -- but to set environment variables for GUI applications you need to edit ~/.MacOSX/environment.plist. There's a description here:
http://wiki.lyx.org/Mac/Environment
After editing that file I believe you have to logout and back in for the changes to take effect.
I swear I saw a GUI app to help edit that file, but I can't find it now... -
Hi. I am using the iPhone 4S and when I'm searching for places using Google it does not automatically detect my location. How do I change this? FYI...under settings i have it set at "Use new precise locations from my device."
If you are missing using google maps - try the Nokia map app called "here"
-
I want to set up my Epson printer using an Airport and RR router. The same Mac Book and printer was formerly set up using a HTC router. How do I reset computer so it communicates with printer?
http://support.apple.com/kb/HT3771
Mac 101: Printing (Mac OS X v10.6) -
Help! My new iPad Air was set up using my parents apple ID and iTunes account. How do i change it to my own ID and iTunes so that it is recognized as the main device?
Settings > iTunes & App Store > Sign Out.
Sign in with the correct ID.
JGreenzang wrote:
so that it is recognized as the main device?
There is no such thing. Please explain what is really meant by the above statement. -
I have moved to uk from ireland and bought new iphone, set up using my existing Apple ID account and profile but won't let me buy install or update apps??
Can anyone advise me on what I need to do?
My existing account is linked to ireland as my bank account details are there, does this make a difference?
Please help!Until you get a UK bank account and credit card, buy and redeem UK iTunes gift cards for use in the iTunes and Mac App Stores. But you need to switch your region/country to the UK store in your account information, as you can't use UK iTunes gift cards in the Irish stores, the gift cards are country specific.
-
I re-set password using specific user ID but when I put new password in it does not say incorrect password it just spins and spins never accepting it. What is the problem?
Update on my problem connecting in Itunes with my Airport Express. Not sure if anything I tried made a difference
but I finally got the Pop up window saying this device requires a Password. I entered the password and I can once again use the Airport Express as a remote speaker. -
How to Set and Use a global variable within a session?
Dear All,
I'm new to jsp, and would like to ask how to set and use a global variable within a session?
Thanks in advance.
Regards,
CecilWith session.setAttribute("name",object) you can store a Attribute in the session object.
with session.getAttribute("name") you can get it.
That's it.
Regards,
Geri -
I have pdf files in European languages and want to be able to enter non-English characters in the "find" function. How does one install other character sets for use with Acrobat Pro XI?
Have you tried applying the update by going to Help>Updates within Photoshop Lightroom? The update should be using the same licensing? Did you perhaps customize the installation location? Finally which operating system are you using?
-
How to use bash within sqlplus?
How to use bash within sqlplus?
meaning I am doing something like this to look for files within a particular directory with some condition.
N=0
for i in $(find . -path \*/waiting/* -type f -not -name "SS*" -mmin +120 -print) ; do
testarray[$N]="$i"
echo "$i"
let "N= $N + 1"
done
Output from above script is as follows:
/d1/d2/d3/d4/waiting/abcd.txt
/d1/d2/d31/d42/waiting/pqrs.txt
/d1/d2/d32/d43/waiting/xyz.txt
And now I want to input this data into database with help of insert.
and here is the little pl/sql block to insert the data with looping thing.
sqlplus $CONNECT <<-EOF
DECLARE
Counter integer :=1;
BEGIN
WHILE Counter <= ${no_of_files} LOOP
INSERT INTO stuck_files(COL_DATE,SER_NAME,TYPE_FILE,FILENAME,FILE_STATUS) VALUES (sysdate,'pqrs','pqrs','pqrs','pqrs');
Counter := Counter + 1;
END LOOP;
END;
commit;
exit;
EOF
Mapping is as follows:
COL_DATE,SER_NAME,TYPE_FILE,FILEFILENAME,FILE_STATUS
sysdate,d3,d4,abcd.txt,waiting
sysdate,d31,d42,pqrs.txt,waiting
sysdate,d32,d3,xyz.txt,waiting
any idea how to do that?
Edited by: user9274197 on Apr 28, 2013 5:09 PMuser9274197 wrote:
How to use bash within sqlplus?
meaning I am doing something like this to look for files within a particular directory with some condition.
N=0
for i in $(find . -path \*/waiting/* -type f -not -name "SS*" -mmin +120 -print) ; do
testarray[$N]="$i"
echo "$i"
let "N= $N + 1"
done
Output from above script is as follows:
/d1/d2/d3/d4/waiting/abcd.txt
/d1/d2/d31/d42/waiting/pqrs.txt
/d1/d2/d32/d43/waiting/xyz.txt
And now I want to input this data into database with help of insert.
and here is the little pl/sql block to insert the data with looping thing.
sqlplus $CONNECT <<-EOF
DECLARE
Counter integer :=1;
BEGIN
WHILE Counter <= ${no_of_files} LOOP
INSERT INTO stuck_files(COL_DATE,SER_NAME,TYPE_FILE,FILENAME,FILE_STATUS) VALUES (sysdate,'pqrs','pqrs','pqrs','pqrs');
Counter := Counter + 1;
END LOOP;
END;
commit;
exit;
EOF
Mapping is as follows:
COL_DATE,SER_NAME,TYPE_FILE,FILEFILENAME,FILE_STATUS
sysdate,d3,d4,abcd.txt,waiting
sysdate,d31,d42,pqrs.txt,waiting
sysdate,d32,d3,xyz.txt,waiting
any idea how to do that?
Edited by: user9274197 on Apr 28, 2013 5:09 PMhttp://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:439619916584
Cheers, -
Conversions between character sets when using exp and imp utilities
I use EE8ISO8859P2 character set on my server,
when exporting database with NLS_LANG not set
then conversion should be done between
EE8ISO8859P2 and US7ASCII charsets, so some
characters not present in US7ASCII should not be
successfully converted.
But when I import such a dump, all characters not
present in US7ASCII charset are imported to the database.
I thought that some characters should be lost when
doing such a conversions, can someone tell me why is it not so?Not exactly. If the import is done with the same DB character set, then no matter how it has been exported. Conversion (corruption) may happen if the destination DB has a different character set. See this example :
[ora102 work db102]$ echo $NLS_LANG
AMERICAN_AMERICA.WE8ISO8859P15
[ora102 work db102]$ sqlplus test/test
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 25 14:47:01 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
TEST@db102 SQL> create table test(col1 varchar2(1));
Table created.
TEST@db102 SQL> insert into test values(chr(166));
1 row created.
TEST@db102 SQL> select * from test;
C
¦
TEST@db102 SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[ora102 work db102]$ export NLS_LANG=AMERICAN_AMERICA.EE8ISO8859P2
[ora102 work db102]$ sqlplus test/test
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 25 14:47:55 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
TEST@db102 SQL> select col1, dump(col1) from test;
C
DUMP(COL1)
©
Typ=1 Len=1: 166
TEST@db102 SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[ora102 work db102]$ echo $NLS_LANG
AMERICAN_AMERICA.EE8ISO8859P2
[ora102 work db102]$ exp test/test file=test.dmp tables=test
Export: Release 10.2.0.1.0 - Production on Tue Jul 25 14:48:47 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in EE8ISO8859P2 character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P15 character set (possible charset conversion)
About to export specified tables via Conventional Path ...
. . exporting table TEST 1 rows exported
Export terminated successfully without warnings.
[ora102 work db102]$ sqlplus test/test
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 25 14:48:56 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
TEST@db102 SQL> drop table test purge;
Table dropped.
TEST@db102 SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[ora102 work db102]$ imp test/test file=test.dmp
Import: Release 10.2.0.1.0 - Production on Tue Jul 25 14:49:15 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export file created by EXPORT:V10.02.01 via conventional path
import done in EE8ISO8859P2 character set and AL16UTF16 NCHAR character set
import server uses WE8ISO8859P15 character set (possible charset conversion)
. importing TEST's objects into TEST
. importing TEST's objects into TEST
. . importing table "TEST" 1 rows imported
Import terminated successfully without warnings.
[ora102 work db102]$ export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P15
[ora102 work db102]$ sqlplus test/test
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jul 25 14:49:34 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
TEST@db102 SQL> select col1, dump(col1) from test;
C
DUMP(COL1)
¦
Typ=1 Len=1: 166
TEST@db102 SQL> -
Is "SET TRANSACTION USE ROLLBACK SEGMENT" only a hint
I have two users, one makes some inserts in a table.
The other makes a select which visits many rows.
I have a big rollback-segment.
To ensure, both users use this rollback-segment I created a logon-trigger:
CREATE OR REPLACE TRIGGER a_logon AFTER LOGON
ON DATABASE
WHEN ( USER IN ( 'SCOTT', 'BOB' ) )
BEGIN
SET TRANSACTION USE ROLLBACK SEGMENT rbs_big;
END;
But I still get "snapshot to old" messages from the select, which contains the name off an other rollback-segment in the message.
The trigger really fires, i tested it by adding an insert-statement to a log-table.
What`s wrong ?The set transaction use rollback segment lasts only until you commit or rollback first time and all other transactions in that session will not be forced to that rbs anymore. Other possible solution could be that other users are accessing same tables / updating them so those sessions can't keep the read consistent image available anymore for your sessions.
-
What Is The Best Setting To Use To Import Music?Please Help.
Hi, All
I have got an 80GB Apple Video iPod And I am still trying to figure out how to work it as I am new to using iPods.
What is the best setting to use to import CD Music and Music from the Internet to iTunes?? as I would like to listen to the highest quality there is on iTunes and my 80GB Apple Video iPod.
The settings are: ACC Encoder, AIFF Encoder, Apple Lossless Encoder, MP3 Encoder, WAV Encoder. If you have not got them to hand.
Many Thanks For Reading This And Replying To It, Much Appreciated!!
I Hope You All Have a VERY Merry New Year!!
Kind Regards, Rocky RobinThere really is no BEST setting. The "best" setting is the one that sounds the best to you.
Having said that, you also asked what setting provides the highest quality audio. In that case, you need to use a lossless format, such as AIFF, WAV, or Apple Lossless. MP3 and AAC are both compressed formats, and will not provide as good of an audio quality as a lossless format.
My personal preference would be Apple Lossless, but any of the lossless formats will produce an almost identical quality to the CD track.
Keep in mind, the files will be quite large.
Maybe you are looking for
-
Do any of you understand what this could mean? Øyvind Kristiansen
-
my son forgot his pass work for his ipod, not it is disabled and we cant get it going. how can i do it
-
Hi, I´m Dalila from Argentina, my father buy me las week an iphone unlocked in EEUU and It´snot working whit my SIM card. Can you help me please?
-
The direct link to speedgrade is desable on premiere pro cc v7.2.2
Mi direct link to speedgrade is desable on premiere pro cc v7.2.2, and the return from speedgrade to premiere is also desable. How can I fixet. Thanks
-
ECCN number of Berkely DB package
Can anybody knows the ECCN number for the BDB package? This is required for export control of BDB software in our product.