2014年10月29日水曜日

IFTTTを使ってスマホの写真をflickr、DropBoxへ振り分ける

IFTTTについてです。
結構前に興味があって使ってみたのですが記事にしていませんでした。


IFTTT とは、あるルールに基づいて、自動的に処理を行ってくれるアプリです。

元々はiPhone用のアプリだったと思いますが、時を経てAndroidアプリでも
使えるようになり、その際に、IFTTTとflickrを連携して、撮影した写真を
flickrへ自動的に転送するようにしています。

IFTTTの概要

もし、 ~~ ならば、 ~~ を行う。
IF this THEN that

この、もし。と、ならば。 の組み合わせにより、自動化を行います。

使い方

組み合わせを登録しておくだけです。
組合せられる条件はIFTTTがあらかじめ用意してくれているので、基本的には選ぶだけです。


IFTTT使いの方は結構いらっしゃるようですが、私の場合には

・スクリーンショットを撮ったら、DropBoxへ
・写真を撮ったら、flickrへ

という使い方をしています。

この場合、スクリーンショットを撮るとflickrにも行ってしまうので、
スクリーンショットが格納されるフォルダに、
[ .nomedia ]  ファイルを作ることで振り分けが出来ています。


組合せの事を「Recipes=レシピ」を呼ぶそうですが、公開済みのレシピを
眺めて、取り込む機能もあるので、見てみるのも面白いかと思います。

レシピ以外では、設定で「UseCellular Data」のチェックをOffにすると、
Wifi接続の場合のみ、動くようになります。



追伸:日本語には対応していません。(2014/10現在


2014年10月21日火曜日

1行Tips(コマンドプロンプトで疑似sleep)

3秒待つ

ping localhost -n 3 >NUL:

コマンドプロンプトで日付と時間を取得、利用する

実行環境によって取得結果は異なるようですが、
コマンドプロンプトにて日付、時間を取得する事が出来ます。

日付:%date%
時刻:%time%

実行例

C:\Users>echo %DATE%
2014/10/21

C:\Users>echo %TIME%
 9:39:18.30

加工例

今回は、タイムスタンプをファイル名に使いたかったので、
以下の構文と組み合わせてスラッシュを除外することにしました。

C:\Users>echo %date:~-10,4%%date:~-5,2%%date:~-2,2%
20141021

更に詳しい内容が@ITさんにて記事になっています。
http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html


コマンドプロンプトは活用方法を知っていると日々の業務が楽になりますね。

2014年10月14日火曜日

MyBatisで実行したInsertの戻り値が「-2147482646」を返す

掲題の問題発生から解消までの一部始終です。

今まで動いていたプログラムがある日突然、正常系処理が通らないようになり、
原因を調べてみたところ、MyBatisの処理を呼び出した後の返却値が
「-2147482646」となっていることがわかりました。

その原因および原因究明までの経緯をメモしておきます。

発生原因

applicationContext.xmlに変更を加えていたため。

【元】

  <beans
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

【変更後】

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:spring-dwr="http://www.directwebremoting.org/schema/spring-dwr"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <context:annotation-config />
 <context:component-scan base-package="~~~~~~" />
アノテーションによるComponentScanを利用しようとして、いくつかのスキーマ定義を
読み込ませたことが悪かったようです。

根源

調べてみてもわからず。

追加xmlスキーマを読んで挙動が変わったか、annotation-configの宣言で
ライブラリの読み込まれる順番、初期値などが変化したのかわかりませんが、
これ以上追う事はやめました。


発生経緯から、その他調べたこと

今回の件とは違うのですが、エラーコードで調べていくと幾つかの解決案が
ネット上に出ていたので、備忘録的にメモしておきます。

やったこと

機能追加でソースを修正し、その後発生。
現象が発生している箇所は全く修正していない。


エラーコードで調べてみると、英文サイトで以下が見つかりました。

http://www.just4e.com/mybatis-3.0.4/docs/reference/org/apache/ibatis/executor/BatchExecutor.html

public static final int BATCH_UPDATE_RETURN_VALUE
Constant Value: -2147482646 (0x800003ea)


要は、バッチ更新モードの戻り値が、「-2147482646」だという事。



バッチ更新モードに変えたつもりもないし、そのようなソース変更履歴もない。

しかも、他の人のパソコンで実行した結果を確認してもらうと「1」 = 登録結果行数
こっちが正しいはずなので、私の実行環境がおかしい。
※当然、同じプログラムを実行してます。



調べてみると、以下のような会話が。
https://groups.google.com/forum/#!searchin/mybatis-user/2147482646%7Csort:relevance/mybatis-user/ddRPVRzwvlc/n5I_1YgKqSsJ

SqlSession session = sqlMapper.openSession(ExecutorType.SIMPLE);


BatchModeで開くのではなく、Simpleモードで開く。ということなので、
ソースを探してみたところ、数か所でopenSession(); を発見。
初期値がどうなっているかは調べもしないでとりあえず (ExecutorType.SIMPLE) を指定して再ビルド:実行



結果、変わらず。

その後、mybatisのドキュメントより初期値を発見。初期値はSIMPLEでした。
http://mybatis.github.io/mybatis-3/ja/configuration.html

既定値の変更(defaultExecutorType)ができるようなので、設定名でソースを検索したが結果、該当なし。


別観点としてデータベースとのコネクション周りを疑い、他のデータベースへ接続しても現象同じ。


というところで調査をやめて、コミット単位のモジュールで調査して行ったところ
上記の原因へ至ったという次第でした。


まとめ

今回の発生起因は「annotationを使いたい」ために色々といじったことが原因でした。
実装の根幹を変えるような変更を行う際は十分注意しましょう。

2014年10月8日水曜日

タブレットでもdraganddropを実現可能とするライブラリ jQuery UI Touch Punch

百聞は一見に如かず。ということで、以下サイトのデモサイトをご覧ください。

http://touchpunch.furf.com/

タブレット (xperia tablet z)でも、問題なく操作できました。

jqueryuiでは、タブレット対応していないので(2014年10月現在)、
タブレットでドラッグアンドドロップを対応するための選択肢の一つかと思います。


タブレット、スマートフォン対応のライブラリ系は他にもあるとは思いますので
随時更新していきたいと思います。

2014年10月7日火曜日

同時接続・同時操作が簡単なターミナルソフト「rlogin」

以前の記事でTeraTermのブロードキャスト(同時操作)について書いてますが、
私の環境での同時接続数が50を超え、画面いっぱいに表示しても
表示しきれなくなってきたので、別のソフトを探していたところ、
複数同時接続が前提のターミナルソフトがありました。

その名は「rlogin」です。

http://nanno.dip.jp/softlib/man/rlogin/

TeraTermからの乗換を考慮しつつ使ってみたところのまとめです。


【主だった特徴】

・タブ形式の切替で、複数の接続先を1画面で確認できます。


 Tab系の画面でよくある「ALT + TAB」キーにより、タブを切り替えられますので
 ブロードキャストの結果を順次確認するときなど相当便利です。



・接続先も、タブ(グループ化)管理により、別々でOK


 TeraTermでは、入力 Or プルダウンからの選択だったので、
 一覧で表示、選択できるは大きなメリットです。


・ブロードキャスト(同報:同時操作)もOK
 これは当然できるものとして選定しているので、問題なくOK。
 TeraTermとの違いをあげるとするならば、
 TeraTermではブロードキャスト先を選択し、ブロードキャスト用画面で
 入力した結果を各画面へ一斉配信しますが、rloginでは
 親となるウインドウ(接続先)を指定すると、現在接続されている
 すべてのウインドウへ同報されます。
 コンソールを操作しつつ、結果、別の接続先にも反映されている感じになるので
 直観性は上がっているような気がします。
 ブロードキャストしつつ、コマンドを入力後、ALT+TABで実行結果を確認。なんてのが
 最近の操作ルーチンになってます。


・設定系は一通りありそう
 パッと見、主だった設定はありそうです。今のところ、
 設定項目がなくて苦労したケースはありません。
 設定はテキストファイルとしてまとめてエクスポートできるので、
 設定名さえ把握できれば、テキスト上で一括置換も容易です。
 ※端末Aで保存した設定を端末Bで読み込ませると、パスワードの
 再入力を求められたので、機密性的にもしっかりしています。
  ⇒その場合、端末Bでパスワード保存して暗号化されたテキスト文字を置換で、万事解決


TeraTermはシンプルで使いやすいので手放すつもりもないのですが
同報が必要な操作はrloginを使っていこうと思ってます。


2014年9月17日水曜日

Mybatisを使う中でのTips (軽め

使っているライブラリのバージョンは、3.0.4です。
マニュアルをきちんと読めばわかる内容なので、自分用メモです。

IF文について


else はありません。
比較演算子は、 != か、 == です
ELSEを使いたければ、chooseを。

例) Order Byを可変にする例

OEDER BY
<if test="sortId != null and sortId!=''">
  ${sortId} ${sortType}
</if>
<if test="sortId == null or sortId == ''">
  COLA ASC
  ,COLB DESC
</if>

別途定義しているSQLを利用する方法


定義:

<sql id = "commonQuery">
SELECT 1
</sql>

呼び出し

<include refid="commonQuery"/>


2014年9月16日火曜日

MySQLでサブクエリでUPDATE

以外と便利です。ただ、方言なので、ANSI的なSQLとは違います。


UPDATE `tableA` r,
    (SELECT id,c.hoge
    FROM `tableA` r
       JOIN tableB e ON r.aa = e.aa
       JOIN tableC c ON c.bb = e.bb) x
SET
r.hoge = x.hoge
WHERE
r.id = x.id;

2014年9月12日金曜日

サーバーOSのシャットダウン時にtomcatが正常にシャットダウンしない件

仮想環境で新たにアプリが動作するサーバー環境を作成したところ、
OSのシャットダウン時にTomcatが正しく終了せず、OSが終了できなくなってしまいました。

色々と調べたところ、解消したので経緯を残しておきます。


事象

サーバOS上で、shutdown -h nowを行うと、tomcatの終了スクリプトで待ち状態。そのうち
UnknownHostExceptionを出して、うんともすんともいかなくなる。


java.net.UnknownHostException: hostname: hostname
    at java.net.InetAddress.getLocalHost(InetAddress.java:1360)
    at org.apache.jk.common.ChannelSocket.unLockSocket(ChannelSocket.java:490)
    at org.apache.jk.common.ChannelSocket.pause(ChannelSocket.java:288)
    at org.apache.jk.server.JkMain.pause(JkMain.java:726)
    at org.apache.jk.server.JkCoyoteHandler.pause(JkCoyoteHandler.java:153)
    at org.apache.catalina.connector.Connector.pause(Connector.java:1037)
    at org.apache.catalina.core.StandardService.stop(StandardService.java:578)
    at org.apache.catalina.core.StandardServer.stop(StandardServer.java:788)
    at org.apache.catalina.startup.Catalina.stop(Catalina.java:662)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:629)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)


結果

ホスト名が原因ではなく、tomcatのサービスが正しくインストールされていなかったため。

過程

・ホスト名の解決
 /etc/hostsに、hostnameを書いていなかったので、書きました。

しかし、ダメ。

・シャットダウンの詳細確認

きちんと動いているサーバーもあるので、シャットダウンの時の内容を比較。
すると、tomcatの終了順が違う事がわかりました。

終了順をさらに調べていくと、以下な感じ
cd /etc/rc.d

【OKケース】

[root@host rc.d]# ls -l -R | grep tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 K15tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 K15tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 K15tomcat -> ../init.d/tomcat
【NGケース】

[root@host rc.d]# ls -l -R | grep tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
lrwxrwxrwx  1 16  9月 12 19:52 2014 S80tomcat -> ../init.d/tomcat
終了スクリプトがない・・・


というわけで、


chkconfig --del tomcat
chkconfig --add tomcat
chkconfig tomcat on


を実施し、きちんと生成されて、正しくシャットダウンできる事が確認できました。

インストールに失敗したのかもしれません・・・


2014年9月9日火曜日

CentOS6.5 + mod_mono で起動時にエラー「Failed to connect to mod-mono-server after several attempts to spawn the process.」

いつもの通りCentOS環境でmod_monoをソースからインストールして起動したところ
「Failed to connect to mod-mono-server after several attempts to spawn the process.」
のエラーが出てしまい、対処をしたので手順をメモしておきます。

概略

  1. ソースからmod_monoをインストール
  2. /testエイリアスを作成し、mod_monoのサンプルサイトへアクセス
  3. 503エラーとなったので、/var/log/httpd/error_log を参照したところ、上記のエラー

原因

SELINUXが標準でインストールされ、稼働していたためでした。

SELINUUXの動作状況確認


#getenforce

enforcing : 有効 , disabled : 無効




SELINUXの無効化設定


/etc/selinux/config
SELINUX=disabled


サーバー再起動で、完了です。