////
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
////
= NekoBean
:jbake-type: page
:jbake-tags: community
:jbake-status: published
:keywords: NekoBean
:description: NekoBean which is a mascot of Apache NetBeans community
:toc: left
:toc-title:

link:nekobean_ja.html[Japanese page is here(日本語のページはこちら)]

== What's NekoBean

NekoBean came from Japanese Speaking Community. It is a mascot of Apache NetBeans Community. (Neko means a cat in Japanese.)

image::nekobean250x250.png[NekoBean, 250, 250, align="center"]

image::https://licensebuttons.net/l/by-sa/2.1/jp/88x31.png[CC BY-SA 2.1 JP, 88, 31, link=https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en, align="center"]

NekoBean by link:http://blog.cgfm.jp/mutsuki/[カネウチカズコ(Kazuko Kaneuchi)] is licensed under a link:https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en[Creative Commons Attribution-ShareAlike 2.1 Japan License]. 
As for use, please confirm link:#_about_credit[about credit].

== Various NekoBeans

image:nekobean50x50.png[NekoBean, 50, 50, link="http://nekobean.net/present/dl/svg.zip"] 
link:http://nekobean.net/present/dl/svg.zip[Download SVG files as a zip]

[cols="a,a,a"]
[frame="none", grid="none"]
|===
|
.NekoBean
[#nekobean]
[caption="", align="center"]
image::nekobean250x250.png[NekoBean, 250, 250, link=nekobean.png] |

.Happy
[#nekobean-happy]
[caption="", align="center"]
image::nekobean_happy250x250.png[NekoBean, 250, 250, link=nekobean_happy.png] |

.Smile
[#nekobean-smile]
[caption="", align="center"]
image::nekobean_smile250x250.png[NekoBean, 250, 250, link=nekobean_smile.png] 

|
.Sad
[#nekobean-sad]
[caption="", align="center"]
image::nekobean_sad250x250.png[NekoBean, 250, 250, link=nekobean_sad.png] |

.Zzz...
[#nekobean-zzz]
[caption="", align="center"]
image::nekobean_zzz250x250.png[NekoBean, 250, 250, link=nekobean_zzz.png] |

.orz
[#nekobean-orz]
[caption="", align="center"]
image::nekobean_orz250x250.png[NekoBean, 250, 250, link=nekobean_orz.png]

|
|
.With Cat
[#nekobean-with-cat]
[caption="", align="center"]
image::nekobean_with_cat250x250.png[NekoBean, 250, 250, link=nekobean_with_cat.png]
|

|===

== About Credit

You must follow link:https://creativecommons.org/licenses/by-sa/2.1/jp/deed.en[Creative Commons Attribution-ShareAlike 2.1 Japan License].
If your use falls under any of the following, you can relax credit and use images.

=== Exceptions

* You can use images without credit if you use them in NetBeans' sites (e.g. netbeans.apache.org).
* In the case of personal use, you can use images without credit if you use them without modifying and editing them. 
(In this case, modifying and editing don't mean scaling them and modifying their backgrounds. i.e. You can scale them and modify their backgrounds.)

If you use images without credit, please add the link of this page(https://netbeans.apache.org/community/nekobean.html) if possible.

