Here's the first in hopefully a monthly installment of postings. For those of you with access to the Web, I encourage you to read the hypertext version at: http://www.place.org/~stevemw/java/FAQ/FAQ-java-linux.html This will probably be moved very soon, but I wanted to get a copy out to people as quickly as possible. I welcome suggestions about improving the FAQ, and please don't hesitate to correct my mistakes. Also, I've quoted some of you here -- I hope for everyone's benefit. Thanks and enjoy! Steve PGP Key 1024/D54C69B9 Stephen Wynne <[EMAIL PROTECTED]> Fingerprint: 2C 54 C6 F3 9C FF 11 D3 90 56 DD 85 37 E3 1F AA [EMAIL PROTECTED] FAQ by Stephen Wynne May 27th, 1998 This document attempts to answer the most commonly-asked questions on the [EMAIL PROTECTED] mailing list. More information is available at http://www.blackdown.org/java-linux.html ______________________________________________________________________ Table of Contents: 1. Mailing List User Guide 1.1. Suggestions for List Participants 1.2. How can I get subscribed? Unsubscribed? 1.3. Where Can I Find Archived Postings from this List? 2. Could You Give Me An Overview of Running Java on Linux? 2.1. What is the Currently-supported Version of the Blackdown JDK? 2.2. There's a pure Java Package I Want to Run. Can I? 2.3. When is the JDK 1.2 Going to be Released for Linux? 2.4. Can I Take a Look at the JDK 1.2 Now Anyway? 2.5. Is Javasoft Going to Support Java on Linux? 2.6. What Resources are Available at Blackdown? 2.7. Other Sources of Information about Java on Linux 3. Blackdown JDK Installation Questions 3.1. Where to obtain JDK 1.02 and 1.1? 3.2. How Do I Install the JDK? 4. Troubleshooting the Blackdown JDK on Linux 4.1. Typical Questions to Ask Yourself When Debugging Problems 4.2. Kaffe and the Blackdown JDK 1.1 are Installed. Neither Work! 4.3. I Have the Blackdown JDK 1.1.x and RMI is Giving Me Fits! 4.4. Where Can I Report Bugs? 4.5. Are There Any Debugging Techniques I Can Try Myself? 4.6. That Didn't Help. What Else Can I Do? 5. Questions Specific to Running The Blackdown JDK on Linux 5.1. I'm on <your favorite Linux distribution here> What Do I Need? 5.1.1. The glibc versus libc5 Problem 5.1.2. RedHat 5.1.3. Debian 5.1.4. Slackware 5.1.5. Other Linux Distributions 5.2. Is There Anything Different About Native Interfaces on Linux? 5.3. What's Wrong with Thread Priorities and the Console? 5.4. Is there a JIT (Just in Time Compiler) for the Blackdown JDK? 5.5. Does the TYA JIT Work with the Blackdown JDK? 5.6. Does Javasoft's Activator JVM work on Linux with Netscape? 5.7. Can I Display Kanji with the Blackdown JDK? 5.8. Questions Specific to the Blackdown JDK on Linux 6. General Questions about Java 6.1. Where Can I Learn More about Java? 7. General Questions about Linux 7.1. Where Can I Find Linux FAQs, Mailing Lists, and Documentation? 7.2. What is glibc, and Why Does it Matter? 8. Compiling the JDK from Source 8.1. Can I Build Java Myself? 8.2. Could You Give Me a Pointer to Sun's Licensing Agreement? 8.3. How do I Build the JDK Now that I Have the Source? 8.4. What about Motif? Don't I Need That? 9. Information on the Java-Linux FAQ Itself 9.1. Who is the FAQ Maintainer? 9.2. Where Can I Get a Copy of the FAQ? 9.3. Caveat Emptor ______________________________________________________________________ $Id: FAQ-java-linux.sgml,v 1.38 1998/05/27 08:54:54 stevemw Exp stevemw $ 1. Mailing List User Guide 1.1. Suggestions for List Participants o Please read README.linux (also found in the Blackdown JDK distribution) FAQ before posting. o Choose a descriptive Subject: line for your mail. o When reporting problems and asking for help tell us as much about your system as possible. 1. Linux distribution and release number (example: Debian 2.0). 2. Relevant patches, packages, and updates installed. 3. Samples of the actual Java or Java bytecode that's causing you trouble. 4. Consider privately mailing the output of ``the Troubleshooting Script'' to [EMAIL PROTECTED] o Posts with lines wrapped at 75-80 characters are easier to read! o Spamming the list or using members' E-mail addresses for commercial purposes is forbidden. o Some list users may ignore messages created in HTML or that include proprietary attachments. o Do not followup improper postings to the entire list; copy the sender and the list administrator only. o Please avoid inflammatory language. 1.2. How can I get subscribed? Unsubscribed? Please don't send E-mail directly to the list requesting these status changes! Visit http://www.blackdown.org/java-linux.html and follow the links to instructions or use the links provided in the next paragraph. The following URL would work in Netscape Mail to subscribe you: java- [EMAIL PROTECTED]?subject=subscribe And this should unsubscribe: java-linux- [EMAIL PROTECTED]?subject=unsubscribe 1.3. Where Can I Find Archived Postings from this List? Karl Asha has arranged for the list to be archived here: http://www.mail-archive.com/java-linux@java.blackdown.org/. 2. Could You Give Me An Overview of Running Java on Linux? Running Java on Linux is about what you'd expect. You should be able to run most "pure Java" applications on the Linux JDK or JRE. It does take a little longer to get the latest JDK on a target that Javasoft doesn't officially support. Also, the JVM currently only uses green threads. 2.1. What is the Currently-supported Version of the Blackdown JDK? At the time of this writing, the supported Blackdown JDK version is 1.1.5v7. JDK 1.1.6v1 is now in preview release. Look ``elsewhere in the FAQ'' for places to download. To determine your version, use this command: ______________________________________________________________________ $ java -version ______________________________________________________________________ 2.2. There's a pure Java Package I Want to Run. Can I? Most likely. For example, I've tested Javasoft's JFC SwingSet (see http://java.sun.com/products/jfc/) with a static Motif build and a Lesstif build with good results. This typically involves downloading the package and untarring or unzipping it. Sometimes the vendor won't provide an installation procedure that works well on Linux, and so you have to adjust a script or do it by hand. 2.3. When is the JDK 1.2 Going to be Released for Linux? According to Steve Byrne on Monday, May 26th 1998: JavaSoft is trying very hard to get a license set up with an external person to coordinate the 1.2 Linux porting effort. The plan is not to have to wait until 1.2 ships, but to get things underway much sooner (1.2 is huge, and involves lots more machine specific components, and will take a while to port). 2.4. Can I Take a Look at the JDK 1.2 Now Anyway? Yes, just run unzip on the Solaris shell script archive; it'll unpack it for you. You can then unpack the src.zip archive. Also, you can already get the documentation from Javasoft from http://www.javasoft.com/docs/index.html. 2.5. Is Javasoft Going to Support Java on Linux? We don't know yet. At the time of this writing, bug 4097810 was at the top of the JDC Bug Parade. You can read about it at: http://developer.java.sun.com/developer/bugParade/bugs/4097810.html. There are a number of complex issues involved with this request, including the wide variety of Linux distributions, target architectures (beyond Intel where Javasoft already supports Solaris x86), the huge number of announced APIs with required native support, and so forth. 2.6. What Resources are Available at Blackdown? Karl Asha's Blackdown server has a number of resources. Visit http://www.blackdown.org/java-linux.html. Karl has provided the following sorts of information there: o Instructions for subscribing to this mailing list. o Recent news about running Java on Linux. o What third-party tools run on the Linux JDK such as running running Linux Java Activator with Netscape. o Links to other ports. o The latest Linux shared library compatibility issues. 2.7. Other Sources of Information about Java on Linux o Luiz Otvio Lautenschlger has a general "Java on Linux FAQ" at http://nr.conexware.com/~zorzella/wine/FAQ2.htm o Paul Cho has an up-to-date Linux/Java page worth reading often: http://www.w3com.com/paulcho/javalinux/ o Professor Sergey Nitikin's Linux/Java News: http://www.public.asu.edu/~nikitin/JavaOnline/ 3. Blackdown JDK Installation Questions 3.1. Where to obtain JDK 1.02 and 1.1? Please visit http://www.blackdown.org/java-linux/mirrors.html and select the site nearest you. Both Randy Chapman's JDK 1.02 and Steve Byrne's JDK 1.1.x are found on participating mirror sites. Check ``elsewhere in this FAQ'' for the currently supported version the Blackdown JDK. 3.2. How Do I Install the JDK? 1. Download the tar(1) archive for your platform as directed by the mirror list mentioned ``above''. 2. Move to an appropriate directory and for example, unpack the tar(1) archive as follows: ___________________________________________________________________ $ cd /usr/local $ tar xvf /tmp/jdk1.1.6.tar.gz ___________________________________________________________________ 3. Make sure your DISPLAY environment variable is set, put the resulting directory into your execution path, and try something: ___________________________________________________________________ $ export DISPLAY=:0 $ export PATH=/usr/local/jdk1.1.6/bin:$PATH $ appletviewer /usr/local/jdk1.1.6/demo/awt-1.1/lightweight/OpenlookButtons/example.html ___________________________________________________________________ Note that the above examples assumed you were using the Bash shell, such as /bin/bash. Also note that if you already have a CLASSPATH set, you'll probably want to append This ensures that you have the current working-directory in your class search path, and makes things much easier for you as you test your code. Of course you may want to add these environment commands to your shell's startup script, such as $HOME/.bashrc. Some people may wish to set JAVA_HOME themselves. That way, you can change all commands following setting that to use it instead, such as ______________________________________________________________________ $ export JAVA_HOME=/usr/local/jdk1.1.6 $ export PATH=$JAVA_HOME/bin:$PATH $ export CLASSPATH=.:$JAVA_HOME/lib/classes.zip ______________________________________________________________________ 4. Troubleshooting the Blackdown JDK on Linux 4.1. Typical Questions to Ask Yourself When Debugging Problems o Are you running the current version? You can find that information ``elsewhere in this FAQ''. o Have you checked to see if your libc, glibc, and X11 libraries could be the problem? See ``Questions Specific to Running The Blackdown JDK on Linux''. If you learn something we can add to there, please post them! o Environment variables. Here are the top candidates for problems: o CLASSPATH Should either be unset or start with .:$JAVA_HOME/lib/classes.zip. o PATH Should include $JAVA_HOME/bin -- ahead of /usr/bin where Kaffe often lives, please! o JAVA_HOME This should be set to your top-level JDK directory. o JDK_HOME Although the JDK doesn't need this, it ought to be set to your top- level JDK directory (if at all). HotJava uses this environment variable, as do other packages other than the JDK. o Are all the required X11 fonts installed? This is a subtle area of concern. People have experienced crashes from not having 75dpi fonts installed. o Are your font and localization properties correct? Another area that is difficult to troubleshoot. I hope to add more information here soon! 4.2. Kaffe and the Blackdown JDK 1.1 are Installed. Neither Work! After running javac HelloWorld.java and seeing this message: Failed to open object 'HelloWorld/java' Other people have reported error messages such as these: $ javac Failed to locate native library in path: /usr/lib Aborting. Daniele Lugli <[EMAIL PROTECTED]> reports: that is the kaffe javac. Now that I moved $JAVA_HOME/bin ahead in my $PATH, both javac and java work, and I see a wonderful "Hello, World!". In other words, always check for conflicting ``environment variable problems''. A very common cause for problems with Kaffe is having /usr/bin in your path ahead of $JAVA_HOME/bin. 4.3. I Have the Blackdown JDK 1.1.x and RMI is Giving Me Fits! Rich McClellan <[EMAIL PROTECTED]> reports that running the Blackdown JDK 1.1.5v7libc works better than the glibc version, and forwards this advice from Alexander V. Konstantinou <[EMAIL PROTECTED]>: The problem is related to naming in /etc/hosts. This is a known Java problem in picking up the right name for the interface. Change the localhost name to your real machine name. This may cause problems with talk though ..." 4.4. Where Can I Report Bugs? In general, please report bugs to the [EMAIL PROTECTED] list. Feel free to join the JDC (see http://developer.javasoft.com/) and check to see if your bug is in the Bug Parade for the version of the JDK with which you're experiencing the problem. Providing this information when posting your bug can save us some time. 4.5. Are There Any Debugging Techniques I Can Try Myself? Try running the JDK java, appletviewer, and javac wrapper scripts like this: ______________________________________________________________________ $ sh -x $JAVA_HOME/bin/java -verbose -verbosegc -cs -verify ... ______________________________________________________________________ or this: ______________________________________________________________________ $ strace -f -s 256 $JAVA_HOME/bin/java ... ______________________________________________________________________ That last command will be very noisy, but you may be surprised what you learn from reading it. 4.6. That Didn't Help. What Else Can I Do? We've created a troubleshooting information collection script that you can download from http://www.place.org/~stevemw/java/FAQ/java-linux- info.sh and follow the instructions at the top of it. Mail its output to [EMAIL PROTECTED] 5. Questions Specific to Running The Blackdown JDK on Linux 5.1. I'm on <your favorite Linux distribution here> What Do I Need? 5.1.1. The glibc versus libc5 Problem The latest versions of the Blackdown JDK have their own built-in loader and libc, which will hopefully make them more robust. Older versions of the JDK 1.1.5 (especially) are much more sensitive. Karl Asha has a succinct page about this at http://www.blackdown.org/java- linux/docs/libraries.html. In short, you need glibc-2.0.7 and glibc- devel-2.0.7 or higher on a glibc-based system such as RedHat 5.0 or Debian 2.0. There are RPMs for these on RedHat Intel systems at ftp://ftp.redhat.com/pub/redhat/current/updates/i386. For a libc5 system, you need libc.so.5.44 or greater, along with a recent ld.so. You can find these at ftp://tsx-11.mit.edu/pub/linux/packages/GCC. For an in-depth discussion of this issue, see ``What is glibc, and Why Does it Matter?''. 5.1.2. RedHat Download the glibc and ld updates described under http://www.redhat.com/support/docs/errata.html. You may also experience problems with your X11 libraries and undefined symbols relating to internationalization. If you do, visit http://www.xfree86.org, download X331bin.tgz and unpack it over your existing libraries. You should know what you're doing if you try this; have original media ready and be able to recover. According to Sorin Lingureanu <[EMAIL PROTECTED]>, For everybody how wants to install jdk-1.1.5v7 rpm's for RedHat distributions, I think that da good choice is to install jdk with rpm. This packages can be found at: for RedHat 4.2: ftp://ftp.redhat.com/pub/contrib/i386/jdk-1.1.5-8.i386.rpm for RedHat 5.0: ftp://ftp.redhat.com/pub/contrib/hurricane/i386/jdk-1.1.5-7.i386.rpm Check there for more recent versions. Also, make sure that you don't have conflicting JDK_HOME, JAVA_HOME, and CLASSPATH environment vari- ables set from scripts source from /etc/profile.d/ at login. This can especially be a problem when trying multiple versions of the JDK in succession. 5.1.3. Debian Paul Reavis <[EMAIL PROTECTED]> has details at http://www.mindspring.com/~tumu/java/Debian-JDK.html. 5.1.4. Slackware Again, please help by posting your experiences with the Blackdown JDK on Slackware. 5.1.5. Other Linux Distributions Check with http://nr.conexware.com/~zorzella/wine/FAQ2.htm to see if Luiz Otvio Lautenschlger Zorzella has additional information that applies to your platform. 5.2. Is There Anything Different About Native Interfaces on Linux? Not really. The compilation flags may need to be different from what Javasoft recommends in the Solaris-oriented documentation. There have been reports of problems with C++ IOStreams using libstdc++-2.7.x. Note that g++-2.8.1 and libstdc++-2.8.1 have been tested, and seem to work on RedHat 5.0. Ed Roskos <[EMAIL PROTECTED]> gives us these instructions for C JNI: I've written a few shared libraries for use under both Linux and Solaris, and since a few people are curious about this, here goes: 1) Make sure you have run javah. Plenty of documentation on this exists. 2) You must first compile your C source files to object files, which end in ".o". Example: gcc -fPIC -c -I<java-header-path> file1.c -o file1.o You must replace <java-header-path> with the path to the include files for java-linux. 3) Create your library. This is not the same as creating an executable. Under Linux, use: ld -shared file1.o -o libMyLib.so If you have more than file1.o, just list them after file1.o. You can then, from Java, load your library as System.loadLibrary("MyLib"); Hope this helps. Ed Roskos [EMAIL PROTECTED] And Duncan Roe <[EMAIL PROTECTED]> points us to the Texinfo docu- mentation for GNU C, and argues that -fPIC only makes a difference on the m68k, m88k and the Sparc. Evidently -fpic works in some cases (ELF?) on x86. 5.3. What's Wrong with Thread Priorities and the Console? You may be asking yourself this question if you share access to System.out or System.in among several threads. Jason Gilbert <[EMAIL PROTECTED]> has a reply to this question: Bernd Kreimeier wrote: > > Is there a problem with several threads using System.out > at the same time? A JDK problem? Or a Linux JDK problem? I believe it's a green threads JDK problem. jason -- Jason Gilbert | http://www.scott.net/~jason/ | http://www.homewood.net 5.4. Is there a JIT (Just in Time Compiler) for the Blackdown JDK? There are several. Please take a look at http://www.blackdown.org/java-linux/javatools.html for pointers. 5.5. Does the TYA JIT Work with the Blackdown JDK? Yes. Alexander Davydenko <[EMAIL PROTECTED]> posted an updated configure script to install TYA that this author hasn't tested. You can read his post at http://www.mail-archive.com/java- [EMAIL PROTECTED]/msg00126.html 5.6. Does Javasoft's Activator JVM work on Linux with Netscape? Take a look at http://www.blackdown.org/activator/. 5.7. Can I Display Kanji with the Blackdown JDK? Nozomi Matsumura <[EMAIL PROTECTED]> has a suggestion that at least applied to earlier, libc5 versions of the JDK, and may still work. It involves making use of multi-byte character support provided in builds of libX11.so with the Xsetlocale() call. (Please refer to information about obtaining X11 libraries built with this option ``elsewhere in the FAQ''.) Matsumura-san points us at this fix provided by Hiroshi Hisamatsu <[EMAIL PROTECTED]>, which is a small, shared library (liblocale.so) to explicitly specify the Kanji locale. It is available from http://www.asahi-net.or.jp/~nf6h-hsmt/jdk1.1.1-locale.tar.gz. More detail on this is available in Japanese at http://www.asahi- net.or.jp/~nf6h-hsmt/java.html. The fix also involves adding the following lines to your .java_wrapper file in $JAVA_HOME/bin: ______________________________________________________________________ LD_PRELOAD="$JAVA_HOME/lib/${ARCH}/$THREADS_TYPE/liblocale.so" export LD_PRELOAD ______________________________________________________________________ Matsumura-san also mentions changing the locale specified by your environment variable LANG to ja, and says that ja_JP.{EUC,ujis} did not work. If you have additional information about making CJK (Chinese, Japanese, and Korean) code work well with Java on Linux, please tell ``the FAQ maintainer''. 5.8. Questions Specific to the Blackdown JDK on Linux This is a kind of place-holder for questions to answer Real Soon Now. Please feel free to send answers to these questions to ``the FAQ maintainer'' for its next revision. 1. Do the Java 3D and other potentially native extensions work on Linux? 2. Have you had problems with the Java Webserver? 3. <your question here> 6. General Questions about Java 6.1. Where Can I Learn More about Java? Here are a nuber of excellent starting points. o Elliotte Rusty Harold's comp.lang.java FAQ: http://sunsite.unc.edu/javafaq/javafaq.html o The Java networking FAQ: http://www.io.com/~maus/JavaNetworkingFAQ.html o Peter van der Linden's Java Programmer's FAQ: http://www.best.com/~pvdl/javafaq.html o Javasoft's Developer Connection FAQ: http://developer.javasoft.com/developer/techDocs/faqs.html 7. General Questions about Linux 7.1. Where Can I Find Linux FAQs, Mailing Lists, and Documentation? Here's a list of good places to start: o The Linuxdoc project: http://sunsite.unc.edu/LDP/. o The main Linux webiste: http://www.linux.org/. o Linux kernels and libraries: http://www.kernel.org/. 7.2. What is glibc, and Why Does it Matter? I'll explain what libc and glibc in a bit, but first, let me say that the current Linux JDK tries to avoid library incompatibilities by providing a dedicated linker/loader and "libc" within the Linux JDK distribution itself. And (I think) even before this change, the problem of "which of libc5 or glibc is needed" was theoretically only experienced on systems such as RedHat 5.0 and Debian 2.0 that had so rapidly moved to glibc. Other library conflicts are always bound to happen because of the variety of Linux versions and configurations there are. The UNIX "libc" is the core set of functions to which most utility and application code links. You can see references to libc in the intro(3) manual page. For your information, functions described in section two (see intro(2)) of the manual are all inside the kernel, whereas section three describes those which may be standard, but are stored in separate libraries. To view these pages, make sure your core manual pages are installed, and type man 3 intro, for example. In order to save disk space and memory, modern operating systems like Linux have taken to using "shared" libraries that don't move their contents into code which links to them during the build process. Although there is a /usr/lib/libc.a, most production code is linked to /usr/lib/libc.so, which is typically a link-editor script for selecting the actual libc.so (shared object) archive. In short, lots of programs on your system share code out of one or more files as they execute. To see what shared code an executable needs, there is an optional Linux utility named ldd(1). If it's on your system, you can type ldd PROGRAM to see its shared libraries. Here's an example: ______________________________________________________________________ $ ldd /bin/ls libc.so.6 => /lib/libc.so.6 (0x40003000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000) ______________________________________________________________________ The older (and still most common) Linux libc was known as "libc5." The GNU/Linux development community sought to improve on it by adding thread-safety where possible, 64-bit support, better POSIX and XPG4.2 compliance, superior organization of the library sources, and multi- byte character locale support. These and other changes will bring even more robustness and quality to the Linux development environment. Although the changes are inconvenient to us sometimes, the end result should be worth it. The new library is now called "glibc" because it's a library common across Linux and HURD, and enjoys a broad base of GNU developer contributions. (I don't know how much of the earlier Linux libc software was derived from GNU libc, which has been around for quite a while on its own, I think.) For more information on GNU libc, see http://www.imaxx.net/~thrytis/glibc/. Since C is central to the history and development of UNIX and Linux, you might enjoy the links found on http://www.dundee.ac.uk/~bmsimpso/work/C-Programming/ as well. 8. Compiling the JDK from Source 8.1. Can I Build Java Myself? Building the JDK on Linux with patches supplied by Steve Byrne is fairly straightforward. See http://www.blackdown.org/~sbb for the diffs and some additional details. I encourage you to read README.linux.src from the patched source distribution if you plan to undertake this project. You will need to sign ``a license agreement with Javasoft'' in order to download the sources. 8.2. Could You Give Me a Pointer to Sun's Licensing Agreement? In order to obtain the JDK sources, first you must read, sign, and FAX in an agreement with Sun. The agreement can be found at http://www.javasoft.com/nav/business/source_form.html. 8.3. How do I Build the JDK Now that I Have the Source? Please read the README.linux.src file (which is also in the current binary distribution). 8.4. What about Motif? Don't I Need That? You can build the JDK against Lesstif, the Hungry Programmers' GNU copylefted implementation of the Motif API. For more information, visit their website at http://www.lesstif.org. Make sure you get the "current" distribution. They are very responsive to accurate bug and problem reports. On the other hand, a number of Motif developer library vendors exist for Linux systems. I recommend you read the Motif comp.windows.x.motif news group FAQ. You can find it here: http://www.rahul.net/kenton/faqs/mfaq_index.html. 9. Information on the Java-Linux FAQ Itself 9.1. Who is the FAQ Maintainer? Answers to questions found in this FAQ are from a variety of participants on [EMAIL PROTECTED] If you have any comments, clarifications, or corrections, please send them to Stephen Wynne <[EMAIL PROTECTED]>. If you have something to add, please send E-mail to the list itself. 9.2. Where Can I Get a Copy of the FAQ? Although this document may be freely redistributed, most-recent copies of this FAQ can currently be found at http://www.place.org/~stevemw/java/FAQ/FAQ-java-linux.html. You can also find a text version of this document here: http://www.place.org/~stevemw/java/FAQ/FAQ-java-linux.txt, and full source for the original at http://www.place.org/~stevemw/java/FAQ/. This FAQ was produced directly from SGML with the SGML tools package v0.99.0, using the LINUXDOC.DTD. 9.3. Caveat Emptor This document may contain technical information that is incorrect, out-dated, and may unintentionally misrepresent the opinions of java- [EMAIL PROTECTED] participants. Also, ``the FAQ maintainer'' makes no warranty with respect to its usefulness, but makes every attempt make it so anyway, and welcomes efforts to improve it.