/dev/null

(◞‸◟)

Electronで ipcMain = require( 'electron' ).ipcMainがundefinedになる

electron-prebuiltのversionを0.33.8から0.36.7に上げた。

するとipcモジュールが非推奨になっている。

(electron) ipc module is deprecated. Use require("electron").ipcMain instead.

注意通りにipcMainに置き換える。

- var ipc = require('ipc');
+ var ipcMain = require("electron").ipcMain; 

ところが取得した ipcMain がundefinedになる。 レンダラプロセス側も同様。

- var ipc = require('ipc');
+ var ipcRenderer = require( 'electron') .ipcRenderer; // => undefined

調べてみると以下のissueがあった。 github.com

下記のように取得すると問題なかった。ElectronのVersionによるらしいのだが、最新のドキュメントと一致しないのかな。

var ipcMain = require('ipc-main');

var ipcRenderer = require( 'ipc-renderer' );

Yosemite+XCode7にしたらCocos2d-Xなプロジェクトがbuild通らなくなった

いままでMavericks+XCode6で開発していたCocos2d-x(ver3.7)のプロジェクトがありました。

今更ながらYosemiteにして、ついでにXCode7にあげたら下記のようなエラーがでてbuildがFailするようになってしまいました。

Undefined symbols for architecture x86_64:
  "TopPageLayer::TopPageLayer()", referenced from:
      TopPageLayer::create() in TopPageScene.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

とりあえず同様の事象を調べてみるとこれが。

stackoverflow.com

libc++がDefaultになってしまったとかなんとか。 なのでlibstdc++戻してみます。

f:id:gitpub:20150928002021p:plain

なんだかエラー内容が変わりました。 threadがないとかもうなんだか。

In file included from /MyProject/proj.ios_mac/ios/Prefix.pch:11:
In file included from /MyProject/proj.ios_mac/../cocos2d/cocos/cocos2d.h:41:
In file included from /MyProject/proj.ios_mac/../cocos2d/cocos/base/CCAsyncTaskPool.h:29:
/MyProject/proj.ios_mac/../cocos2d/cocos/base/CCDirector.h:32:10: fatal error: 'thread' file not found
#include <thread>
         ^
1 error generated.

下記を読む限りlibc++ならthreadあるよとのこと。 stackoverflow.com

ldのエラーをとるにはlibstdc++が必要で、threadのエラーをとるにはlibc++が必要..?どうすればいいんだ...

とりあえずプロジェクト側とcocos側のbitcode生成はオフにした。 でもダメ。

困った

CentOSにnginxをソースからインストール

とりあえずyumではなく。

www.nginx.com

stableのソースを適当な場所にwgetする

wget http://nginx.org/download/nginx-1.8.0.tar.gz

解凍する

tar zvxf nginx-1.8.0.tar.gz

configureする

./configure --prefix=/usr/local/nginx

makeとmake install

make && make install

雑に起動

/usr/local/nginx/sbin/nginx start

起動時に下記エラーが出たらLDをexportする。

error while loading shared libraries

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

終わり

iTunes12.2で外付けHDDにライブラリがある場合ハングしてしまうかもしれない

Mac OS X 10.9.5 iTunesは勝手にupdateされて12.2(iTunes Music対応版) ライブラリはUSB接続のHDD上にある。

iTunesを起動すると1分くらいでハングしてしまう。 一度削除して再インストールして駄目だし再起動してもダメ。

コンソールのログを見ると

2015/07/04 23:00:13.143 iTunes[1394]: Possible unresolved transaction race -108/(iTunes/iTunes/iTunes Media/Blind Guardian/Nightfall in Middle-Earth,(null))

というようなのが延々ログに出ている。

このままじゃどうにもならないので12.1を入れたら取りあえず使えるにようにはなった。

Download iTunes 12.2 and All Previous Versions For Win & Mac

そのままだと、12.2でライブラリファイルが出来てしまっていたので前のに書き戻した。 Yahoo知恵袋便利。

ファイル[iTunes Library.itl)はあたらしいバージョンで作られているた... - Yahoo!知恵袋

とりあえずなんとか使えてるけど最新versionじゃないと色々不便がありそうなのでどうしたものか。

@Override アノテーションは取得できない?

classからメソッドを取り出して、そのメソッドに@overrideなアノテーションがついてるか調べたかった。

が、取得できない。消える? それとも親のメソッドが取得されてるからoverrideがついてないメソッドが取得されてるってことなんだろうか。

package com.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import javax.annotation.Resource;

public class ReflectionTest {

    public static void main(String[] args) throws Exception {
        ChildHoge childHoge = new ChildHoge();
        Method declaredMethod = childHoge.getClass().getMethod("init");
        for (Annotation s : declaredMethod.getAnnotations()) {
            System.out.println(s);
        }
        Method method = childHoge.getClass().getMethod("a");
        for (Annotation a : method.getAnnotations()) {
            System.out.println(a);
        }
    }
    
}

class SuperHoge {
    public void init() {

    }
}


class ChildHoge extends SuperHoge {
    @Override
    public void init() {
        super.init();
    }
    @Resource
    public void a() {
        
    }
}

実行結果

@javax.annotation.Resource(mappedName=, shareable=true, type=class java.lang.Object, authenticationType=CONTAINER, lookup=, description=, name=)

※追記 @overrideのソースを見て分かった。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Retention(RetentionPolicy.SOURCE) なのでコンパイル時には既に消えてる....

Rundeck2.5からJava8で動作するようになってた

高機能なジョブスケジューラのRundeck

heartbeats.jp

2.4.2まではJava7でしか動作しませんでした。Java7はEOLなのでつらいところ。

[vagrant@vagrant-centos65 rundeck2.4]$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
[vagrant@vagrant-centos65 rundeck2.4]$

[vagrant@vagrant-centos65 rundeck2.4]$ java -jar rundeck-launcher-2.4.2.jar
WARNING: HTTPS is not enabled, specify -Drundeck.ssl.config=/home/vagrant/work/rundeck2.4/server/config/ssl.properties to enable.
2015-05-03 10:29:57.836:INFO:oejs.Server:jetty-7.6.0.v20120127
2015-05-03 10:29:59.798:INFO:oejw.StandardDescriptorProcessor:NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2015-05-03 10:30:01.210:INFO:/:Initializing Spring root WebApplicationContext
2015-05-03 10:30:04,042 [main] ERROR context.ContextLoader  - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException: Cannot invoke method getAt() on null object
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:733)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:233)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1214)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:676)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:455)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:90)
    at org.eclipse.jetty.server.Server.doStart(Server.java:261)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at com.dtolabs.rundeck.RunServer.run(RunServer.java:112)
    at com.dtolabs.rundeck.RunServer.main(RunServer.java:72)
    at com.dtolabs.rundeck.ExpandRunServer.invokeMain(ExpandRunServer.java:690)
    at com.dtolabs.rundeck.ExpandRunServer.execute(ExpandRunServer.java:647)
    at com.dtolabs.rundeck.ExpandRunServer.run(ExpandRunServer.java:304)
    at com.dtolabs.rundeck.ExpandRunServer.main(ExpandRunServer.java:113)
Caused by: java.lang.NullPointerException: Cannot invoke method getAt() on null object
    ... 15 more
2015-05-03 10:30:04,055 [main] ERROR context.GrailsContextLoader  - Error initializing the application: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException: Cannot invoke method getAt() on null object
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pluginManager' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException: Cannot invoke method getAt() on null object
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:733)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:233)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1214)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:676)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:455)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:90)
    at org.eclipse.jetty.server.Server.doStart(Server.java:261)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at com.dtolabs.rundeck.RunServer.run(RunServer.java:112)
    at com.dtolabs.rundeck.RunServer.main(RunServer.java:72)
    at com.dtolabs.rundeck.ExpandRunServer.invokeMain(ExpandRunServer.java:690)
    at com.dtolabs.rundeck.ExpandRunServer.execute(ExpandRunServer.java:647)
    at com.dtolabs.rundeck.ExpandRunServer.run(ExpandRunServer.java:304)
    at com.dtolabs.rundeck.ExpandRunServer.main(ExpandRunServer.java:113)
Caused by: java.lang.NullPointerException: Cannot invoke method getAt() on null object


ですが、4/16日に出たRundeck2.5ではJava8に対応しているので問題なく起動できるようになってます。 もちろんtomcatへのdeploy時でも問題なし。

rundeck.org


[vagrant@vagrant-centos65 rundeck2.5]$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)


[vagrant@vagrant-centos65 rundeck2.5]$ java -jar rundeck-launcher-2.5.0.jar
WARNING: HTTPS is not enabled, specify -Drundeck.ssl.config=/home/vagrant/work/rundeck2.5/server/config/ssl.properties to enable.
2015-05-03 10:37:16.034:INFO:oejs.Server:jetty-7.6.0.v20120127
2015-05-03 10:37:18.214:INFO:oejw.StandardDescriptorProcessor:NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2015-05-03 10:37:19.544:INFO:/:Initializing Spring root WebApplicationContext
2015-05-03 10:37:54,115 INFO  BootStrap - Starting Rundeck 2.5.0-1...
2015-05-03 10:37:54,115 INFO  BootStrap - using rdeck.base config property: /home/vagrant/work/rundeck2.5
2015-05-03 10:37:54,124 INFO  BootStrap - Performing rundeck first-run initialization...
2015-05-03 10:37:54,746 INFO  BootStrap - Rundeck initialization complete.
2015-05-03 10:37:54,775 INFO  BootStrap - loaded configuration: /home/vagrant/work/rundeck2.5/etc/framework.properties
2015-05-03 10:37:54,856 ERROR BootStrap - NOT importing existing filesystem projects filesystem
2015-05-03 10:37:54,868 INFO  BootStrap - RSS feeds disabled
2015-05-03 10:37:56.349:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/home/vagrant/work/rundeck2.5/server/exp/webapp/},/home/vagrant/work/rundeck2.5/server/exp/webapp
2015-05-03 10:37:56.444:INFO:/:Initializing Spring FrameworkServlet 'grails'
2015-05-03 10:37:56.522:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:4440

これで安心してJava8環境に移行出来ます。

他にも2.5では rd-acl というコマンドラインツールが追加されていて、Rundeck ACL policy ファイルを生成することが出来るようです。(アクセスコントロール周り)

SafariやFirefoxではハイフン区切りでDateオブジェクトを作れない

まぁそのままの通りなんだけど。

自分はPostgreSQLをメインで業務で触っていて、時刻データはtimestamp型のカラムに保存している。 で、PostgreSQLのタイムスタンプはハイフン区切りで入っている。

=> select * from temptable ;
     start_date
---------------------
 2015-01-01 00:00:00
(1 row)

これをサーバーサイドのアプリケーションから読み出してvelocityとかのtemplateエンジンに食わせて、html側のJSでDateオブジェクトを生成するということを割とやる。

開発時のチェックはChromeでやるのがメインだったから気付かなかったが、あるときiPhoneSafariでその時刻を表示している箇所がNaN:NaNみたいな感じに。 最初は原因がわからずしかも再現するひとしない人がいて辛かった。

が、Safariなどではハイフン区切りの時刻をDateに食わすと invalid Dateとして認識されてしまうことがわかった。

以下再現。おそらくiPhoneなどでのSafariも同様のログが見られるとは思う。

Chrome: ハイフン区切りでスラッシュ区切りで問題なく、ミリ秒が付加されているようなデータも問題なくDateオブジェクトを生成できている。

f:id:gitpub:20150502230127p:plain

Safari: ハイフン区切りはInvalid Dateに、スラッシュ区切りのみ受け入れる。ミリ秒もダメ。

f:id:gitpub:20150502230258p:plain

FirefoxSafariと同様にハイフン区切りとミリ秒はInvalid Dateとして扱われる。

f:id:gitpub:20150502230439p:plain

Chromeが平気なだけに気づきづらい問題なので気をつけたい。