2012年12月25日火曜日

【Linux】CentOS6でuseraddしても、ログインできない

問題: タイトルどおり。
原因: ログインユーザがGroup指定されており、そこに新規Userを追加していなかった。
解決策: vi /etc/group で、対象のGroupに新規ユーザを追加する。

↓のサイトを見て解決。
http://koexuka.blogspot.jp/2009/08/ssh.html


他にもメモ。
以下、lockoutはユーザ名です。


password-authに以下の行を追加すると、パスワードを間違えた回数が記録される。
auth        required      pam_tally2.so deny=3

記録回数の確認は、以下のコマンド。
pam_tally2 -u lockout

ロックアウト解除
pam_tally2 -r -u lockout
or
pam_tally2 -u lockout --reset


ロックアウトをテストするために、ユーザ追加して、確認する手順。

useradd lockout ← ユーザの新規追加

tail -n 10 /var/log/secure ← ログインできない理由を調査

Dec 25 14:05:03 xxx sshd[32330]: User lockout from xxx.xxx.xxx.xxx not allowed because none of user's groups are listed in AllowGroups


vi /etc/group ← 所属Groupにlockoutユーザを追加


これで、ログイン可能!

2012年12月24日月曜日

rvmでRubyを管理するためのメモ。


  489  rvm list
  490  rvm use 1.9.3 --default
  491  rvm use 1.9.3-p125 --default
  493  rvm list
  494  rvm use 1.8.7-p357 --default
  496  rvm list
  497  rvm use 1.9.2-p290 --default
  637  rvm list

2012年12月9日日曜日

gitで公開されているプロジェクトをclone

特に難しい事は無いです。

git入れてる前提で。

cloneを作りたいフォルダで、というか、フォルダを私は以下に置いています。

~/workspace/rubyonrails/gitclone

で、gitcloneフォルダ以下で、以下のコマンドすればOK。

$git init
$git clone <Repository URL>

見た方がよいプロジェクトは以下のサイトにまとめて頂いている方がいますので、参考にして下さい。

http://bit.ly/UnQm3C

Ruby on Railsで新しいプロジェクトを作る時


mkdir -p の"-p"は中間フォルダも作成するオプション。
やることは、フォルダ作ってGemfile作ってbundle installするだけ。

$ mkdir -p ~/workspace/rubyonrails/herokusample
$ cd ~/workspace/rubyonrails/herokusample/
$ echo "source 'https://rubygems.org'" >> Gemfile
$ echo "gem 'rails', '= 3.2.5'" >> Gemfile
$ bundle install

これが終わったら、カレントディレクトリをherokusampleにして、

$ bundle exec rails new <app name> -T

とすれば、<app name>フォルダ以下にrailsに必要なファイル群が生成される。
ここで、scaffold作るもよし。

rubyのversionを整える。

久々にRubyを触りたくなったので、メモ。

まず、Rubyのversionを確認。
以下のコマンドで確認。

$ rvm list

rvm rubies

   ruby-1.8.7-p357 [ i686 ]
=* ruby-1.9.2-p290 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

ruby-1.9.3-p125を使いたかったので、以下のコマンドで使いたいversionのrubyを入れました。

$ rvm install 1.9.3-p125
Fetching yaml-0.1.4.tar.gz to /Users/<username>/.rvm/archives
Extracting yaml-0.1.4.tar.gz to /Users/<username>/.rvm/src
Configuring yaml in /Users/<username>/.rvm/src/yaml-0.1.4.
Compiling yaml in /Users/<username>/.rvm/src/yaml-0.1.4.
Installing yaml to /Users/<username>/.rvm/usr
Installing Ruby from source to: /Users/<username>/.rvm/rubies/ruby-1.9.3-p125, this may take a while depending on your cpu(s)...

ruby-1.9.3-p125 - #fetching 
ruby-1.9.3-p125 - #downloading ruby-1.9.3-p125, this may take a while depending on your connection...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 9505k  100 9505k    0     0   290k      0  0:00:32  0:00:32 --:--:--  202k
ruby-1.9.3-p125 - #extracting ruby-1.9.3-p125 to /Users/<username>/.rvm/src/ruby-1.9.3-p125
ruby-1.9.3-p125 - #extracted to /Users/<username>/.rvm/src/ruby-1.9.3-p125
ruby-1.9.3-p125 - #configuring 
ruby-1.9.3-p125 - #compiling 
ruby-1.9.3-p125 - #installing 
Removing old Rubygems files...
Installing rubygems-1.8.15 for ruby-1.9.3-p125 ...
Installation of rubygems completed successfully.
ruby-1.9.3-p125 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.9.3-p125 - #importing default gemsets (/Users/<username>/.rvm/gemsets/)
Install of ruby-1.9.3-p125 - #complete 


そして、確認してみて、以下のような感じです。

$ rvm list

rvm rubies

   ruby-1.8.7-p357 [ i686 ]
=* ruby-1.9.2-p290 [ x86_64 ]
   ruby-1.9.3-p125 [ x86_64 ]

# => - current
# =* - current && default
#  * - default



2012年12月7日金曜日

SVN認証確認画面が何回もでる対策

原因は分からないが、Repositoryにアクセスしようとすると、以下のような画面が何度もでる。



対策としては、eclipseをインストールしたフォルダ直下にあるconfigurationフォルダ内に
".keyring"ファイルがある。

これがキャッシュとして存在しているので、これを削除して、eclipseをrestartすれば直る。

ソース
http://stackoverflow.com/questions/914895/how-to-change-credentials-for-svn-repository-in-eclipse

2012年11月28日水曜日

EclipseからBundle間のDependencyを確認する

EclipseでPlugin開発をしている時に、バンドル間の依存関係を知りたい時、どうやってみるか?
以下のPluginタブを開く

 で、依存性を確認したいバンドル上で右クリックして、"Open Dependencies"をクリックすると
 
下図みたいな感じで、依存関係がわかる。
 
 ちなみに、上のタブの端っこに
 
こんなアイコンがあるが、これで依存性の向きを指定できる。

2012年11月19日月曜日

VirtualBoxでBridge接続

NATとか、HostOnly接続とか、それぞれがホストOSとどのようにつながるかは、他のサイトを参考にしてもらい、ここでは、Bridge接続をするときの注意だけ書きます。

まず、以下環境。

MacOS 10.6.8
VritualBox 4.2.4
CentOS 6.3

MacOSはWifiでつながっているが、MACアドレス指定して、固定IPがふられています。
#これはRouterの設定でできました。私のRouterはNECのatermです。

取りあえず、VirtualBoxインストールして、CentOS入れます。
そこで、CentOSを起動する前に、Networkの設定をいじります。

といっても、NAT接続(恐らくデフォルト)になっているものを、Bridgeに変えるだけ。
ただ、ここでNICを指定するのだが、私はAirPortの記載があったNICを指定しました。

で、CentOSをインストール。
これでうまくつながるはず。


つながらない場合は、CentOSを入れ直すことはしなくても、以下のファイルをいじって
rebootとか、/etc/init.d/network restartすれば大丈夫。

でもはまったのが、NICをどうやって認識させるか、という事。
以下コマンドで解決!

/etc/sysconfig/network-script/ifcfg-eth0
を認識させるには

ifup eth0

逆に認識させないようにするには

ifdown eth0

でOK。

確認はifconfigでどうぞ。

2012年11月7日水曜日

JIRAをMySQLで

【環境】
CentOS: 6.3
JIRA: 5.1.8

 MySQLでUserを追加するために、

mysql -u root -p

でmysqlに入る。

◆Userの追加
Userを追加するために、以下を実行。(DBName: jiradb, UserName: jiradbuser)
#e.g. <ipaddress> =  192.168.0.1

mysql> GRANT ALL PRIVILEGES ON jiradb.* TO jiradbuser@<ipaddress> IDENTIFIED
 BY 'password';


確認のため、以下のコマンドを。

select user, host from mysql.user

 これで、↓みたいな感じで、登録できたら成功。

+----------------+-----------------+
| user           | host            |
+----------------+-----------------+
| root           | 127.0.0.1       |
| jiradbuser    | 192.168.0.1 |
| root           | localhost       |
+----------------+-----------------+

 ◆DBの追加
以下のコマンドを実行するだけ。

CREATE DATABASE jiradb CHARACTER SET utf8 COLLATE utf8_bin;

確認したければ、"show databases;"で。

◆Connectorの追加
私の環境ではすでに入っていたので、省略。本家参照。(ページの最後に追加)

◆ConnectionTest
Consoleから、以下のコマンドを叩くだけ。
/<InstallDirectory>/jira/bin/config.sh

画面に従って操作する。 ↓な感じ。太字が入力項目。

 --- Main Menu ---
  [H] Configure JIRA Home
  [D] Database Selection
  [A] Advanced Settings
  [S] Save and Exit
  [X] Exit without Saving

Main Menu> D

--- Database Selection ---
  Database Type : MySQL
  Instance      :
192.168.0.1:3306/jiradb
  Connect As    : jiradbuser / *****
 

*  [H] HSQL (not for production use)
  [M] MySQL
  [O] Oracle
  [P] PostgreSQL
  [S] SQL Server (MS-SQL)

  [X] Return to Main Menu


 Database Selection [H]> M
MySql Database Configuration.
Hostname ()>
192.168.0.1
Port ()> 3306
Database ()> jiradb
Username ()> jiradbuser
Password ()>
Test Connection  ([Y]/N)? > Y
Attempting to connect to 192.168.0.1:3306/jiradb
Connection successful!



このセットアップが終わって、やっとJIRAのSetup画面からDB接続ができるようになる。 

参照サイト
https://confluence.atlassian.com/display/JIRA/Connecting+JIRA+to+MySQL

ConfluenceとApacheHTTP連携

【OS】
CentOS 6.3

【前提】
ApacheHTTP側はすでにPort80で受け入れ可能であること
Confluece(4.3.2)が動作できること

【やりたいこと】
http://<Your Location>:8090

でアクセスするのを、

http://<Your Location>/confluence

でアクセスできるようにする。

【解説】
◆Confluence内のTomcatのserver.xmlを修正
<confluence install directory>/conf/server.xml

を開く。

- Connectorの記述を、水色字を追加する。
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8090" minProcessors="5"
                   maxProcessors="75"
                   enableLookups="false" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="20000"
                   useURIValidationHack="false" URIEncoding="UTF-8" protocol="AJP/1.3" />

- Context pathの記述を、水色字のように修正する。

<Context path="/confluence" docBase="../confluence" debug="0" reloadable="true" useHttpOnly="true">

◆Apache側のhttpd.confを修正
CentOS6の場合は、"/etc/httpd/conf/httpd.conf"にあるはず。

で、それを開いて
最下段に以下の1行を追加。

Include conf/extra/httpd-proxy.conf

◆Apache側のhttpd-proxy.confを修正 or 新規作成
 /etc/httpd/conf/extra/httpd-proxy.confファイルを開く。
#extraフォルダ、httpd-proxy.confファイルがない場合は新規で作成する。

開いたら、以下の3行を追加する。
#Port:8090はConflueceのDefault。

<Location /confluence>
     ProxyPass ajp://<Your Location>:8090/confluence
</Location>


◆仕上げ

設定が終わったら、"sudo apachectl graceful"を忘れずに。

ブラウザから、"http://<Your Location>/confluence
でConfluenceにアクセスできるはず。


2012年11月6日火曜日

Spring-Axis2連携 on OSGi 其の2(完結)

其の1の続き

java.lang.ClassNotFoundException: org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
 
のExceptionが出ていたので、SpringServletContextObjectSupplierクラスを参照したけど、よくわからん。
なので、親クラスのSpringObjectSupplierをみると、public static Object createServiceObject(final AxisService service) な
メソッドがあるではないか!
 
そして、このメソッド見たら、こんな文字が!(下の赤字) 
 
  /**
     * Create a service object for a given service. The method first looks for
     * the {@link Constants#SERVICE_OBJECT_SUPPLIER} service parameter and if
     * this parameter is present, it will use the specified class to create the
     * service object. If the parameter is not present, it will create an
     * instance of the class specified by the {@link Constants#SERVICE_CLASS}
     * parameter.
     *
     * @param service
     *            the service
     * @return The service object or <code>null</code> if neither the
     *         {@link Constants#SERVICE_OBJECT_SUPPLIER} nor the
     *         {@link Constants#SERVICE_CLASS} parameter was found on the
     *         service, i.e. if the service doesn't specify how to create a
     *         service object. If the return value is non null, it will always
     *         be a newly created instance.
     * @throws AxisFault
     *             if an error occurred while attempting to instantiate the
     *             service object
     */
 
つまり、他のサイトなどで参考にしていたServiceObjectSupplierの指定を外せば、
ServiceClassのインスタンスを生成してくれると!
そして、ServiceClassはwsdlでservices.xmlを生成した際に記述済み!

という事で、ServiceObjectSupplierの記載をservices.xmlからコメントアウトすると、
今度は以下のException
 
[ERROR][11/06/2012 20:14:26:883] loader constraint violation: loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously initiated loading for a different type with name "javax/activation/DataHandler" (org.apache.axis2.transport.http.AxisServlet) 
 java.lang.LinkageError: loader constraint violation: loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously initiated loading for a different type with name "javax/activation/DataHandler"
 at java.lang.Class.getDeclaredFields0(Native Method)
 at java.lang.Class.privateGetDeclaredFields(Class.java:2291)
 at java.lang.Class.getDeclaredFields(Class.java:1743)
...
 
何やら、javax/activation/DataHandlerが怪しいなー、という事で、javax.actionvationを文字列検索して
ヒットした、com.springsource.javax.activationバンドルをRequired Plug-insに追加して再起動!

目的のメソッドにデータが受信できた!!!


※このBundleを起動する前に、WebServerBundle(Jetty等)を起動しておかないと、Serviceの登録ができていないため、Serviceがちゃんと動きません。

2012年11月1日木曜日

Spring-Axis2連携 on OSGi 其の1

備忘録として。

まず、既存のPlatformにSpringFrameworkでAxis2連携に必要なモジュールがなかった。。。
→ http://www.springsource.org/
から、サイトの右下にある、以下の図の"Spring Framework"を選択。



今回は、他のjarが3.0.3を使用していたので合わせるために、以下の図の3.0.3をダウンロード。


何が足りなかったかは後で調査するとして、解凍したJar群をTargetPlatformにぶち込む。

また、Axis2本家のサイトの下の方に隠れてServiceLifeSycleの記載が!
→ http://axis.apache.org/axis2/java/core/docs/spring.html

さらりと
public class SpringInit implements ServiceLifeCycle {

なクラスを作ってね!って書いてある。。。
取りあえずそのクラス作って、services.xmlに以下の記述を追加してOSGi起動!
<service name="SpringAwareService" class="spring.SpringInit">
それとなく動いたものの、なぜかspring-bean.xsdがねーよ!と怒られる。
 [ WARN][11/07/2012 10:35:38:594] Ignored XML validation warning (org.springframework.beans.factory.xml.XmlBeanDefinitionReader) 
 org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
 at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
 at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:96)
 at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:380)
 at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
 at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2541)
 at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaWarning(XSDHandler.java:2532)
 at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:1836)
 at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:531)
 at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
 at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(XMLSchemaValidator.java:2436)
 at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1781)
 at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
 at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
 at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3103)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
 at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
 at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
 at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
 at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
 at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
 at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
 at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
 at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
 at spring.SpringInit.startUp(SpringInit.java:23)
 at org.apache.axis2.deployment.ServiceBuilder.loadServiceLifeCycleClass(ServiceBuilder.java:526)
 at org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:213)
 at org.apache.axis2.osgi.deployment.OSGiServiceGroupBuilder.populateServiceGroup(OSGiServiceGroupBuilder.java:107)
 at org.apache.axis2.osgi.deployment.ServiceRegistry.addServices(ServiceRegistry.java:112)
 at org.apache.axis2.osgi.deployment.ServiceRegistry.register(ServiceRegistry.java:49)
 at org.apache.axis2.osgi.deployment.tracker.BundleTracker$1.bundleChanged(BundleTracker.java:70)
 at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:919)
 at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:227)
 at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:337)
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 4 in XML document from class path resource [META-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
 at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)

とりあえず、いろいろ調べたところ、META-INF/以下に以下のファイルを置くのがよさそう。
spring.schemas 
spring.handlers
#さっきのSpringInitの中の実装でも見にいってるし。
ちなみにこのファイルは、Springのサイトからダウンロードした時に含まれている、 "org.springframework.beans-3.0.3.RELEASE.jar"の中のMETA-INFの中にあるものを流用。
ここでOSGi起動!したが、なぜか、org.springframework.beans.factoryなんちゃらで怒られた。
原因は、"org.springframework.beans"バンドルをRequiredPlug-insではなくImportedPackagesでImportしていたから。
なので、RequiredPlug-insでrequireしてOSGi起動!
java.lang.ClassNotFoundException: org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier

続き
http://dah8ra.blogspot.jp/2012/11/spring-axis2-on-osgi_6.html

2012年10月11日木曜日

EclipseにGWTSDKを入れる

UpdateSite
https://developers.google.com/eclipse/docs/getting_started

帯域制限がかかったら、以下のサイトからzipを落としてくる。
https://developers.google.com/eclipse/docs/install-from-zip

zip解凍して、pluginsフォルダの中身をEclipseのpluginsフォルダにコピー。

再度UpdateSiteより、対象のPluginを落としてくると、Installに成功する。

Eclipse JunoにSubversiveを入れる

日本語化したくない場合は、Localizationのチェックを外しておく。





2012年8月28日火曜日

XCode4で、メモリリークをデバッグ

検索してもなかなかゴールまでたどり着かなかったのでメモ。
なぜなかなか引っかからなかったかというと、XCodeのバージョン。
3はあるけど、4はない、みたいな。

取りあえず、以下の通り。

まず、「Manage Schemes...」を選択
開いているProjectを選択して、画面左下の「Edit」を押下。

画面の右ペインに「Environment Variables」という所があるので、
図のように3項目をvalue=YESで設定してあげる。
すると、DebugConsoleに誰がどこでalloc、freeしたががわかるようになる。
早速、EXC_BAD_ACCESSがでるコードをエミュレートしてみると、以下のようなログがでると思います。

2012-08-28 19:36:35.367 HelloWorld[38022:1be03] cocos2d: cocos2d v2.0.0
2012-08-28 19:36:35.368 HelloWorld[38022:1be03] cocos2d: Using Director Type:CCDirectorDisplayLink
2012-08-28 19:36:35.421 HelloWorld[38022:1be03] Retina Display Not supported
2012-08-28 19:36:35.428 HelloWorld[38022:1be03] cocos2d: animation started with frame interval: 60.00
2012-08-28 19:36:35.434 HelloWorld[38022:1be03] cocos2d: surface size: 480x320
2012-08-28 19:36:35.436 HelloWorld[38022:1be03] cocos2d: CCTexture2D: Using RGB565 texture since image has no alpha
[Switching to process 38022 thread 0x1f113]
[Switching to process 38022 thread 0x1be03]
2012-08-28 19:36:37.279 HelloWorld[38022:1be03] *** -[CCSprite zOrder]: message sent to deallocated instance 0xaa87e20
sharedlibrary apply-load-rules all
(gdb) shell malloc_history 38022 0xaa87e20

最後の行に「(gdb)」ってでると思うので、ここで「shell malloc_history {PID} {インスタンスアドレス}」というコマンドを打ってあげると、以下のようなログがでて、メモリの履歴を見れます。

ALLOC 0xaa87e10-0xaa87e4f [size=64]: thread_b024f000 |thread_start | _pthread_start | cvmDoWork | (省略) | malloc | malloc_zone_malloc 
FREE  0xaa87e10-0xaa87e4f [size=64]: thread_b024f000 |thread_start | _pthread_start | cvmDoWork | (省略) | free 
(省略)と書いた所に、自分が作成したクラス名とかメソッド名が記載されていたら、そこに問題アリって感じでデバッグできるよ。

コードをブログにキレイにカキタイ

以下を参考にしました。
特に難しいことは無いですが、黒背景のブログはめんどいね。

http://fascinating-pieces.blogspot.jp/2012/02/google-code-prettify-blogger.html

Objective-Cを独習

夏休みに予定を入れ忘れたので、Objective-Cを学ぼうと思います。

取りあえず、以下を読んである程度の文法を理解した。
http://wisdom.sakura.ne.jp/programming/objc/index.html

#検索したら、以下にキレイに文法がまとまっているサイトがありました。
http://d.hatena.ne.jp/fn7/20100203/1265207098

これを読んでわからなかった事について検索。

プロパティがよくわからん。
➡ 外部に公開しているインスタンス変数のこと。@propertyで宣言する。
以下の用に、ヘッダファイル内でインスタンス変数を宣言する方法は古いらしい。
➡ http://www.awaresoft.jp/ios-dev/item/115-ivar-naming-convention.html

@interface Hoge {
  NSString* a;
  NSInteger b;
}
@end

@synthesizeってなに?
➡ Getter、Setterをコンパイル時に自動生成して提供する。
でも、上記アクセサメソッド渡したら、インスタンス変数隠蔽できなくない?
➡ http://ishwt.net/blog/2010/05/21/objc20-property/
つまり、

@interface Hoge {
  NSString* a;
  NSInteger b;
@property (readonly, retain) NSString* a;
@property (readonly, assign) NSInteger b;
@end

って感じで、readonlyをつけると、外部からのアクセスにより書き換えられる心配はなくなりますってこと。

これからObjective-Cを学ぶなら、以下の本が良さそうなので購入してみた。




ちなみに、目標はcocos2dを使ってゲームを作ってみること。
以下の本が良書として推薦しているサイトが沢山あったが、既に新バージョンがでているため、購入はオススメしない。次作がでるまで待つか、他の本をあたろう。
#そりゃcocos2dのofficialが一番いいと思うけど。。。




現時点では、以下の本に期待。
#洋書なので、翻訳版が早くでることを期待して。

2012年8月6日月曜日

Java並行処理プログラミング1

【単一不可分(アトミック)】
 単一の操作で不可分なので、その操作は分けられません。
以下は、アトミックでは無い操作。
①read-modify-write
②check-then-act
①は、index++みたいなやつ。

この操作は、実際には以下の3つの操作をしています。

1、indexの値を取得
2、値を書き換え(1加算)
3、indexに書き込みます。

このように、複数回の操作をすることは、単一不可分では無いと言います。
じゃあ、どうするの?というと、単純に言えば同期すれば、この1、2、3が 1回の操作として実行されます。
これを単一不可分な操作という。つまり、アトミックです。

【逸出】 公開すべきでは無いオブジェクトが公開される事。

【不可変】 オブジェクトが不可変であるとは、、、
→コンストラクション後、ステートの変更ができない
→すべてのフィールドがfinalで、コンストラクション時にthis参照が逸出しない
という事です。
余談(?)ですが、コンパイラが最適化をすると、同期しないと実行順序が意図しない順序に変わる可能性があります。

2012年7月24日火曜日

マルチスレッドの勉強本

今、これ読んでます。



すごいいいです。初心者には想像もつかない、コンパイラの最適化の動作やメモリの可視性についてなどが書いてあります。
私もまだ読み始めですが、とても勉強になります。

PropertiesファイルのKeySetで拡張for文

拡張for文を使って、Propertiesファイルからloadしたデータをまわしたいってことありませんか?

そうです。以下のメソッドでそれができます。
Properties props = new Properties();
Set<String> propNames = props.stringPropertyNames();

これでpropNamesにPropertiesファイルのKeyセットが入ります。
これを使って、以下のように拡張for文を書きましょう。

for(String key : propNames){ ... }

Mapになんでもかんでも詰め込まない

色々な型の、だけどすべてある事をするために必要なデータである、というだけでMapにバラバラのデータ型のデータを詰め込まない。
何のためにGenericsがあるの?って事になる。

集合としてみれるデータであれば、まだ入れる価値はあるかもしれないが、それでも型が異なる物は入れない方がよいし、中に何が入っているのかわかりにくくなる。

Mapを使うには理由をつけて使用すべき。
例えば、同じ種類の違う値、Keyを持つデータ群がある場合、Keyに意味を持たせ、例えば、Keyを文字列で連結して生成したり、などをして同じ種類のデータを取得するようにすれば、それはMapを使う意味があるだろう。

PipedInputStreamとPipedOutputStream

XSLT変換するとき、Transformerクラスってのを使います。
このクラスが持つtransformメソッドは、引数にStreamのInputとOutputを入力するようになっています。
でも、OutputStreamに何かを書き出してから、それをSourceとしてtransformしたい場合、Sourceの型はInputStreamになっているので、一旦ファイルに落として再読み込みしなければならない。。。

と思っていたのですが、PipedOutputStreamを使って、PipedInputStreamにconnectしてあげれば、OutputStreamをInputStreamに変換(?)、という事が可能です。


で、PipedOutputStreamをBufferedOutputStreamでWrapしてあげて、これに沢山のデータを突っ込んでいると、あるタイミングでflushが走ります。そうすると、PipedInputStreamが確保しているBuffer領域にデータが流し込まれます。
確保するBuffer領域は、デフォルトで1024bytesです。

また、このPipedInput/OutputStreamは、マルチスレッドで使用しないと、デッドロックが発生する可能性があります。

また、このPipedInput/OutputStreamを使用する時に注意すべき事があるのですが、OutputStream側が書き出しをしているのに、InputStream側がcloseしてしまうと、Exceptionを(確か)吐きます。
なので、closeするタイミングも気にしながら実装すると、バグを埋め込まないで実装できると思います。


2012年6月14日木曜日

Javaのメモリ領域

Javaでは、以下の3つのメモリ空間が存在する。
パーマネント領域
ヒープ領域
スタック領域

まず、パーマネント領域。
これは、クラス情報や、staticな情報を格納する領域。
JVMがクラスをロードする際に、クラス情報をここの領域に展開する。

次にヒープ領域。
これは、パーマネント領域のクラス情報を元に作られたインスタンスのデータが格納される。

最後にスタック領域。
ここには、ローカル変数のデータや、メソッド呼び出しの際に、呼び出し側の番地のデータが格納される。
例えば、レシーバオブジェクト(呼び出された方のオブジェクト)のメソッドがreturnする際に、スタックに保持しておいた呼び出し側の番地を参照して、呼び出し側のコードに戻る。

ちなみに、オブジェクトにあたるデータは言語によって異なる。
定義としては、クラス情報を元に生成されたインスタンス=オブジェクト。

例えば、JVM上にロードされたクラス情報はオブジェクトではないが、インスタンスはオブジェクトである。
また、Objective-Cでは、クラスをロードすると、Classクラスのインスタンスが生成されるので、これはオブジェクトと呼べる。

2012年6月13日水曜日

Gmailが送れない。

Console上では、Errorとかでてないのに、GmailがRoRからおくれません。
以下のサイトを元に、app/config/environments/development.rb
を書き換えてみたけど、ダメでした。
また、明日考えます。

http://d.hatena.ne.jp/shunsuk/20110110/1294657636

2012年6月7日木曜日

ダイジェスト認証ではまった。


以前も紹介させて頂いた以下の本を読んでます。
で、ダイジェスト認証使っているので、本の通りに実装したのだけど、うまく動かない。

Digest::SHA1.hexdigest(password)


ってところで、hexdigestなんて文字列ねーしって怒られます。
あれこれ試したけど、全然動かないので、パスワードをそのままDBに突っ込んで次へ行きました。
原因は不明ですが、恐らくバンドルが足りてないのでは?と思います。
また、後ほど原因を究明しようかと思います。(時間があれば。。。)

2012年6月5日火曜日

XMLからXSLTへ

大容量のXMLを生成してからXSLTに変換する時に、ボトルネックになりうる所が、2カ所あります。
1.XMLを生成する所
2.XSLTを生成する所

です。まぁ当たり前ですが、問題は、生成の仕方です。
大量のデータを持つXMLを生成する時は、DOMを使ったらOutOfMemoryしちゃう可能性があります。
だって、DOMは処理する前にすべてのデータを一旦メモリに展開しちゃうんですもの!

なので、逐次にデータを読み込みながらXMLを生成します。
これは、JavaSE6から導入されたStAXというパーサーを使えば解決できます。

次に、2.のXSLTの生成ですが、StAXで逐次に生成したXMLを逐次にXSLTに突っ込みたいんですが、APIが受けられるような作りになっていませんでした。

こちらは調べた所、逐次で生成ができないみたいです。
つまり、XMLが完成している状態じゃないとXSLTのAPIは受け付けてくれません!

ということで、今私が作成しているモジュールの構成は、XMLを一旦逐次でFileに落として、再度XSLTのAPI使ってFileを読み込むようにする予定です。
#はー、絶対パフォーマンス下がるよなー、XSLT生成のところ。。。


参考にさせて頂いたとても詳しいページです。
http://moyolab.blog57.fc2.com/blog-entry-29.html

2012年6月4日月曜日

hamlメモ1

よく使うコマンドと文法をメモメモ。

1.rake haml:convert_erbs
2.< div class="field" >
3.<p style="color: Red"><%= @error %></p>
4.<br />

これらを翻訳すると、以下な感じ。

1.これで、project内のerbファイルをすべてhamlに変換!
2..field だけでok
3.%p{:style => "color: Red"}= @error
4.%br/

他にも色々あるけど、取りあえずこれだけ。

2012年5月29日火曜日

開発中のprojectのerbファイルをhamlへ。

まず、プロジェクトルートへ移動します。
で、以下の3行をGemfileに追加。

group :development do
  gem 'erb2haml'
end

Gemfileを保存したら、
$ bundle install

install終わったら、

$ rake haml:convert_erbs

Looking for ERB files to convert to Haml...
Converting: app/views/authors/_form.html.erb... Done!
Converting: app/views/authors/edit.html.erb... Done!
Converting: app/views/authors/index.html.erb... Done!
Converting: app/views/authors/new.html.erb... Done!
Converting: app/views/authors/show.html.erb... Done!
Converting: app/views/books/_book.html.erb... SyntaxError: embedded document meets end of file. near line 3: "\r"
  Use --trace for backtrace.
Failed!
Converting: app/views/books/_form.html.erb... SyntaxError: embedded document meets end of file. near line 3: ""
  Use --trace for backtrace.
Failed!
Converting: app/views/books/edit.html.erb... Done!
<中略>
Converting: app/views/view/simple_format.html.erb... IndexError: index 74 out of string
  Use --trace for backtrace.
Failed!
Converting: app/views/view/truncate.html.erb... Done!

いくつか失敗してるけど、フォーマットの問題と踏んで、気にせず次に行こう。
気になる人は、ちゃんと--traceオプションつけたり、もとのerbファイルを見直しましょう。
#変換失敗した場合は、hamlファイルは生成されてるけど、中身が空です。

それと、erbは残っているみたいなので、不要なら消してね☆
ちなみに、2回目の変換の場合は、差分のみ出力されました。

hamlを使う。

先日から、hamlジェネレータで遊んでいましたが、rails上でサンプルを動かしてみた。

$ rails new hamltest
$ cd hamltest
$ bundle install vendor/bundle

としたら、3行目の書き方は、deprecatedだってさ。
なので、言われた通りにしてみる。

$ bundle install --path vendor/bundle
...
Your bundle is complete! It was installed into ./vendor/bundle

うん、上出来。

で、Gemfile開いて、以下の1行を追加。
gem 'haml-rails'

で、
$ bundle install

からの
$ rails g controller sample index

って打ってみると、


create  app/controllers/sample_controller.rb
       route  get "sample/index"
      invoke  haml
      create    app/views/sample
      create    app/views/sample/index.html.haml
      invoke  test_unit
      create    test/functional/sample_controller_test.rb
      invoke  helper
      create    app/helpers/sample_helper.rb
      invoke    test_unit
      create      test/unit/helpers/sample_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/sample.js.coffee
      invoke    scss
      create      app/assets/stylesheets/sample.css.scss



よしよし、erb -> hamlへと変わっている。
これで、localhost:3000たたいて動けばOK。

また、よくよく見ると、CoffeeScriptまでできるようになっているではないか!
これは、後ほど勉強しますか。

そういや、環境書いてなかったね。
------------------
MacOS Lion
ruby 1.9.2
Rails 3.2.3
------------------

2012年5月26日土曜日

app/views/layout以下の構成

Ruby on Rails3 アプリケーションプログラミングという本を読んで、コーディングできるように勉強してます。
ちょっとはまったので、メモ。
以下の様なErrorが常にでるようになってしまっていたが、原因がわからず。

Started GET "/assets/defaults.js" for 127.0.0.1 at 2011-09-22 10:22:05 +0200
Served asset /defaults.js - 404 Not Found (3ms)
ActionController::RoutingError (No route matches [GET] "/assets/defaults.js"):

色々調べた結果、app/views/layout以下のファイルに問題がある事が判明。
恐らく、ちゃんと設定できていなかったみたい。ここは今度しっかり理解する。
なので、取りあえず、
rails generate scaffold なんたらで、scaffold作ってみて、app/views/layout以下に何のファイルがあるかをチェック。
あら?application.html.erbファイルのみだった。
ここも、本に沿っていじいじしたので、元に戻したら、ちゃんと動くようになりました。