Autocomplete PHP
I have been using Golive until now. We have the CS3 that
includes Dreamweaver. One thing I need help with is how to get DW
to auto-complete or auto-suggest PHP code like GL does.
Ahh - thanks!
Murray --- ICQ 71997575
Adobe Community Expert
(If you *MUST* email me, don't LAUGH when you do so!)
==================
http://www.projectseven.com/go
- DW FAQs, Tutorials & Resources
http://www.dwfaq.com - DW FAQs,
Tutorials & Resources
==================
"Cheryl D Wise" <[email protected]> wrote in message
news:foq8nq$k4h$[email protected]..
> GoLive 5 did along with ASP, something that was dropped
in later versions.
>
> --
> Cheryl D Wise
> Adobe Community Expert
>
http://starttoweb.com
>
>
>
> "Murray *ACE*" <[email protected]>
wrote in message
> news:fo0lbd$emf$[email protected]..
>>I don't think GL does PHP at all...
>>
>> --
>> Murray --- ICQ 71997575
>> Adobe Community Expert
>> (If you *MUST* email me, don't LAUGH when you do
so!)
>> ==================
>>
http://www.projectseven.com/go
- DW FAQs, Tutorials & Resources
>>
http://www.dwfaq.com - DW FAQs,
Tutorials & Resources
>> ==================
>>
>>
>> "David Powers" <[email protected]> wrote in
message
>> news:fo093d$32d$[email protected]..
>>> Elliott Tank wrote:
>>>> One thing I need help with is how to get DW
to auto-complete or
>>>> auto-suggest PHP code like GL does.
>>>
>>> I don't know how GoLive does it, but PHP code
hints in Dreamweaver are
>>> activated by pressing Ctrl+Space inside a PHP
code block.
>>>
>>> --
>>> David Powers, Adobe Community Expert
>>> Author, "The Essential Guide to Dreamweaver CS3"
(friends of ED)
>>> Author, "PHP Solutions" (friends of ED)
>>>
http://foundationphp.com/
>>
>
Similar Messages
-
Autocomplete Declared PHP Variables in Dreamweaver
Is there a way to autocomplete php variables that have been
declared? For instance, whenever you type $ in a PHP code block, a
pop up list would automatically come up with all the variables you
have already declared. This would GREATLY speed up coding and help
to insure coding accuracy.
If there is a way to do this now, could someone please clue
me in? I've searched and searched forums, help files, and google.
If this is not available, where should I go to request this
feature?
Shannajsteinmann wrote:
> With asp.net missing, along with several other things
discontinued, dreamweaver will have to cater to php developers in
these kinds of ways.
If you want Dreamweaver to add features posting this sort of
comment in
a user-to-user forum won't have the slightest impact on the
direction
that Dreamweaver actually takes. You need to make your views
known by
submitting feature requests through the official channel:
http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform
Submitting requests doesn't guarantee that your ideas will be
adopted in
the next version or even the one after that, but it does get
them on the
development team's radar.
David Powers, Adobe Community Expert
Author, "The Essential Guide to Dreamweaver CS3" (friends of
ED)
Author, "PHP Solutions" (friends of ED)
http://foundationphp.com/ -
Object methods autocomplete in PHP
Hi all!
DW is a great and powerful instrument for web dev. But i faced a problem: is it possible in DW to autocomplete MY class methods and MY variables that a on my page (i meen php)? Almost all other (and free) php editors are void of this bugDreamweaver doesn't support autocompletion of custom methods. In fact, it doesn't support PHP core objects, either. But it's not a bug. That's just the way the program was designed.
If you would like those features added to a future version of Dreamweaver, submit a feature request through the form at http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform. -
Php function list autocomplete in CS6
Hi all, i have a problem in CS6 when i push Ctrl + Space the Php function list is not showing in code hint panel.
For example usually when y write, "mysql_f" and then press Ctrl + Space, mysql_fecth_array and mysql_fetch_row, was show in code hint panel.
Now in CS6 this not work, or i don't know how do it.
¿How i can fix this?
P.d: I read that disable JQuery hints in preference options make that "$_" global var show; but function list no.
Thanks in advance.Moved to the Developing server-side applications with Dreamweaver forum.
I have just tested Ctr+Space in Dreamweaver CS6 in both Windows 7 and Mac OS X 10.8. It works without problem on both systems.
Make sure you're using a PHP page, and that you're in a PHP code block. Also, code hints stop working if you have a syntax error earlier in your code.
Sometimes, if you experience strange behaviour with Dreamweaver, it helps to delete the cache file or even the whole of your configuration folder. See http://forums.adobe.com/thread/494811 for details. -
I was testing a XHTML 1.0 Strict valid website on my localhost. It had URL "http://localhost/visaita/tictactoe/Web/index.php?item_id=8&game_password=73|55fc84c0c432ad625a901caaa13108aa&chat_code=74|50b3b60c8be203.98819772#.ULO2EnC23XQ". If I click in URL field between 8 and ?. Then pres shift + end and delete the rest of URL, I get a drop down of suggestions. Then I press arrow left in my keyboard - suggestions dissappear. I press enter and my URL is immediately reset to initial one (with all arguments) even though I wanted to delete them. Server receives all the arguments, so this is not the case of a back-end redirection (tested).
The most interesting effect is that after such refresh ALL HTML LINKS stop working. They refresh page instead of redirecting. Even if I click on a link redirecting to another domain, page still gets refreshed and not redirected. I see it as an obvious and serious bug which happens in very special conditions.
All FF plugins and add-ons disabled. Tested in safe mode as well. One interesting fact is that this page is opened by a redirect from another page (JavaScript performs redirect), but the page where error happens does not contain any JavaScript redirection code. Error console is also empty.
During these redirects FireBug (when enabled) displays interesting stuff. It shows that request without arguments is pending infinitely while immediately after it another request is launched with all unwanted arguments.
Another interesting fact is that page is using late polling AJAX technique (not sure whether it has any impact).
It seems that it is some caching bug.Autocompleted URL does not seem to be related in order to provoke the bug. If I press Esc and then immediately press on links, they all work fine. Without pressing Esc, if long polling is in action, all links redirect the same page. Long polling request happens for no longer that 2 minutes and then there is a 1 second JS delay before the next one. If links are pressed between calls, they work fine.
The strange thing though is that my friend has prepared a simple script which is generating a long polling request and has a link to Google. This test works, so I am trying to understand whether there is any additional factor which is causing the problem. Perhaps it can be due to having redirects and 2 simultaneous long polling requests at the same time. Doing my best to understand the problem. Not sure what is happening although I am quite sure that problem is caused by the FF browser somehow. Tested everything back and forth. -
How to implement autocomplete in a search form?
Hi all,
I´m trying to implement the autocomplete in a search form but I think I'm missing something in content server...
Is there a simple away to do it in content server?
With PHP it doesn´t work in content server, right?
Where can I find a good tutorial about that?
Thank you in advance,
RRSHere's a really good one and I know it works on UCM:
http://developer.yahoo.com/yui/autocomplete/
cheers -
Smart value help autocomplete doesn't work
Hello,
We are using CRM 7.0. We want to provide an autocomplete option for some customer input field.
We decided to implement it with smart value help (F4) functionality. This customer field belongs to the customer Z view.
When we use this Z view in the Z component, autocomplete wotks fine but when we use it in the standard component, F4 popup help works but autocomplete (smart value help) doesn't work.
We would appreciate any help on this issue.
Thanks in advance,
SergeyYour .zshrc is only read when you start a new shell: https://wiki.archlinux.org/index.php/Zs … tion_files
-
Where is Flash builder 4.6 for php ?
Hello,
I found flash builder 4.5 for php and flash builder 4.6, where is flash builder 4.6 for php ?Is it really that difficult to add Flash Builder 4.6 as a plugin to Zend Studio? I did that for a long time prior to Flash Builder 4.5 for PHP, which is essentially the same thing. It really doesn't take a rocket scientist. =/
On that note, if you own Flash Builder 4.6 and don't feel like shelling out the extra money for Zend Studio or waiting for Flash Builder 4.6 for PHP, then it's really as simple as adding Flash Builder as a plugin to Ecliplse for PHP using PDT. Also, doesn't take a rocket scientist. Personally, I don't see the big deal myself. I don't even bother with using Zend Studio anymore and prefer to use Komodo Edit since it's autocomplete features are awesome and it's very quick at auto complete by simply adding a folder for your favorite PHP apps from different frameworks to different content management systems. Furthermore, there is still support in Flash Builder 4.6 to connect to a PHP data service if you really just want to create some automated code. Ultimately though, I don't understand why anyone would use amf.ini or the default options in production.
Rather than pointing to the default endpoint, if you're using a framework in the first place, it makes a lot more sense to setup a service controller and have the endpoint point to that such as index.php/services/amf (or if you're like me and prefer cleaner url's modify .htaccess to remove index.php). The bottom line is there really was nothing great about Flash Builder 4.5 for PHP. Alot of things were broken for one and it was far easier to use the datawizard which still exists for testing purposes.
After that, you should be focusing on deploying the applicaiton for production, and adjusting the settings in the Zend Framework to create a new project the correct way, dumping your HTML file to a view along with the swf file, and it may be a good idea to point the HTML file to swfobject on the Google Ajax Libraries page. Everything else is a cakewalk.
In other news, if you'd like a ligher footprint than using the entire Zend Framework, why not use something like CodeIgniter and create the necesssary hooks to use Zend AMF? -
The location bar autocomplete doesn't work for certain letters.
This is a really specific problem, the dropdown autocomplete for the location/awesome bar does not work if what I'm typing starts with the letter 'k'.
Your .zshrc is only read when you start a new shell: https://wiki.archlinux.org/index.php/Zs … tion_files
-
Autocomplete doesn't work for packages that were just installed
After installing a program with pacman, I wasn't able to use autocomplete in bash or zsh for that program, even though I was able to run it. If I made a new terminal autocomplete worked fine, it was only in the terminal I had just used to install the application where the autocomplete didn't work. I found out after a while that I can manually run `hash -r` after installing a package to get this to work. Is there any way I could do this automatically after installing a package, or is there another way I could get autocomplete to work right after installing a package?
Your .zshrc is only read when you start a new shell: https://wiki.archlinux.org/index.php/Zs … tion_files
-
Hello,
I am fairly new to php and am having problems working out the
best way to go about doing what i want to do.
I want users of my system to be able to choose from a
selection of images which they have earlier uploaded. I am using a
system where the picture show is the one with the number 1 in the
`use` colum of a mysql database, only i dont know how to make it so
a user can change that number.
Any help will be greatly appreicated weather that is how to
get the above to work , or ideas of a different system i could use
to have the same effect,
thank you,
JamesFrom the problem you're describing, I would set it up like
this:
Db1_Table 1 (tbl_Images)
Columns
1) id
2) image_location
Db1_Table 2 (tbl_UserPrefs)
1) id
2) user_name
etc...
x) image_location
So, in your user preferences, use a dynamic drop down. The
values will come from Db1_Table 1.
When the user submits the changes to his preferences, the
value from the dynamic drop down will go into Db1_Table 2.
You'll need to have 2 Recordsets for this to work, of course.
edit: you can also have something else besides a drop down,
ex: autocomplete text field or option buttons. -
Artist does not exist in library, but appears in Autocomplete--how to fix?
I had an artist name appearing in all caps in my library. I went through and found every instance of her name in the library, and carefully pasted the proper capitalization. Her name in caps no longer exits in my library at all--yet when I try to fill in a new song with her name as artist, it ALWAYS shows up in all caps, and won't let me revert.
I've tried the advice followed in these threads:
http://hints.macworld.com/article.php?story=20040211190245654
http://forums.macrumors.com/archive/index.php/t-1538067.html
http://forums.ilounge.com/itunes-related-mac-pc-applications/261681-how-delete-a uto-fill-tags-itunes-under-get-info.html
https://discussions.apple.com/message/15688183#15688183
https://discussions.apple.com/message/5952472#5952472
The general consensus for how to deal with this is:
A) Enter gibberish character at the beginning so you don't trigger the autofill, then delete when done, OR
B) Copy the correctly spelled/capitalized version and paste it in.
Both of those work, but they are VERY tedious and time consuming.
They essentially defeat the purpose of autocomplete.
I have double and triple checked. The artist name in all caps IS NOT anywhere in my library, but it STILL appears as the first autocomplete suggestion, and it won't let me edit the letters properly to be lowercase.
Is this come kind of Cache?
iTunes Library corruption?As per my understanding...
You Would like to see this
Code:
SELECT COALESCE(Salary,0) from Employee;
Regards
Shivaprasad S
Please mark as answer if helpful
Shiv -
Autocompletion SwingX Textfield
Hello everybody , I found an interesting topic about automatic completion.
http://xpose.avenir.asso.fr/viewxpose.php?site=20&subpage=/swingX.php
http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/autocomplete/Configurator.html
But it does not work :(
* To change this template, choose Tools | Templates
* and open the template in the editor.
* TextFieldAutoComplete.java
* Created on Oct 25, 2009, 5:34:09 PM
package swingx;
import java.awt.List;
import java.util.Vector;
import javax.swing.JList;
import javax.swing.JTextField;
import org.jdesktop.swingx.autocomplete.Configurator;
* @author Administrator
public class TextFieldAutoComplete extends javax.swing.JDialog {
private final Configurator config = new org.jdesktop.swingx.autocomplete.Configurator();
/** Creates new form TextFieldAutoComplete */
public TextFieldAutoComplete(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
JTextField textField = new JTextField();
textField.setText("Remi");
/* On ajoute le manager qui fera la completion dans le textField avec les champs de la JList */
Vector v = new Vector();
v.add("Jimmy");
v.add("Julie");
v.add("Julien");
v.add("Juliette");
JList list = new JList(v);
/* On ajoute le manager qui fera la completion dans le textField avec les champs de la JList */
Configurator.enableAutoCompletion(list, textField);
this.add(textField);
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jTextField1.setText("jTextField1");
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(109, 109, 109)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(132, Short.MAX_VALUE))
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(60, 60, 60)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(136, Short.MAX_VALUE))
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(29, 29, 29)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(71, 71, 71))
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(45, Short.MAX_VALUE)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(39, 39, 39))
pack();
}// </editor-fold>
* @param args the command line arguments
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
TextFieldAutoComplete dialog = new TextFieldAutoComplete(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
dialog.setVisible(true);
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
}Thanks for help
Edited by: cotede3 on Oct 25, 2009 3:17 PM
Edited by: cotede3 on Oct 25, 2009 3:18 PMhii,
to try:
1/ CitiesTextField.java
import java.util.List;
import javax.swing.JTextField;
import javax.swing.text.*;
public class CitiesTextField extends JTextField {
private static final long serialVersionUID = 1L;
class AutoDocument extends PlainDocument {
private static final long serialVersionUID = 1L;
@Override
public void replace(int i, int j, String s, AttributeSet attributeset) throws BadLocationException {
super.remove(i, j);
insertString(i, s, attributeset);
@Override
public void insertString(int i, String s, AttributeSet attributeset) throws BadLocationException {
if (s == null || "".equals(s)) {
return;
String s1 = getText(0, i);
String s2 = getMatch(s1 + s);
int j = (i + s.length()) - 1;
if (isStrict && s2 == null) {
s2 = getMatch(s1);
j--;
} else if (!isStrict && s2 == null) {
super.insertString(i, s, attributeset);
return;
if (citiesComboBox != null && s2 != null) {
citiesComboBox.setSelectedValue(s2);
super.remove(0, getLength());
super.insertString(0, s2, attributeset);
setSelectionStart(j + 1);
//setSelectionStart(0);
setSelectionEnd(getLength());
@Override
public void remove(int i, int j) throws BadLocationException {
int k = getSelectionStart();
if (k > 0) {
k--;
String s = getMatch(getText(0, k));
if (!isStrict && s == null) {
super.remove(i, j);
} else {
super.remove(0, getLength());
super.insertString(0, s, null);
if (citiesComboBox != null && s != null) {
citiesComboBox.setSelectedValue(s);
try {
setSelectionStart(k);
setSelectionEnd(getLength());
} catch (Exception exception) {
public CitiesTextField(List<String> list) {
isCaseSensitive = false;
isStrict = true;
isStrict = false;
citiesComboBox = null;
if (list == null) {
throw new IllegalArgumentException("values can not be null");
} else {
dataList = list;
init();
return;
CitiesTextField(List<String> list, CitiesComboBox b) {
isCaseSensitive = false;
isStrict = true; // harcode or ...
isStrict = false; // harcode
citiesComboBox = null;
if (list == null) {
throw new IllegalArgumentException("values can not be null");
} else {
dataList = list;
citiesComboBox = b;
init();
return;
private void init() {
setDocument(new AutoDocument());
if (isStrict && dataList.size() > 0) {
setText(dataList.get(0).toString());
private String getMatch(String s) {
for (int i = 0; i < dataList.size(); i++) {
String s1 = dataList.get(i).toString();
if (s1 != null) {
if (!isCaseSensitive && s1.toLowerCase().startsWith(s.toLowerCase())) {
return s1;
if (isCaseSensitive && s1.startsWith(s)) {
return s1;
return null;
@Override
public void replaceSelection(String s) {
AutoDocument _lb = (AutoDocument) getDocument();
if (_lb != null) {
try {
int i = Math.min(getCaret().getDot(), getCaret().getMark());
int j = Math.max(getCaret().getDot(), getCaret().getMark());
_lb.replace(i, j - i, s, null);
} catch (Exception exception) {
public boolean isCaseSensitive() {
return isCaseSensitive;
public void setCaseSensitive(boolean flag) {
isCaseSensitive = flag;
public boolean isStrict() {
return isStrict;
public void setStrict(boolean flag) {
isStrict = flag;
public List<String> getDataList() {
return dataList;
public void setDataList(List<String> list) {
if (list == null) {
throw new IllegalArgumentException("values can not be null");
} else {
dataList = list;
return;
private List<String> dataList;
private boolean isCaseSensitive;
private boolean isStrict;
private CitiesComboBox citiesComboBox;
2/ def:
a/ JtextField
private ArrayList<String> listCities = new ArrayList<String>();
private final CitiesTextField cityTextField = new CitiesTextField(listCities);
b/ methods
cityTextField.setCaseSensitive(true);
cityTextField.setDataList(listCities);
cityTextField.setStrict(true);
c/ upload listCities data from db
3/ if you want I can send you def. for ComboBox
... kopik -
hello guys!
i am exploring adobe flex and it is so awesome that i want to
learn more about it.
i am a web developer and i would like to learn more about
autocomplete capability of adobe flex similar to this
http://createwebapp.com/demo
i hope that you can help me guys! thanks :)Adobe Newsbot hopes that the following resources helps you.
NewsBot is experimental and any feedback (reply to this post) on
its utility will be appreciated:
Adobe - Flex 3:
Flex is a highly productive, free open source framework for
building and maintaining expressive web applications that deploy
consistently on all major
Link:
http://www.adobe.com/products/flex/
Adobe Flex 3 Language Reference:
Frame Alert. This document is designed to be viewed using the
frames feature. If you see this message, you are using a
non-frame-capable web client.
Link:
http://livedocs.adobe.com/flex/3/langref/
Flex.org - Rich Internet Application Development:
Welcome to the new Flex.org. This site aggregates Flex news
from a number of sources, and allows community members to
contribute their own content as well.
Link:
http://flex.org/
Flex 3 - Versioning:
You might encounter some versioning issues when working on
Adobe Flex applications. When compiling, you can choose the version
of the SDK to use and you
Link:
http://livedocs.adobe.com/flex/3/html/versioning_1.html
Adobe Flex - Wikipedia, the free encyclopedia:
Adobe Flex is a collection of technologies released by Adobe
Systems for the development and deployment of cross platform rich
Internet applications based
Link:
http://en.wikipedia.org/wiki/Adobe_Flex
Adobe - Flex Developer Center:
Check out the getting started guide on learn.adobe.com, with
special areas for developers using Flex with PHP, .NET, Java, and
ColdFusion.
Link:
http://www.adobe.com/devnet/flex/
Disclaimer: This response is generated automatically by the
Adobe NewsBot based on Adobe
Community
Engine. -
Bash: How can I get Ubuntu-style autocompletion?
A little background. When I used Ubuntu (up until maybe a week ago), almost all the commands had special autocompletion "rules" as I guess you might call them. For instance, I could type "sudo apt-get install libsdl", hit tab twice, and get a list of all the available packages related to libsdl.
How can I configure this in Arch?Hi, check this link out: http://wiki.archlinux.org/index.php/Bas … Completion
Relevant part of .bashrc:
# enable auto completion on sudo commands
complete -cf sudo
# enable bash completion in interactive shells
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
Last edited by s3kt0r (2009-05-03 02:32:06)
Maybe you are looking for
-
Need a low-cost practical method to show existing PDF rpts in Excel
We have a Forms 10g Application. The customer is satisfied with 150+ reports (which are shown as PDFs in a web-browser). However, the user wants, at the touch of a button, to give a what-u-c-is-what-you-get, exact match, replication of the PDF report
-
In both of the RAD environment which I have previously used, there are property editors for a collection of a particular property type. In Borland's VCL the property editor is built-in once one uses a VCL collection as a property, while in .Net one c
-
I am using JTable to display a series of simple text strings. Every cell contains the same kind of data; it isn't querying a database or anything like that. The user must be able to delete these cells quickly, so the design of the application is such
-
Hi, is there any stored procedure to unload a view i.e ( its table structure and data or only data as comma seperated values) to a .txt or.sql file Thanks in advance, Suni
-
Hello, I'm trying to optimize my company's website (SEO), and I compared with other company website, and they were able to put scrolling text, but a kind of scrolling text that if you see source code, all the text it's the index, so it's perfect for