2014年12月22日月曜日

Linuxでディスク容量の確認・ディレクトリサイズの確認

いつもやっていることながら、忘れてしまうので備忘録です。

ディスク容量の確認

dfコマンドを使います。


[root@localhost ~]# df
Filesystem   1K-blocks   Used Available Use% Mounted on
/dev/vda3    410530084 96247604 293428672  25% /
tmpfs       1961240     4  1961236  1% /dev/shm
/dev/vda1     247919  130526   104593  56% /boot

ディレクトリサイズの確認

duコマンドを使います。

[root@localhost/]# du --max-depth=1 -h ./
4.0K   /logs
4.0K   /media
8.0K   /selinux
3.4G   /var

4.5G   /usr
4.0K   /mnt
176K   /dev
30M   /etc
0    /sys
21M   /root
581M   /lib
7.6M   /bin
24M   /lib64
8.0K   /.pki
4.0K   /srv
14M   /sbin
443M   /opt
6.8M   /tmp
83G   /home
あとはサイズが大きいところへ移動して再度検索していくと、順次追っていけると思います。

2014年12月15日月曜日

MySQLで、データ保存時の暗号化と復号化


百聞は一見に如かず。MySQLの標準関数で実装できるなんて便利です。

注:本記事は、データベースの暗号化ではなく、カラム(項目)単位です。

サンプル用のテーブル作成


DROP TABLE IF EXISTS `encrytest`;
CREATE TABLE `encrytest` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `Value1` varchar(200) DEFAULT NULL,
 `Value2` varchar(200) DEFAULT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;

サンプルデータの登録


INSERT INTO ENCRYTEST (VALUE1,VALUE2) VALUES (HEX(AES_ENCRYPT('AIUEO','CRYPTKEY')),'KAKIKUKEKO');

データ読み出し (そのまま読みだしてみる。


SELECT ID , VALUE1,VALUE2 FROM ENCRYTEST;
+----+----------------------------------+------------+
| ID | VALUE1              | VALUE2   |
+----+----------------------------------+------------+
|  1 | E50F8C75A2C25FC6C8CDF8AA10C78B41 | KAKIKUKEKO |
+----+----------------------------------+------------+
1 row in set

データ読み出し(復号化して読みだす


SELECT ID , AES_DECRYPT(UNHEX(VALUE1),'CRYPTKEY') AS VALUE1,VALUE2 FROM ENCRYTEST;

+----+--------+------------+
| ID | VALUE1 | VALUE2   |
+----+--------+------------+
|  1 | AIUEO  | KAKIKUKEKO |
+----+--------+------------+
1 row in set

その他メモ


 HEXで保存するので、保存に必要なバイト数は、増えます。
 ※計算してませんが、4倍程度?
 他のBlogなどを参照すると、blogを使うとか、bigbinaryを使うとか、
 色々とアドバイスが出ています。
 今回は、HEX,UNHEXを使っていますが、blobとかだとそれは必要なさそう。






2014年12月4日木曜日

4枚ディスプレイにしてみました。

仕事場では2枚ディスプレイは標準なのですが、
管理者のご厚意により3枚目のディスプレイを接続できるツールを頂いたので
試しに、以前から使っていたタブレットの外付けディスプレイアプリも利用して
4枚ディスプレイを作ってみました。

結果



こんな感じです。

使ったもの

○VGA出力がついている、ノートパソコン
○j5 create USB 3.0 VGA DISPLAY ADAPTER JUA310 d-sub15ピン (市販で7,000円くらい)
○iDisplayアプリケーションおよび、Tablet (SONY Xperia Tablet Z)

やり方

○iDisplayアプリケーションのインストールおよび、設定
 Windowsアプリと、Androidアプリの両方が必要です。
 Androidアプリは、450円でした。
 今回の件とは関係なく、以前購入していたのでそれを利用。

 iDisplayアプリは、外出先で「ミラー」にしてお客様と同じ画面を見たり
 タブレットを操作するとWindows画面側にも反映できたりするので
 それだけでも購入の価値はあるかなと個人的には思ってます。


○j5Create USB3.0のドライバインストール、設定
 ネットから最新を落としてきて、インストールします。

○それぞれ、別々で接続して試験
 順番を間違うと、Windowsが変な認識をしたので、
 まとめて設定ではなく、一つ一つデバイスを追加するようなイメージで
 行うと良いかもしれません。



その他

 iDisplayのWindowsアプリケーションをWindows8.1で利用しようとすると、
 「拡張デスクトップモード」を利用できる選択肢が出てこなかったため、
 iDisplayのFaceBookでリンクが張られているベータ版をインストールしています。
 

 記事執筆時点、更改されているアプリのバージョンは、2.4.2 , ベータは、2.5.0.7でした

やってみた結果

 ま、4枚は要らないかなと思いました。
 4枚目(タブレット)は、仕事場では休みの時にPV再生したりするのですが、
 その程度であれば、通常のタブレットで起動しておいて、Bluetoothで音声再生で十分。
 別製品で、 Android画面をWindowsで操作できるツールも持っているので、
 Android画面の操作にも不便がありません。
 (http://j5create.com/jpn/our-products/android/juc600.html)

 一応、iDisplayに関しては利用価値大ありと思ってますので、興味がある方はお試しください。



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


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


2014年8月18日月曜日

Kendo UI で、Cultureを変更する

モックアップを作りたいだけなので、簡単にメモ。

<script src="../../../kendoui/js/cultures/kendo.culture.ja.min.js"></script>

<script>
kendo.culture("ja");
</script>

ある程度使えるかどうかの評価をすることになったらちゃんと記事にしていきます。

2014年8月14日木曜日

ビルドされているモジュールのプラットフォームを確認する方法(corFlags.exe)

CorFlags.exe というFrameworkに付属しているツールを利用すると
モジュールがビルドされたプラットフォームを確認する事が出来ます。

私の場合、64bit環境で動作有、原因を調べるのに使いました。

http://msdn.microsoft.com/ja-jp/library/ms164699(v=vs.110).aspx


【使用例】
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>CorFlags.exe aspnet_merge.exe
Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  3.5.30729.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 11
ILONLY    : 1
32BIT     : 1
Signed    : 1

正しい使い方はあれこれありそうですが、私の場合には32bitでビルドされたことが
わかって、それでOKだったので、話題としては終わりでした。


プログラム入れ替えにより ASP.net WebサービスでPermissionsエラーが発生

IIS ASP.net環境で動作しているプログラムの入替を行ったところ
Permissionエラーが発生するようになってしまいました。
その対処の一部始終をメモしておきます。

【概況】

・IIS + ASP.netで稼働しているWebサーバ。 (Webサービスを稼働中) Win2008R2 , IIS7.0

・Webサービスの1つに不具合があり、プログラムの入替を行う。

【環境】

・WebService Directory
 |-web.config
 |- bin
  |- Program.dll ←今回これだけを入替
  |- *.dll

【やったこと】

・Program.dllをコピーして別の場所へバックアップ
・持参した、Program.dllを、上書きコピー


結果、これでアウトでした。
起きたエラーがコレ。

型 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' のアクセス許可の要求に失敗しました。
場所System.Security.CodeAccessSecurityEngine.Check(Objectdemand,StackCrawlMark&stackMark,BooleanisPermSet)
  場所System.Security.CodeAccessPermission.Demand()
  場所System.Reflection.Assembly.VerifyCodeBaseDiscovery(StringcodeBase)
  場所System.Reflection.Assembly.get_CodeBase()


【原因】

・Internetゾーンから取得したファイルを、そのままIIS稼働環境へコピーしたため。

【対処】

・ファイルのプロパティにてブロックを解除する。
 で、ダメだったので、あれこれやっているうちに、できるようになりました。

結果としては、アプリケーションプールにキャッシュされていたようです。

・アプリケーションプールの、停止、再起動を行う。
 使っていたアプリケーションプールは共有だったので、個別に新規で一つ作り
 新規で作ったアプリケーションプールを割り当ててみました。
 その結果、改善されました。
 それで、通常使っているアプリケーションプールを一旦再起動して、
 アプリケーションプールの設定を元に戻すと、正常稼働。

 アプリケーションプールの再起動時に、動作中プロセスの影響からなのか
 「アプリケーションプールを起動できません」的なエラーが出て焦りましたが、
 少し待ってから起動したら動いたので、結果問題なしといったところです。

【他に調べたこと】

・IISにキャッシュされていないか
 ⇒Windows\Microsoft.net\Framework**\Version\Temporary ASP.NET Files に
  IISが自分のロードしたモジュールをキャッシュします。
⇒結果、問題なし。
  念のため、
  ・アプリケーションとしての設定を解除
  ・該当キャッシュをクリア
  ・再度アプリケーションへ変換
  とやり、キャッシュの再構成を行いましたが、改善せず

【やりたかったけど試してない事】

・IISの再起動
 他にもアプリが動いていて、止めるにはいろいろと手間があったので、今回は除外

【まとめ】

普段はUSB媒体でプログラムの持ち込みをするのですが、今回はWeb経由で
プログラムを持ち込んだため、はまりました。

インターネットから取得したデータの扱いには十分注意しましょう。

2014年8月10日日曜日

ネットワーク(LAN)はループさせてはいけません(ブロードキャストストーム)

先日、お客様先へシステム納品時に、LAN障害が発生。
結局はループだったであろう。という事なのですが、
改めてその爆発力を目の当たりにしたのでまとめておきます。

現象

・ネットワークがつながったり、切れたりする。
・PINGを継続して実行していると、何回かに1回くらい、Request Timeoutが出る。

インフラ屋さんがあれこれ調べてやっていたのですが、ひょんなところで気がついた
ハブに、ネットワークループがありました。
その片方を取り外したところ、解決。

結論


ネットワークはループさせたらだめ。
※但し、STP(スパニングツリープロトコル)を持っているハブを利用しているだとか
 VLANとか、意図的にループ経路を作っている場合には別


そもそもネットワークのループって?

ループってどういうことか?っていうと、
・1本のLANケーブルを、同じハブに挿したらダメ。ということです。
・ハブ間は、1本のLANケーブルでつなぐことが基本で、二重化のようにつないだらダメという事です。
・ぐるっと回って1周。というようなLAN配線はダメということです。


詳しくはASCIIさんあたりを参照。
http://ascii.jp/elem/000/000/451/451629/
http://ascii.jp/elem/000/000/561/561903/


何も知らないユーザーさんだと、気にもならないのでしょうけども、
以外に単純な落とし穴で、ネットワークが使えなくなってしまう。


余談

そのお客さんは半日間、全システムがほぼダウンで、業務になってませんでした。

2014年7月31日木曜日

EclipseでJSLintを使う

Javascriptの構文チェックを行う方法はいくつかあると思いますが、
今回、既存システムに対して改めて構文チェックを行おうと思い、
Eclipseのプラグインも提供されているJSLintを使う事にしました。

【事前準備】

Eclipseマーケットプレースより、JSLintのプラグインをインストール
※インストール後にEclipseの再起動が必要です。

Eclipseマーケットプレースの使いかたについては別記事で紹介していますので併せて参照ください。

【チェック方法】

1.メニューバーより「プロジェクト」→「プロパティ」を選択
2.「JSHint」を選択し、「Enable JSHint for~~」の欄で「追加」ボタンを押す
3.対象とするファイル、およびフォルダの指定ができるので、必要なファイル、フォルダを指定

プロジェクトをビルドすると、問題ビューに警告が表示されるようになります。

【警告を除外する方法】

JSHintが出すいくつかの警告は、構文の問題というよりもお作法(規約)に近いものがあり、
開発スタイルによっては無意味です。

設定で、出力する警告を制御する事が出来ます。


やり方は2つ。プロジェクト単位の設定か、Eclipse全体の設定か。を選べます。

1.プロジェクト単位
 「プロジェクト」→「プロパティ」→「JSHint」→「Configuration」→
 「Enable Project~」のチェックOnで設定を記載

2.全体
 「ウインドウ」→「設定」→「JSHint」→「構成」で設定を記載


いずれも、以下のような構文で記載します。
設定可能なオプションは公式ドキュメントを参照ください。
(日本語訳してくれている方もいるので併せて参考で)

○json形式


{
"laxcomma":true,
"laxbreak":true,
"smarttabs":true,
"evil":true
}

パラメータで抑止できないエラーについては、以下の対処法で対応可能です。

1) jshint.jsより、該当のメッセージを探す。
2) メッセージコードをメモ
3) パラメータに、以下形式で記載

{
"asi":true,
"evil":true,
"laxcomma":true,
"laxbreak":true,
"smarttabs":true,
"sub":true,
"-W009":false, //The array literal notation [] is preferable.
"-W099":false, //Mixed spaces and tabs
"-W041":false  //Use '{a}' to compare with '{b}'
}


2014年7月30日水曜日

Eclipseでプラグインを簡単にインストールできるEclipseマーケットプレース

Eclipseでプラグインをインストールしたいと思い、過去の記憶から色々と記事等を探していたところ、
GUIより簡単に指定、インストールできる仕組みがありました。


VisualStudioにもNuGetパッケージ管理という方法がありますが、それと同様のようです。


【手順】

1.「ヘルプ」より、「Eclipseマーケットプレース」を選択。
 ※ここで出てこない場合には、Exclipseのバージョン、利用しているパッケージの違いのようです。
 ※Eclipseマーケットプレース自体もプラグインのようなので、追加インストールは可能と思われます。

2.画面が出てきます。検索キーワードを入れると、対象のプラグインが表示されます。
 選択して、「次へ」

3.ライセンス条項等が出るので確認して「次へ」

4.いくつかメッセージが出るかもしれませんが、適時対処

これだけでインストールできます。


従来型「ヘルプ」→「新規ソフトウェアのインストール」でも同じことはできるはずです。
今回、この方法にたどり着けず、たどり着いても欲しいプラグインが出てこず、という状況で
方法を探していたところマーケットプレースへたどり着いた。という状況でした。

今はもう更新されていないのかもしれません・・・(未確認です

2014年7月29日火曜日

Eclipse開発環境で表示するリソースを絞る方法

膨大なソース、モジュールの中から、必要な分だけを絞って表示する方法です。


・プロジェクトエクスプローラの右上にある▼をクリックして、「ワーキングセットの選択」を選択
・「新規」を押して、表示したいリソースを選択
・名前を付けて保存

次回より、▼の中に登録したワーキングセットが表示されるようになります。

2014年7月7日月曜日

MySQLのGROUP_CONCAT という関数がものすごく便利な件

簡単に言ってしまうと、複数行のデータを、ぐちゃっと1行に纏めてくれる関数です。

SQL


select group_concat(column_name) from information_schema.columns
where table_schema = 'information_schema' and table_name = 'COLLATIONS'

結果


COLLATION_NAME,CHARACTER_SET_NAME,ID,IS_DEFAULT,IS_COMPILED,SORTLEN


ちなみに、group_concatを使わずに取れるデータがこれ。

-------------------------------
COLLATION_NAME
CHARACTER_SET_NAME
ID
IS_DEFAULT
IS_COMPILED
SORTLEN
-------------------------------
複数行のデータが、1行にまとまっていることがわかります。


親子の関連を持つデータで、このデータを横並び表示したい時とかにも活用できそうです。

注意点

●戻せるデータのサイズが決まってます。(設定で変更可能)
[my.ini]の[mysqld]セクションに以下を記載すると反映されます。(要再起動
set group_concat_max_len = 2048000;
※2MBにしています

●NULLを含むデータの場合、NULLが除外されます。

応用

・区切り文字をタブへ変えて、並び順を指定しています
・NULLは、ブランクへ置き換える事により、除外されることを防止しています



select group_concat(CASE WHEN column_name IS NULL THEN '' ELSE column_name END order by ordinal_position separator '\t') from information_schema.columns
where table_schema = 'information_schema' and table_name = 'COLLATIONS'

補足

Oracleでも、11gより同等の関数があるようです。

2014年7月4日金曜日

MySQLでスキーマ情報を取得する

汎用な処理が必要になったので、あるだろうと思い調べてみたらありました。
MySQL 5.5で確認しています。

テーブル名を取得する

SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'データベーススキーマ名' ORDER BY TABLE_NAME;

Viewも取れてしまうので、あとは工夫で絞ると良いと思います。

カラム情報を取得する

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'データベーススキーマ名' AND TABLE_NAME = 'テーブル名'
ORDER BY ORDINAL_POSITION;

汎用的にする

Function化して返すようにしています。
この処理は、CSVのヘッダ情報をカンマ区切り、ダブルクォーテーション付きで返すものです

---------------------------------------------------

CREATE FUNCTION GetColumnCommentsOfCSV(schemaName VARCHAR(255) , tableName VARCHAR(255)) RETURNS VARCHAR(2000)
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE vColName VARCHAR(255);
  DECLARE vColComment VARCHAR(255);
  DECLARE vOutChar VARCHAR(2000);
  DECLARE curRec CURSOR FOR
    SELECT
        COLUMN_NAME
        ,COLUMN_COMMENT
    FROM
        INFORMATION_SCHEMA.COLUMNS
    WHERE 
        UPPER(TABLE_SCHEMA)   = UPPER(schemaName)   collate utf8_general_ci
      AND UPPER(TABLE_NAME)    = UPPER(tableName)    collate utf8_general_ci
    ORDER BY
        TABLE_NAME,ORDINAL_POSITION
    ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  SET vOutChar = '';
  OPEN curRec;
  REPEAT
    FETCH curRec INTO vColName , vColComment;
    IF NOT done THEN
      IF LENGTH(vOutchar) > 0 THEN
        SET vOutchar = CONCAT(vOutChar,',');
      END IF;
      SET vOutchar = CONCAT(vOutChar,'"');
      SET vOutChar = CONCAT(vOutChar,vColComment);
      SET vOutchar = CONCAT(vOutChar,'"');
    END IF;
  UNTIL done END REPEAT;
  CLOSE curRec;
  RETURN vOutChar;
END;
//
DELIMITER ;

Oracleとか、SQLserverでもやってた記憶があるので、今度載せます。

2014年7月3日木曜日

Windows8.1 にて過負荷とのたたかい (続き) まだ未解決

先日の記事で、Windows8.1のディスクアクセスが100%に張り付いてしまうという件を書いたのですが、いったん収まったと思ったらまだ引き続き起きているようなので、
抜本的なOS不具合解消のため、いくつか情報をあつめ、対処をしてみました。


○windowsタスクのホストプロセス が、ディスクアクセスを占有する

 
しばらく様子を見ていたところ、いきなり登場してハードディスクを占有しました。
これで調べてみると、Windows8.1のバックアップが悪さをしているかもとの事。

タスクを調べてみました。

コントロールパネル -> タスクのスケジュール -> Microsoft -> Windows -> WindowsBackup

見てみると、「ファイルがありません」のエラー

ま、動いていないんでしょう。タスクを「無効」にしてみました。


○イベントログでエラーが連続的に起きている。


【エラー内容】
Diagnostic Service Host サービスを、次のエラーが原因で開始できませんでした:
サービスが適切に機能するために必要な特権が、サービス アカウント構成に存在しません。 サービス Microsoft 管理コンソール (MMC) スナップイン (services.msc) とローカル セキュリティ設定 MMC スナップイン (secpol.msc) を使って、サービス構成とアカウント構成を表示することができます。

2014/6/6から発生していました。WindowsUpdateの直後かも。


同様のお悩みの方がいました。MSにも情報あり
http://social.technet.microsoft.com/Forums/windows/ja-JP/fc74eaec-99bc-44ae-97f4-ece5d3cc76a5/diagonostic-service-host-id-7000?forum=w7itprogeneralja

[コントロールパネル] -> [グループポリシーの編集] -> [コンピューターの構成] -> [Windows の設定] -> [セキュリティの設定] -> [ローカル ポリシー] ->
[ユーザー権利の割り当て] -> [システム パフォーマンスのプロファイル]

修正しようとしたら、「ユーザーまたはグループの追加」ボタンが押せませんでした。
ドメイン参加PCなので制御されているのかも。と思い、LocalのAdministratorで
ログインしても、ボタンが押せませんでした。


なのでいったん断念

まだ続きがありそうです。


----------------------------------------------------------
2014/08/23追記

しばらく放置していましたが、またディスク占有が発生したので
思いきって、Diagnostic System Hostを無効へ設定しました。

そうすると、
「Diagnostic Service Host サービスを、次のエラーが原因で開始できませんでした」
のエラーは出なくなりました。

ただ、ディスクアクセスは相変わらずです。
⇒数分後、おとなしくなりました。

これでしばらく様子を見てみようと思います。

MySQLで、カーソルを使って変数バインドでデータを返す

mysqlでカーソルを使ってあれこれやろうとした時に作ったサンプルを置いておきます。

mysqlの公式ドキュメントに載っているやり方のようです。

カーソルで、値をバインドしたい時には、ユーザー変数を利用するとできます。

プロシージャサンプル


----------------------------------------------------------------
drop procedure if exists sample_cursor;
DELIMITER ;;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sample_cursor` (IN schemaNm VARCHAR(100) , IN tableNm VARCHAR(100) , IN pos VARCHAR(10))
  READS SQL DATA
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE val VARCHAR(100);
  DECLARE cur CURSOR FOR
  SELECT
      column_name
  FROM
      information_schema.columns
  where
      TABLE_SCHEMA   = @table_schema collate utf8_unicode_ci
    and TABLE_NAME    = @table_name collate utf8_unicode_ci
    and ORDINAL_POSITION = @ordinal_position collate utf8_unicode_ci
  ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  select schemaNm , tableNm , pos into @table_schema ,@table_name , @ordinal_position;
  open cur;
  REPEAT
    FETCH cur into val;
    -- データが存在する場合
    IF NOT done THEN
      select val;
    END IF;

  UNTIL done END REPEAT;
  close cur;

end
;
;;;
DELIMITER ;

----------------------------------------------------------------

以下実行結果



mysql> call sample_cursor('information_schema','COLUMNS',1);

+---------------+
| val      |
+---------------+
| TABLE_CATALOG |
+---------------+
1 row in set

Query OK, 0 rows affected

mysql> call sample_cursor('information_schema','COLUMNS',2);

+--------------+
| val          |
+--------------+
| TABLE_SCHEMA |
+--------------+
1 row in set

Query OK, 0 rows affected

mysql> call sample_cursor('information_schema','COLUMNS',3);

+------------+
| val        |
+------------+
| TABLE_NAME |
+------------+
1 row in set

Query OK, 0 rows affected




まだまだいろいろとできそうです。

2014年7月2日水曜日

MySQLでMerge文

MERGE , UPSERTといわれる、INSERTとUPDATEを組み合わせた処理。

MySQLでは、[REPLACE]または[INSERT ON DUPLICATE KEY UPDATE]で
実装する事が出来ます。

[REPLACE]
http://dev.mysql.com/doc/refman/4.1/ja/replace.html

[記述例]

REPLACE INTO TARGET_TABLE (COL1,COL2,COL3) VALUES ('1','2','3');

内部的にはDELETE INSERTということなので、タイムスタンプ等の保持で工夫は必要。

ただ、圧倒的に楽にはなりそうです。
(実際、DELETEINSERTを書くところだったので

MySQLで動的DDL

見るよりやってみる。が分かりやすいかもしれません。

キーワード
PREPAREステートメント , executeステートメント

Procedureの実装

drop procedure if exists cust_createtable;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `cust_createtable` (IN table_nane varchar(100))
  READS SQL DATA
BEGIN
  declare col varchar(4000);
  set col = 'col1 varchar(100)';
  select CONCAT('create table ',table_nane,' (' , col , ')') into @qry;
  PREPARE ddl_stmt from @qry;
  execute ddl_stmt;
end
;
;;
DELIMITER ;

呼び出し

call cust_createtable('test3')

確認


show tables like 'test%'

javaでzipファイルを作成する

javaでzipな要件が出てきたのでちょっと書いてみました。

javaに関してはド素人なので文法やお約束などすっとばしてる可能性大ですがご容赦ください。


【やること】

・zipファイル名、対象のファイル、格納する際のパス加工を指定してzip処理を行う。
・元のファイルは特にいじらない。
・ディレクトリ指定された場合、ディレクトリ内のすべてのファイルを対象とする。


【実施環境】

CentOS6.5
java version "1.6.0_30"
OpenJDK Runtime Environment (IcedTea6 1.13.3) (rhel-5.1.13.3.el6_5-x86_64)
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)


【注意点】

いろんな情報を見ていると、JRE1.6系では全角のファイル名が扱えないとか
何とか、いろんな情報が出ているようです。
その為の検証だったのですが、結果、問題ありませんでした。
⇒その後の検証で原因発覚。利用している解凍ツールが対応していただけでした。


ant.jarが持つ、Zip圧縮ツールを使うサンプルです。

【ソースの中身でちょっと分かりづらい仕様の説明】

・存在しないファイルを指定した場合、ゴミZipだけが残る事象が確認されたため
 回避するためにNotFoundExceptionを発生させています。
・絶対パス指定の場合、私の環境ではきれいにフォルダ構成まで作られてしまったため
 それを回避するためにZipEntryへは相対パス以下のフォルダ指定をするようにしました。
・ライブラリを、java.io.zipへ戻せるように、Encodingは外から指定可能とし、
 指定された場合のみ使うようにしました。



【ソース】


汎用性を持たせるため、2つに分けました。

----------------------------------------------------------------
ZipTest.java
----------------------------------------------------------------

import java.io.*;
import java.lang.*;
import java.util.*;
import java.util.ArrayList;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

public class ZipTest{
  public static void main(String[] args){
    File  file;                 //作成するzipファイルの名前
    List<File> files = new ArrayList<File>();
    String baseDirectory = "";
    if (args != null && args.length > 2)
    {
      //引数1 zipファイル名
      file = new File(args[0]);
       
      //引数2 基準ディレクトリ
      baseDirectory = args[1];

      //引数3以降 対象ファイルのパス
      for (int i= 2;i<args.length;i++)
      {
        files.add(new File(args[i]));
      }
      System.out.println(files.size());
    }
    else
    {
      //demo
      file = new File("sample.zip");
      baseDirectory = "/tmp/sample/csv/";
      //圧縮対象を相対パスで指定
      files.add(new File("/tmp/sample/csv/あ.txt"));
      files.add(new File("/tmp/sample/csv/い.txt"));
      files.add(new File("/tmp/sample/csv/ああ.txt"));
      files.add(new File("/tmp/sample/csv/いい.txt"));
    }

    ZipCompressUtils zip;
    zip = new ZipCompressUtils(baseDirectory);

    try{
      zip.Compress(file,files);
    }
    catch (Exception e){
    }
  }
}

----------------------------------------------------------------


実行処理
----------------------------------------------------------------
ZipCompressUtils.java
----------------------------------------------------------------


import java.io.*;
import java.lang.*;
import java.util.*;
//import java.util.zip.ZipEntry;
//import java.util.zip.ZipOutputStream;
import org.apache.tools.zip.*;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class ZipCompressUtils
{
  //Private Declare
  static String _rootPath = null;
  static String _encoding = "MS932";
   
  //Constructor
  public ZipCompressUtils()
  {
  }
  public ZipCompressUtils(String rootPath)
  {
    _rootPath = rootPath;
  }
  public ZipCompressUtils(String rootPath , String encoding)
  {
    _rootPath = rootPath;
    _encoding = encoding;
  }
  public boolean Compress(File target , List<File> files) throws Exception {
    try{
      ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(target));
     encode(zos, files);
      if (_encoding != null)
      {
        zos.setEncoding(_encoding);
      }
     zos.close();
      return true;
    }
    catch (Exception e){
      target.delete();
      throw e;
    }
  }
  static void encode(ZipOutputStream zos, List<File> files) throws Exception {
    byte[] buf = new byte[1024];

    //File配列のLoop
    for (File f : files) {
      if (!(f.exists())){
        throw new FileNotFoundException();
      }
      //ディレクトリなら再帰
      if (f.isDirectory()) {
        encode(zos, Arrays.asList(f.listFiles()));
      } else {
        //ファイルの場合の処理
        String zipEntryPath = f.getPath().replace(_rootPath,"").toString().replace("\\", "/");
        ZipEntry entry = new ZipEntry(zipEntryPath);
        zos.putNextEntry(entry);
        InputStream is = new BufferedInputStream(new FileInputStream(f));
        for (;;) 
        {
          int len = is.read(buf);
          if (len < 0) break;
          zos.write(buf, 0, len);
        }
      }
    }
  }
}

2014年6月20日金曜日

SugarCRMの機能「スタジオ」のまとめ

SugarCRMでは、自分たちの使いたいようにカスタマイズできる仕組みが搭載されています。

その中でも、よく使う「スタジオ」について、機能を纏めておこうと思います。

そもそもスタジオって?


 データに関わる部分、入力に関わる部分、表示に関わる部分 のカスタマイズができるツールです。

 「こういう情報があると良いんだけどな~」 とか

 「項目の重要度で入力順を変えたい」 とか

 「一覧にこの項目も出したい」 とか

 そういった事を解決してくれます。



できること


 ○データに関わる部分
  ・データ項目の追加、変更、削除
  ・項目名の変更
  ・データの関連性の追加、変更、削除

  やろうとすれば、自分たちで新しいデータを作り出すこともできます。

 ○入力、表示に関わる部分
  ・編集画面の並び順、位置の変更
  ・詳細画面のレイアウト
  ・一覧に表示する項目、並び順の変更

  データの入出力画面においては、ほぼすべてを対象として出来そうです。

 ○検索
  ・検索条件、表示内容の追加、変更、削除

 ○モジュール名の変更
  ・リード という名前を変えたり。 とかです。 これはちょっと驚きでした。


ということで、メインで出てくる情報のほぼすべてがカスタマイズ可能です。
うまく使って、活用していきたいと思います。

SugarCRMで、コンボボックス(ドロップダウン)の内容をカスタマイズする

1行備忘録です。

行の追加、削除、変更、並び替えなどができます。


1) 該当の定義名を確認

  【管理】 -> 【スタジオ】を選択後、該当のモジュールを選択して、「フィールド」を選択

2) ドロップダウンの編集

  【管理】 -> 【ドロップダウンの編集】 を選択し、ドロップダウンの一覧から上記の定義名を探す
 クリックすると内容が表示されるので、追加、変更、削除 などができます。

アイテム名は英語、表示ラベルは日本語にするのがよさそうです。

2014年6月19日木曜日

SugarCRMのデバッグ (インバウンドメールが取り込まれない)

SugarCRMはphpで動いています。

一応ソフトウェア開発者なので、困った時にはプログラムを解析、
状況によりデバッグ。なんてこともしています。

今回は、SugarCRMのデバッグ。

インバウンドメールをセットアップしても綺麗にケースに入ってこないので
英語のマニュアルを読むよりは、解析、デバッグしてしまおう。という魂胆です。

【前提】

・インバウンドメールは、cron.phpで呼び出す。
・インバウンドメールの処理プログラムは、以下
 /var/www/myapp/sugarcrm/modules/Schedulers/_AddJobsHere.php

【やったこと】

1. ソースを調べる。


 まず、ソースをのぞいてみました。
 cron.phpを動かしたときにNOTICEが出ていた部分を見つけたのですが

 PHP Notice:  Undefined property: InboundEmail::$team_id in  /var/www/myapp/sugarcrm/modules/Schedulers/_AddJobsHere.php on line 104

 これの原因は後回し。おそらく、インバウンドメールに対応するチームを設定していないからと思います。
 ⇒画面で見ても項目見当たらないし、まだそこまでの運用に載ってない。

 で、ログを吐いている部分を確認。

 $GLOBALS['log']->debug('Trying to connect to mailserver for [ '.$a['name'].' ]');

 どこかにログを吐いていそうなことが分かったので、ログのファイルを検索

2.ログの内容を見てみる


 > locate *sugar*.log
 /var/www/myapp/sugarcrm/sugarcrm.log
 /var/www/myapp/sugarcrm/sugarcrm_05_2014.log
 /var/www/myapp/sugarcrm/sugarcrm_06_2014.log

 ということで、月別にログを吐いていそうなことがわかりました。

 ログの中を見ると、fatalだけが出力されています。内容からしてlog4j的なライブラリだろうと思い、ログの設定をしている所を探して、修正することにします。

3.ログ設定の修正

vim /var/www/myapp/sugarcrm/config.php

 前
     'level' => 'fatal',
 
 後
     'level' => 'debug',

 phpなので、何かの再起動は不要のようでした。

4.再度cron.phpを呼び出す


 ものすごい勢いでDEBUG のログが吐かれてました。
 中を見てみて、当りがついたので対処完了。
 config.phpを元に戻して終了です。

ログ関連の概略は掴めたので、この後の運用も楽になりそうです。


ちなみに、発生事象だった「インバウンドメールが入ってこない件」は、
IMAPサーバー側の「未読」「既読」が関係していました。

全てのメールを「未読」に戻したら、大量に入ってきました。

2014年6月16日月曜日

Windows Update後にインターネットにつながらなくなりました。よ。

よくありそうな話です。決して誹謗中傷ではありません。

知り合いのPCがWindowsUpdate後にインターネットにつながらなくなったとの事で
トラブルシュートおよび実機確認、対処を行った内容を纏めておきます。

【事象】

・Windows Update (2014/06)を行った後、インターネットにつながらなくなった。
 ・利用PCは、Windows 8.1

【聞いたこと】

・プロバイダに聞いたところ、ルーターまでのリンクは確立されている。
 ・他のPCではつながる。⇒この時点でPC固有の可能性
 ・某メーカー製、ウィルスソフトがインストール済
 ・Windowsのファイアウォールは設定変更不可。(たぶん某メーカーソフトを検知して自動的にそうなってる)
 ・有線LAN。ケーブルを挿すところのランプはついている。(2つあり点灯、点滅

【ひとまずやったこと】


 ・ipconfig /release
  ⇒rpcサーバを利用できません のエラー
  ⇒これだけだと絞れないので [windows8.1 ネットワークエラー]とかで検索

 ・IPV6が怪しい可能性があるらしく、IPV6を無効化および設定クリア
  ⇒ netsh interface ipv6 reset

 ・某メーカー製、ウィルスソフトを削除

 ・Windowsファイアウォールを無効化 ⇒ウィルスソフトを削除したら案の定設定可能となった

 ・再起動(当然ですが何度もやったそうです)


 電話対応に限界があったので実機を送ってもらう事に。


【実機にて】


 ・とりあえず起動
  ⇒現象は同じ。 ipconfig /release で、RPCエラー


 ・状況調査

  ・固定IPを設定し、ネットワークの接続を試行
   ⇒IPでは接続可能
   ⇒物理的な故障ではないと判断

  ・Windowsエラーログより、根源を調査
    ⇒山盛りなエラーが出てました。

  ・エラーログ内容(ancillary function driver for winsock)を発見
   ⇒エラー発生時期が、WindowsUpdateの時期と一緒。
   ⇒これは、Windowsの標準ドライバ afd.sys というファイルでした。

  ・上記エラー内容を元に調べていったところ、USサイトにて対処法を確認
http://windowsforum.com/threads/dhcp-client-service-fails-to-start.82734/
   ⇒他のキーワードも思いつかないので上から順に見ていきました。
   ⇒SFCという管理ツールで行けるらしいとのこと。


 ・修復の実施
  ・sfc /veriftonly にて、整合性エラーをチェック
  ・sfc /scannow にて、整合性を修復
   ※管理者モードで実行


  処理結果はこんな感じでした
  ------------------------------------------------------

  C:\WINDOWS\system32>sfc /VERIFYONLY
 
  システム スキャンを開始しています。これにはしばらく時間がかかります。
 
  システム スキャンの検証フェーズを開始しています。
  検証 100% が完了しました。
 
  Windows リソース保護により、整合性違反が見つかりました。詳細は
  CBS.Log windir\Logs\CBS\CBS.log に含まれています。例:
  C:\Windows\Logs\CBS\CBS.log。ただし、オフライン サービス シナリオでの
  ログの記録は現在サポートされいません。
 
  C:\WINDOWS\system32>sfc /scannow
 
  システム スキャンを開始しています。これにはしばらく時間がかかります。
 
  システム スキャンの検証フェーズを開始しています。
  検証 100% が完了しました。
 
  Windows リソース保護により、破損したファイルが見つかりましたが、それらの
  一部は修復できませんでした。詳細は CBS.Log windir\Logs\CBS\CBS.log に
  含まれています。例: C:\Windows\Logs\CBS\CBS.log。ただし、オフライン
  サービス シナリオでのログの記録は現在サポートされていません。
 
  システム ファイルの修復の変更は、次回の再起動後に有効になります。
 
  C:\WINDOWS\system32>
  ------------------------------------------------------
  処理ログ出てましたが、Infoしかなく、見づらいのでスルー


 ・OS再起動
  ⇒再起動後、OSが自動でデバイスドライバのインストールを実施


 ・固定IPアドレスを解除
  ⇒DHCPでIP取得され、インターネットへ接続できることを確認


 ・Windows Updateを実施


 ・OS再起動


 ・Windowsが正常に起動し、ネットワーク接続できたことを確認して完了


Windows8.1におけるWindowsUpdate時の障害はいろいろあるようですが、
今回のPCはプリインストールで色々、その他自分で色々。とアプリが山盛りで
純粋にWindows8.1が悪いのでもないんじゃないかな~と思ってます。

ひとまずは解消したので、一安心。といったところです。

2014年6月12日木曜日

Windows 8.1でディスクアクセスが100%となってしまう症状の改善

windows8.1を使用しているのですが、ごくたまに、HDDの使用率が100%となったままとなり、パソコンの動きがものすごく遅くなることがありました。

いい加減いやになってきたので調べてみたら、Microsoftのコミュニティに見解が。

ちなみに、「windows 8.1 system ディスクアクセス」で検索

http://answers.microsoft.com/ja-jp/windows/forum/windows8_1-performance/windows/e51bf236-45e2-4bd5-818d-22819df5cb1e

IPV6が原因かも。ということで、ネットワークの設定を開き、IPV6をOffにしようと思ったら、既にOffでした。

と思ったのも束の間、BluetoothのネットワークプロパティにもIPV6があり、そちらはOn

Offに変更して、しばらく様子見をしていたら、ディスクアクセスが下がり平穏になりました。


コミュニティ上では設定変更による弊害も報告されているようなので一概にはいえませんが、ひとまず安心です。

2014年6月10日火曜日

SugarCRMにて「メール」を自動的に取り込む。

連投です。

先述の勘違い(取引先と見込み客)を気づかせるきっかけとなったのが

「SugarCRMにて「メール」を自動的に取り込みたいのだけどもどうしたらよいか」

という事でした。 (詳しくは前記事を参照ください)



結果としては、「できます」。どうやるかっていうと、

・「メール」の設定で、「インバウンドメール監視のセットアップ」という設定を用いて監視メールアカウントを設定
・cron.php というプログラムがあるので、それを、cronにて実行


というのがざっくりな流れです。

すると、メールのFromが、「取引先」または「取引先担当者」に設定されていれば、
その人の「ケース」として登録されます。


ちなみに、対象がいないと、純粋なケースとして登録されます。


活用はまだまだですが、ひとまず前進です。


SugarCRMの「リード」と「取引先」の概念

今更です。ちゃんと勉強しておけばよかったと思いました。

「リード」 ⇒ 見込客

これがすべての勘違い。というか早とちり

「リード」は、アクションを起こす前。の相手先であって、相手先としてアクションを起こした後は
「取引先」へのコンバートが必要でした。

SugarCRMでは、「取引が発生していない相手先」でも、アクションを管理するのは取引先です。


すべては自分の勘違いです。

類似で、「ケース」 = 「問い合わせ」 ってのも混乱しそう。まだ整理してません。
「コール」 も。
「コール」って「電話応対」と思ってたのですが、受け付けた、電話応対(問合せ)は
コールなのか、ケースなのか。未確認です。


今更なのですがちゃんと勉強してから着手すればよかったと思いました。

2014年6月9日月曜日

RedmineとSVNの連携(SSL自己認証局を利用)

Redmine + SVNの構成はよくあるケースと思いますが、
Redmine + SVN + (SSL) での構成で、Redmine側からの接続にエラーが出ましたので
その時の対応を備忘録として残しておきます。

【構成および概況】

・Redmineと、SVNで2台のサーバ (双方Winサーバ

・ReamineからSVNサーバへの接続はhttp (それ以外も手段もあるのかは知りません

・今まで公開なしの80で運用していたが、公開に合わせて、443での運用へ切り替える

・各々、Internetからの接続は可能な状態(80,443)

【構成イメージ】

 img_20140530_00001

【発生事象】

・SSLを利用すると、其々への直接接続はできるが、RedmineからSVNへの連携設定を行うと、
 エラーとなる。事象としては、「対象がありません」というようなメッセージ

【原因】

・SVNサーバのセキュリティ証明書が、クライアント(Redmineサーバ)で信頼されなかったから

【結果】

・SVNサーバ側で、SSLのセキュリティ証明書を作成し、
 それをRedmine側のクライアント証明書としてインストール

【手順】

・VisualSVNの機能で証明書を作成できるので、ウィザードに従い証明書を作成

・VisualSVNのインストールフォルダに*.pemのファイルが出来ているので
 ,テキストで開き、セキュリティ証明の部分だけを抜き出して別名保存

・上記で保存したセキュリティ証明のファイルを、Redmine側サーバへ持って行って、インストール。
 インストールパスが「個人」だとダメだったので、えいやで「公的な証明機関」へ入れてしまいました。
 ⇒その後、担当がちゃんとしたところへ入れてるはず。

・ReadmineでSSLを利用した接続へ設定変更し、問題なく接続する事を確認。



SSLについては、@ITさんが詳しく解説してくださっています。
http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284384/?k2







2014年5月30日金曜日

SugarCRMのアップグレード

難しそうなので放っておいたのですが、ウィザードもあり、複雑な作業が必要なさそうなので自前のSugarCRMをアップグレードする事にしました。

環境

・Cent 6.5
・SugarCRM 5.2.0j

今回作業の到着地点

sugarCRM 6.5系 へのアップグレード完了

要約

・アップグレードウィザードでファイルを読み込ませると実行してくれる。
 ⇒「管理」→「アップグレードウィザード」

・アップグレードは、バージョンごと行う必要がある。
 ⇒zipファイル名に、fromバージョン、toバージョンがある。
  sourceforge.net に、ファイルがあるので必要数分取得
  http://sourceforge.net/projects/sugarcrm/files/

事前準備

・公式サイト等々にもある通り、データはバックアップしておきましょう。
 きちんとしている方は、ちゃんとマニュアル読むことをお勧めします。

 ・mysqlのバックアップ
  mysqldump -R -uusername –ppassword sugarcrm > sugarcrm.sql.dmp

 ・モジュール類のバックアップ
  tar –cvf sugarcrm.tar sugarcrm/

 重要5.x 系と、6.x系では、ウィザードの手順、画面構成に一部違いがありました。
 本画面例は5.x系のものですが、大きな違いはありませんでした。

手順

・事前に、必要なzipファイルを入手しておきます。

・「管理」→「アップグレードウィザード」を選択します。

・ファイルをアップロードします
 ⇒複数一気にいけそうな気配の画面ですが、更新できるのは1つでした。
 ⇒対応外のファイルをアップロードしても、認識されないようです。

img_000010


・「次へ」ボタンを押すと事前チェックが開始されます。 多少、時間がかかります。

img_000011


・事前チェックの完了メッセージが表示されるので、「次へ」を押します。

img_000001


・またしばらく待ちになります。

img_000002


・「次へ」を押します。また待ちになります。

img_000003


・処理が完了となりました。

 引き続きアップデートを続ける場合には一旦ログアウトを促されるので、
 指示に従いログアウト、再度ログインします。


・管理画面へ戻ると、バージョンアップされていることを確認できます


2014年5月13日火曜日

Flickrを使いこなそう(写真の並び順、向きの変更)

最近使い始めたflickr

使いだすとなかなか細かいことが気になってくるのですが、
しっかり機能を持っていました。

というわけで、自分が探した、試してみたことの紹介です。

アルバムを作ったけど、並び順を変えたい

1)You -> Albums -> 対象のアルバムを選択 -> Edit -> ドラッグアンドドロップで並び替え
 2)または、Editまでは同じで、Arrange -> Arrange by date taken(oldest fiest)
  newest firstも有り。(古い順か、新しい順か。それ以外も並び替え指定項目あり

写真の向きを変えたい

1)対象画像を選択して、右側にある「○○○」みたいなアイコンを選択
  その後、Rotateを選ぶと向きを変えられます。
 2)一括で行う場合、You -> Organize
  画面下部にある画像から編集したい画像を上部へドラッグアンドドロップ
  Edit Photos -> Rotate
  ・向き以外にも色々と編集できます
  ・写真のフィルタは、コンボボックスから選んだりすることができます


番外編

Androidアプリで写真を選ぶときに、出てきてほしくないフォルダがあるのだけど
 対象フォルダに、 .nomedia というファイルを作ると、出てこなくなります。
 ⇒該当フォルダおよび、そのフォルダ以下がすべて対象となります。
 ⇒反映されない場合には、一旦ファイルを切り取りなどして移動した後、
  元に戻すと反映されます。
  ⇒スマートフォンの再起動とかでもいけるかも・・・・(未検証


2014年5月12日月曜日

Excelの関数実用例

最近、Excelを使ったデータの編集作業を支援していたりするのですが、
一部では「最強のフロントエンドツール」なんていわれるくらいのExcelですので、
いろんなことができる事に改めて気づかされました。

今回は、その際に活用したExcelの実用例などを載せておきます。


●[E2]の値が変更対象シートに該当するデータであれば、"0"、
 そうでない場合には台帳よりデータを取得して結果を表示する
 (VLOOKUP)


=IF(E2="","",IF(ISNA(VLOOKUP(E2,変更対象シート!C$8:C$375,1,FALSE))=FALSE,"0",VLOOKUP(E2,台帳'!$B$13:$D$9587,3,FALSE)))

・VLOOKUP関数は、あいまい検索を許容しない事をお勧めします。
・この例では参照先の指定が絶対値ですが、きっちりやるならテーブル化をお勧めします。


●列数が異なる複数のシート間で、値参照を利用してデータを表示する


 1つのデータが、複数行にまたがる。なんてことはあると思います。
 システム観点では1データは1行である必要がある。

 そんなときにもExcelではよきに計らってくれる方法があります。

 詳しくまとめようとするとそれだけで1記事になってしまいそうなので
 キーワードだけまとめ。
 OFFSET , ROW()
 この関数を使う事で、対処できます。

=OFFSET(参照先シートのデータ参照起点(絶対値),(ROW()-このシートの開始行位置)*このシートのデータ1行あたりのExcel行数,参照起点からの列移動数)

OFFSETを活用すると、複数行のデータを1行に纏める。ってことも関数だけで実現できます。


●データ参照の基本

 =IF(A2="","",A2))
 完璧な処置ではないですが、これを入れるか入れないかで参照の完成度が違います。
 ⇒入れないと、ゼロがセットされてしまう事が多いですね。
 完璧ではない。といったのは、条件として=""としてますが、これが、
 実体はEmptyだったりすること、実体Emptyだったとしたときに""をセットしてしまうこと。
 この両方が対応できてないので「完璧ではない」

 そこまで対応すると計算式が増え、ファイルサイズも増え、自動計算も遅くなり、と
 色々でメリットも出てくるので、殆どのケースではこれでいいのではと思います。


●参照されるデータの基本

  Excelでは、「数値」と「文字」は別物なので、見た目が一緒に見えるのに
  VLOOKUPで比較しても一致しない事があります。
  そんなとき活用するのがTRIM
  =TRIM(A2)
  とするだけで、文字認識されます。




まとまりきらないのでこのへんで。

まだ随時公開していきたいと思います。

2014年5月9日金曜日

1TBまで無料な画像クラウドサービス[flickr]

Yahooが提供しているサービスです。(ただしUS)

https://www.flickr.com/


2014/05時点の情報です。内容は変更されている可能性があります。

要約

・1TBまで無料です。(4MBの画像なら262,144枚!)
・画像サイズはリサイズされず、そのままアップロードできます。
・動画のアップロードも可能
・ブラウザからドラッグアンドドロップでアップロード可能。


気をつけること

・Yahoo.comのアカウントが必要です。
・Androidのアプリはありますが、Playストアからはダウンロードできません。※日本では不可
 ⇒Amazonの提供するappsを利用するとダウンロードできます

Tipsなど

・アップロードする際に「アルバム」を作成、指定することができます。
・アルバムの並び替えができます

今後使いこなせるようになってきたら、続報を纏めたいと思います。
IFTTTでFlickrへ自動的に画像をアップするとか・・・


2014年4月25日金曜日

Excelで「テーブル」の設定を変更・削除する方法

Excelのテーブル機能はOffice2007よりついた便利な機能ですが、
たまに、意図しない動作をしたりして、同じテーブル内に行を追加
したにも関わらずテーブルの行として認識されなかったり、
テーブルの前に列を追加すると認識されなかったりと、
困ることがあります。

そんなとき、テーブルの作り直し、編集をすれば良い。という発想になるのですが
メニューを見てもなかなか見つけられなかったので、纏めておきます。


やりたいこと

Excelのテーブルを編集、削除したい

実現方法

1) テーブル内のセルを選択
 2) 「デザイン」タブを選択
 3-1) サイズを変えたい場合、「テーブルのサイズ変更」
 3-2) テーブルを削除したい場合、「範囲に変換」


これで、使える機能である「テーブル」が、さらに使えるものになりそうです。

2014年4月23日水曜日

Outlook2010で添付ファイルのプレビューをしないようにする方法

Outlookの添付ファイルを操作している時、開けるファイルだったりすると
自動的にプレビューが表示されてしまいます。

セキュリティ上よろしくないという理由もありますが、
ファイルサイズが大きいと動作上もたつくため、オフにすることにしました。

手順

1) Outlookを開く
2) 「ファイル」→「オプション」を選択
3) 「セキュリティセンター」タブを選択し、「セキュリティセンターの設定」ボタンを押す
4) 「添付ファイルの取り扱い」タブを選択し、「添付ファイルのプレビューをオフにする」にチェック

Outlookを再起動すると設定が反映されます。


2014年4月18日金曜日

Webサイトへの不正アクセスを抜粋してみました

Webアプリを運営しているのですが、ふと気になったので、
不正アクセスのログを抜粋してみてみました。

私自身もOSSを使う事が多いのですが、OSSに対する不正アクセスの多さが目立ちますね。

○phpMyAdmin

圧倒的に多いですね。特に、setup.phpへのアクセス。

/myadmin/scripts/setup.php: 6 Time(s)
/phpMyAdmin/scripts/setup.php: 6 Time(s)
/phpTest/zologize/axa.php: 6 Time(s)
/pma/scripts/setup.php: 6 Time(s)
/MySQLAdmin/: 1 Time(s)
/SQL/: 1 Time(s)
/db/: 1 Time(s)
/dbadmin/: 1 Time(s)

○ColdFusion

管理画面へのアクセスのようです。何かできるのでしょうか?

 /CFIDE/administrator/enter.cfm: 1 Time(s)

○zimlet

調べてみたところ、Zimbraというアプリケーションの付帯ツールのようです。
 /zimlet/com_zimbra_email_dns/xd.jsp: 1 Time(s)

○horde

webメールアプリケーション
 /horde/login.php: 1 Time(s)

○Tomcat

APサーバですね。
 /docs/funcspecs/3.jsp: 1 Time(s)
 /manager/html: 1 Time(s)

○epgrec

こんなツールもあるんですね。
 /epgrec/do-record.sh: 1 Time(s)

○foltia

録画ツール

○Wordpress

プラグインを狙ってきました
 /wp-content/plugins/easy-comment-uploads/upload-form.php: 1 Time(s)


他にもありましたがこの辺で。

ツールを使う時には不正アクセスへの対策も十分したうえで使う必要がありますね。

2014年4月16日水曜日

Windows Live Writerを試してみました(Bloggerの編集)

以前、Bloggerを簡単に編集したいと思いツールを探していた時に、MSの製品を見つけたので
その製品を使ってみた感じをまとめます。(この記事はWindowsLiveWriterで書いています。)


結論

結論的には、楽かも。
個人的には画像の挿入作業が一番厄介だったので、ドラッグアンドドロップ一発で貼り付け可能。
これで、たくさん画像があっても、苦労しません。
※ただ、操作できてもBlogに上がらないという現象があるので追加調査要。



使い方ですが、まずは、MSサイトよりダウンロード。
http://www.microsoft.com/ja-jp/download/details.aspx?id=8621

ダウンロードしたSetupを起動します。


MSの総合製品なので、色々入れられますが、Writerのみを選びました。

色々と入っています。

オプション入れる?と聞かれますので任意で。

インストールされたようです。

今回はbloggerです。見当たらないので、「その他」

たぶんこうだろう的なノリで、アカウント情報を入力

 

bloggerを選択したら、リモート接続URLが自動セットされます。

勝手に色々と動いています。おそらくアプリの設定かと。


インストールが完了し、編集画面が開きました。
期待していた画像のドラッグアンドドロップもできて、ばっちりです。
と思ったら、記事保存してもblogに上がらない。追跡調査が必要そうです。


【他気になったこと】
・Ctrl+Z(元に戻す)が若干挙動不審なようです。
・タグが選べないのが残念。ま、これはWebからでもいいかな。(訂正:カテゴリの間違いでした。画面下部で可能でした)
・画像添付して記事を作ってもアップされない。(そもそもでファイルアップと記事アップは別処理か)

2014年4月15日火曜日

SugarCRMでメールを活用する

ひとまずやりたいことは、以下

1) SugarCRMから、メールを送受信したい。
2) メール送受信には、テンプレートを使いたい
3) メールの送受信は、取引先と関連付けたい

というわけで、ひとつずつ進めてみようと思います。

長くなりそうなので記事分けます。ひとまずメールの送受信から。


1) メールの送受信

きちんとドキュメントを読みたい方は、以下にあります。

基本的な設定は、おそらく、「管理」→「メール設定」です。
おそらくってのは、この記事書いてるときにはすでに実現できてしまっていて、
今更変えると怖いので検証していないから。ってのが理由です。
自分は、メール送信エージェントに、管理用のメールアカウントのID、パス、ポート等を設定しています。

その後、自分の設定として、「活動」→「電子メール」を開き、
「設定」から、「メールアカウント」タブを開き、
よくあるメールクライアントの設定要領で必要情報を設定します。
この際、「送信メールサーバー」に、先ほど「管理」で設定したメールサーバーが
出てきますので、選びます。


これだけで、送受信は可能になりました。

が、メールヘッダが化ける。
というか一時は本文も化けてました。
本文は、メールの設定でHTMLを使わないようにすれば回避できました。
・電子メール -> 設定 -> 一般 -> 「電子メールをテキストで送信」にチェックOn 、文字コードセットをISO-2022-JP
で、「保存」を押す。間違っても「完了」を押して保存した気にならないようにしてください!

この辺でタイムアウトとなってしまったので、時間ができたら、
件名、および添付ファイル名の文字化けを直していきたいと思います。

2014年4月14日月曜日

メジャーどころのRDBで利用する主要ツールまとめ。

メジャーどころのRDBで利用する主要ツール覚え書き


  CUI Import Export データ操作GUI Tools
(無償・公式)
Oracle SQLPlus imp exp SQL Developer
SQLServer OSQL Bcp Bcp SQLServer Management Studio
MySQL mysql mysqlimport mysqldump MySQL GUI Tools


MYSQLでフルダンプ

mysqldump -R -uusername -ppassword -hhostname databasename > exportfilename.sql

Oracleでフルダンプ

exp user/pass@connectionname file=fullpath

SQLServerで該当テーブルのデータをCSV(カンマ)で出力

bcp databasename.owner.tablename out dat.dat -U sa -P password -S .\SQLEXPRESS -r \n -c -t, -T


その他1行Tips

○Oracleでデータを一括登録
 SQLLoaderか、SQLPlusで作り込み

○OracleでCSV出力
 SQLPLUSで、パラメータを色々いじくるとできる

○MySQLでCSV出力
 SQLの構文に、LOAD FILE ~とやると取込、OUTFILE~とやると出力

2014年4月11日金曜日

GoogleChromeを起動する際の起動オプションを指定する

Chromeには、起動に関するオプションが用意されています。

ショートカットにオプションをプラスする事により、起動オプションを付与した形で
Chromeを起動することができます。

やりかた

・ショートカットを右クリックして、プロパティを選択
・「リンク先」の、末尾に、起動オプションを付与して「OK」にて保存
・ショートカットから起動

実施例

・指定したページだけを開く
 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --no-startup-window "http://www/"

・マルチアカウントの際、プロファイルを指定して起動
 --profile-directory="Default"
 ※プロファイル名は、chromeより、chrome://versionと入力すると表示されます。
 ※プロファイルのデータは、「 %USERPROFILE%\AppData\Local\Google\Chrome\User Data\ 」に保管されています。(Win8.1で確認)

・ユーザーエージェントをスマートフォンとして起動
 --user-agent="Mozilla/5.0 (Linux; Android 4.0.3; ISW12HT Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36"
 ※サイトにより、スマートフォン認識されない場合もありますので、完全ではありません。

2014年4月10日木曜日

全文検索システム[fess]を試してみる

会社で試験導入が開始されたので、それならばと、自分のPCにも構築しようと思い
試しに動かしてみました。

公式サイト

http://fess.sourceforge.jp/ja/

インストール概要

・JAVAのインストール
・バイナリの取得および配置

インストール手順は公式サイトに紹介されており、非常に親切です。

2014年4月9日水曜日

Oracle 10.2.0.3 Client(32bit)でインストールしたODACのバージョン

Oracle 10.2.0.3 Client(32bit)でインストールしたODACのバージョンが、

1.102.3.0だったんです。

このサイトに検索エンジンなどでたどりついた方は、同じ状況に遭遇しているのかもしれません。


お客様先でシステムのインストール作業を行って、さあ動作検証!って時に
システムでエラーが出てしまい、調べたところ、原因がコレでした。

お客様環境ではPSRをあててるので、最終的なバージョンは1.102.5.0

使いたいODACは、2.102.5.0

ODACの2.102.5.0は、OracleClientではなく、ODACのインストーラを
使ってインストールしないといけない(注:検証していないので正しくはわかりません
らしく、今回はそんな予定はなかったので、仕方なく1.102.5.0への対応を行いました。
※.netアプリだったので、対応としてはBindingRedirectにて読み替え。

BindingRedirectの記事については過去に書いてました。


2014年4月8日火曜日

エラー発生時のトラブルシューティング

私は業務システムに関わっているため、システムの停止=業務の停止であり
システム停止ともなると、何の仕事もさておいて対応。という事になってきます。

そのような特性上、最短で解決できる手段が大事です。
最短で原因を突き止めるためには、いかに正しく
現象を把握するかにかかってきます。


解決への道標とするためのポイントを纏めておきます。


※ソフトウェア寄りのトラブルシューティングになってしまったので、どこかの機会で
 ハード、インフラ系についてもまとめたいと思います。



ユーザーから細かい情報をできるだけ聞き出す

ユーザーは「エラーが起きました」と伝えてくるだけのことがほとんどです
それだけでは、さすがに現象はわかりません。

第一報を受けた後、できる限り、たくさんの情報を聞き出す必要があります。

・「画面にどのような内容が出ていますか?」
・「どのような事をしましたか?」

 発生元、および発生元が出しているエラーの情報を掴む必要があります。
 OSなのか、アプリケーションなのか、ミドルウェアなのか、
 それを掴まないと進みません。
 状況により、ブルーバックなんてこともあるので、
 その時にはどのような事をしたらどうなったかを聞く必要も出てきます。

エラーコード、メッセージを適切につかむ

ユーザーはさらっと流してしまいそうですが、こちらにとっては
 その情報が命。
 再現しないような現象の場合、解決が不可能にすらなってきます。
 どのソフトがどのエラーを出しているかはそのエラーコード、
 エラーメッセージが示しているのです。

 英語だから、長いから。と言って、中途半端に聞いてもいけません。
 MS製品は0x800******というような魔法のようなエラーコードですが
 それも、無視してはいけません。
 今はネットの時代、検索窓に入れると即答で答えが出てるかもしれないです。
 ※メッセージ内容も然りです。

 大事なのは、手を抜かず、確実に情報を取得すること。
 画面のハードコピーを取ってもらい、メールやFAXで頂くなんてのも有りです。


エラーログを見る

エラーログはあちこちに散らばっています。
 このあたりまで来ると、ユーザーの技術習得度やその時の手順によっては
 「難しいからもう無理」と白旗を上げているかもしれません。が、
 こちらはそうは言えませんので、そこからさらに掘り下げます。

 ・Windowsログ
  ⇒管理ツールから見れます。エラーは「×」が出ているので
   利用者でも見ればわかるかもしれません。
 ・ソフトが出しているログ
  ファイル全走査して、更新日が直近のテキストファイルを片っ端から
  見ていきます。
 ・その他、原因が分かっていれば、そのソフトが出しているログ


エラーの詳細が分かれば、あとはその詳細情報を元に
情報をまとめ上げ、適切な処置へと移します。

自分で解決できない事も、発生元および現象さえ分かっていれば
サポート等へ問合せ、対応頂く事も可能になってきます。

今回は解決へ導く手順の要点のみを纏めましたが、
知っておくだけでも、自分で解決できる幅が大幅に広がります。


2014年4月7日月曜日

SugarCRMで任意の項目を追加する

使えば使うほど、使えそうなSugarCRMですが、
リードと取引先に情報の追加がしたくなったのでやってみました。

結果としては、相当簡単でした。

項目を追加する場合の手順

管理 -> スタジオ -> モジュール より、該当のデータを選択

1) 「フィールド」→「フィールドの追加」→ 必要事項を入力して保存
  ※urlの場合、Linkを選択
  ※先に選択しないと入力内容がクリアされるので注意
2) 「レイアウト」→「編集ビュー」→追加した項目をドラッグアンドドロップ
  行を追加したい場合には「ツールボックス」より「新規の行」で追加した後、
  必要な項目をドラッグアンドドロップ
3) 必要に応じ、「詳細ビュー」「一覧ビュー」も修正

ビューを修正したら、「保存して配置」とやると、反映されます。


追加ができるってことは、変更も並び替えも、削除もできます。


このスタジオって機能、使えば使うほどすごそうですね。
検索ウインドウですらカスタマイズ可能。



よし。この仕組みを業務システムへ持っていこう。

2014年4月4日金曜日

ClickOnceでオンライン配置されたアプリケーションのアンインストール

ClickOnceでオンラインのみとしてインストールされたアプリは
「プログラムの追加と削除」に表示されず、アンインストールができません。

開発では、アンインストールする必要があることも出てくると思いますが、
その場合、ツールを利用する事で対処できます。

実行方法


Mage.exe -cc

Mage.exeは、Windows SDKに付属しているツールです。
開発環境をインストールしていれば、プログラムフォルダなどに
存在すると思いますので、ファイル検索などして見つけてください。

開発環境ではない場合、プログラムロジックを実装する事により
同等の処理を行えるようです。

ロジック


using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
 class Program
 {
  static void Main(string[] args)
  {
   CleanOnlineAppCache();
  }
  [DllImport("Dfshim.dll")]
  private extern static void CleanOnlineAppCache();
 }
}


それでも消えない場合

ファイルを直接削除するという荒技もあるようです。

ClickOnceアプリケーションのインストール先は、利用環境によって
異なりますが、Windows8.1の場合、以下となります。


C:\Users\username\AppData\Local\Apps\2.0


ClickOnceは、使い方のポイントさえ押さえれば、使えるツールだと思いますので
うまく付き合っていくと、業務効率化に役立つのではないかと思います。

2014年4月3日木曜日

dnsサーバーの設定状況を確認する

DNSサーバの切替時は、何かしら起きる(もの)と思っていますが、
今回、ドメインの移管先切替に伴い、お客様より「うまくいかないんだけど~」と
聞かれてしまったので実態調査。

その時のメモです。

以下、Windowsクライアント編

サーバーを指定して、domain.co.jpの設定を確認する

>[nslookup] [-type=soa] [ドメイン名] [DNSサーバ]
>nslookup -type=soa domain.co.jp 01.dnsserver.jp
サーバー:  UnKnown
Address:  xxx.xxx.xxx.xxx

domain.co.jp
    primary name server = 01.dnsserver.jp
    responsible mail addr = hostmaster.dnsserver.jp
    serial  = 1395794157
    refresh = 3600 (1 hour)
    retry  = 900 (15 mins)
    expire  = 604800 (7 days)
    default TTL = 300 (5 mins)
domain.co.jp    nameserver = 01.dnsserver.jp
domain.co.jp    nameserver = 02.dnsserver.jp
domain.co.jp    nameserver = 03.dnsserver.jp
domain.co.jp    nameserver = 04.dnsserver.jp

サーバーを指定して、ホストの情報を確認する

>[nslookup] [サーバ名] [DNSサーバ]
>nslookup mail.domain.co.jp 01.dnsserver.jp

サーバー:  UnKnown
Address:  xxx.xxx.xxx.xxx

名前:   mail.domain.co.jp
Address:  xxx.xxx.xxx.xxx

メールレコード(MX)を確認する

>[nslookup] [type=MX] [ドメイン名] [DNSサーバ]
>nslookup type=MX domain.co.jp 01.dnsserver.jp
サーバー:  UnKnown
Address:  xxx.xxx.xxx.xxx

domain.co.jp    MX preference = 10, mail exchanger = main.domain.co.jp
domain.co.jp    nameserver = 01.dnsserver.jp
domain.co.jp    nameserver = 02.dnsserver.jp
domain.co.jp    nameserver = 03.dnsserver.jp
domain.co.jp    nameserver = 04.dnsserver.jp
bizmw.domain.co.jp     internet address = xxx.xxx.xxx.xxx

-----------------------------------------------------------
以下、linux編

サーバーを指定して、domain.co.jpの設定を確認する

[root@]# dig domain.co.jp SOA

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> domain.co.jp SOA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46534
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;domain.co.jp.       IN    SOA

;; ANSWER SECTION:
domain.co.jp.   86400  IN    SOA   01.dnsserver.jp. hostmaster.dnsserver.jp. 1395794157 3600 900 604800 300

;; Query time: 10 msec
;; SERVER: 210.224.163.4#53(210.224.163.4)
;; WHEN: Fri Mar 28 12:03:28 2014
;; MSG SIZE  rcvd: 91

[root@]#


結局、問い合わせを受けたにもかかわらず、その後の応答が何もないので
おそらくDNSが浸透したのでしょう・・・。と。


2014年4月2日水曜日

Windowsでプロセスを終了させる(TaskKill)

TaskKillコマンドを使うと、Windowsで、コマンドラインからプロセスを終了させることができます。
LinuxのKillと同じですね。

使い方例

プロセスIDを指定して終了させる

TaskKill /PID プロセスID

イメージ名 (Exe名など)を指定して終了させる

taskkill /FI "imagename eq AcroRd32*"


プロセス情報を表示するTaskListコマンドと組み合わせて、
繰り返しで監視して該当アプリが起動していたら終了させるバッチを
作ってみました。


:LOOP
for /f "usebackq tokens=1,2 delims=," %%a in (`tasklist /FI "imagename eq AcroRd32*" /FO CSV /NH`) do (taskkill /PID %%~b)
REM 一定時間待機のダミーPING
ping 127.0.0.1 -n 10
goto LOOP

バッチファイルとして保存すると実行されます。

2014年4月1日火曜日

20代で差がつくと言われている件で自分なりに考えてみた5つの理由

4月です。今年も新社会人が元気に会社勤めを始めています。



社会に出るとよく耳にするキーワードの一つに「20代のうちに」というのがあります。

「若いうちにこそ頑張る」とか
「20代で頑張っておかないと後で大変になる」とか
「社会人3年までにこれこれはやっておきなさい」

言い方言い回しこそたくさんあるものの、20代向けをターゲットとした教えは多いです。

そこで、自分なりに、なぜかを考えてみました。

1.年を取ると経験が邪魔をする

言い換えると、「頭が固くなる」ってやつですね。

 人間は経験で生きる生き物だと思います。
 危機管理や効率化、趣味など、いろんな事を経験をすることにより
 様々な面で幅が広い人間性が出来上がってきます。

 一方、経験が増えるという事は、取捨選択の幅にもつながります。
 楽な仕事というのは基本ないはずですが、楽な仕事が選択肢、経験として
 ある場合には、当然、楽なほうに行きたい気持ちも出てきます。

 そうやって、楽なほうの仕事に流れていくと、ある日突然難しい仕事が
 きたときに、対応力に差が出てきてしたりします。

 若いうちに楽な仕事を覚えない=楽が選択肢に入らない=日々努力し成長
 という、ある種気が遠くなるスパイラルかもしれませんが、
 30代に入った時の差は大きなものになっているのではと思います。

2.新しいことに挑戦することが習慣化できる

学生生活は、毎日が新しいことだらけです。
 放っておいても、新しい授業はあるし、毎年クラス替えや、学校が変わったり、
 イベントがあったりと、自分が何もしなくても変化があります。

 社会人になっても、数年くらいは新しいことだらけで今まで通りですが、
 ある一定期間を超えると、仕事環境にも慣れてきます。
 そこで、新しいことをしなくなっていくと、結果、新しいことを考える必要がなくなり、
 成長がストップしてしまいます。

 実際、ストップするわけではないはずですが、成長曲線が鈍るのは明らかです。
 若いうちから「仕事=新しいことにチャレンジ」を意識づけし習慣化しておくことで
 30代あたりの仕事の仕方が大きく変わってくるのではないかと思います。

3.チャレンジできる

30代を過ぎると、チャレンジできる環境はだんだんと減っていきます。
 若いからと許されていたものも、そうも言ってられなくなってきます。
 言えなくなってから気づくのでは遅いので、早めにやっておきましょう。という事ですね。

 転職機会も、30代に入るとガクンと落ちます。
 それだけを見ても「チャレンジが許される」年頃なのでしょうね。

4.「仕事=学び」の習慣を作れる

「学校=学ぶ」というのは誰もが知っているところ。
 では、「会社=学ぶ」はどうか。大半は「そりゃ違うよ」と言いそうです。
 会社は、勉強をするために対価を払うのではなく、利益に対して対価を出すものです。


 では、「仕事=学ぶ」はどうか。


 個人的には合っていると思ってます。

 なぜか。幾つか観点があると思いますが、
 仕事とは、だれかの役に立って対価をもらう事であり、
 仕事をする以上、自分の仕事の意味、置かれている環境、
 周りの環境、社会情勢など、知らないといけません。

 知るためには勉強。つまり、「人生常勉強」みたいな言葉こそ、
 仕事にも当てはまり、その重要性に早く気付いて習慣化することが、
 将来にわたって仕事を続けていける事につながります。

 年を取ってから「勉強」ってなると、学生時代の勉強を
 思い出してしまい、いや~な気になってしまうのは想像に難くないです。

 勉強をするのではなく、仕事の為に勉強。
 気の持ちよう一つですが、習慣化するかどうかでものすごい差が出ます。

5.若いっていいよね!

何でも楽しいですね。
 楽しいうちに、仕事の苦労も知っておくのが重要かと思います。

 自分のモチベーション = 楽しいこと - つらいこと

 楽しいことが多い時期にこそ、つらいこともたくさん知っておくことが
 後々の資産になるのではないかな。と思います。



個人的に5つほど挙げましたが、やって損はないことばかりと思ってます。

若いうちに楽な仕事に配属されてしまって数年たち、成長曲線が見えない
中堅どころも見て、「20代のうちに関わってあげられればな~」と思ったりもします。

少なくとも、3年以内の若手には、十分に気づかせてあげたい

そう思うこの頃です。

Oracle カラム一覧・テーブル一覧を取得

昔から使うのに、身につかないので記事にしてみようと思います。

当然ながら、他のRDBMSでも実現機能はあります。
アプローチが違うだけです。

以下、手抜きSQLです。

実装例

SELECT col.* , com.comments from
(
select * from user_tab_columns
where table_name in (select table_name from user_tables)
) col
,
(
SELECT * FROM USER_COL_COMMENTS
where table_name in (select table_name from user_tables)
) com
where
col.table_name = com.table_name(+)
and col.column_name = com.column_name(+)



カラム一覧を抜き出して、そこにコメントを結合しています。
テーブル名で絞っているのは、ビューなどほかのオブジェクトが出てきてしまったからです。


関連してですが、ファンクションなどの情報は、USER_OBJECTSに入ってます。


2014年3月31日月曜日

Oracleで正規表現

10gより、正規表現が使えます。

REGEXP_LIKE という関数を使います。

構文例

SELECT * FROM DATA
WHERE
REGEXP_LIKE(ATAI,'^[0-9]+[\.]*[0-9]*$')


数値:^[0-9]+[\.]*[0-9]*$
数字範囲:^[0-9]+[\.]*[0-9]*~[0-9]+[\.]*[0-9]*$


正規表現はあまり詳しくないのでお許しくださいませ。

これで、よくネットでQAが上がっている「ISDATEと同等の関数ありませんか?」とか
「ISNumericと同等の関数ありませんか?」とかが少しでも
解決するのではいかという気がします。


追伸:他のRDBMSでも類似機能がありました。
MSSQL : LIKEで可能
MySQL : LIKEと似た機能で、Col RegExp 正規表現 という形で実現


2014年3月28日金曜日

Oracleで別テーブルの値を参照してデータを更新するときの簡単な方法

マスタからあるKEYでトランザクションを結合して、
マスタの値を一括更新したい!なんて時、ありますね。

そんな時、昔書いていた方法を探していたら、別のアプローチを見つけました。

今まで知らなかったのが勿体ない。
というか、何事も片手間でやってはいけないな。と反省です。


実装例

インラインビューという方式を使います。
要は副問合せ、サブクエリです。

UPDATE
(SELECT
  DS.KEYSEQ
  ,DS.HYOJI_NM
  ,M.HYOJI_NM DISP
 FROM
  DATA DS , MASTER M
 WHERE
  DS.KEYSEQ = M.KEYSEQ
)
SET HYOJI_NM = DISP


何のことはない、サブクエリでKEY結合したものを外でSETしているだけです。

Oracleでできるので、他のRDBMSでも同等の機能はありそうですね。

暫くOracleをさわっているので、それ関連の記事が続きそうです。

2014年3月26日水曜日

VSS (Visual Source Safe) を利用するときのTips

VSSはVisualStudioと連携して利用できるソース管理ツールであり、
.netが世に出る前から開発をされている方などにはなじみの深いツールの1つかと思います。

現在はTeamFoundationServerへの置換なども推奨されており段々と新規での利用シーンは減ってきそうですが
とはいえ、過去に開発したシステムなどはVSS管理のものも多いと思います。


そこで、VSSを使う上で、良く聞くTipsを纏めておきます。

○サーバーからデータを取得すると、更新日時が取得日時となるので何とかしたい

設定で変更できます。
 ⇒[ツール] → [オプション] → [ローカルファイル タブ] → [ローカルファイルの日付と時刻] を、「変更時刻」にする
 ※プロジェクトごと必要です

○PDFファイルなど、バイナリファイルを格納するとデータが破損する

設定で変更できます
 ⇒[ツール] → [オプション] → [ファイルの種類 タブ] → [バイナリファイル] に、[*.pdf] などを追加

○VisualStudioを起動した際に、ユーザー名とパスワードを省略したい

⇒OSのログインユーザー、パスワードをVSSと合わせると、自動的にOSのログインユーザーでログインできます。

○VSSとVisualStudioのソース管理連携を外したい

⇒VisualStudioを開き、[ファイル] → [ソース管理] → [ソース管理の変更] から、「切断」
  その後、VSS用の管理ファイル類ファイルを削除
  ※コマンドラインで[del /s *.*scc /a:r]などで一括削除が楽です

○文字化けが発生する

 Visual Source Safeのバージョンかもしれません。
 VisualStudio6.0に付属しているVSSは6.0dですが、このバージョンはUTF-8に対応してません。
 最新は、VisualStudio2005に付属のVSSです。


2014年3月24日月曜日

sugarcrmにてログインパスワードを忘れてしまった場合の対処方法

sugarcrmにてログインパスワードを忘れてしまったときの対処です。
自分でやらかしてしまったので、備忘録的にメモ。

フォーラムで紹介されていたものの転用です。

なお、画面やツール等は提供されていないので、データベースの値を
直接変更する必要があります。


1)mysqlへログイン

$mysql -uusername -pPassword

2)データベースを選択

use sugarcrm

3)ユーザーを確認

mysql> select id,user_name,user_hash from users;
+--------------------------------------+----------------------+----------------------------------+
| id                                   | user_name      | user_hash                              |
+--------------------------------------+----------------------+----------------------------------+
| 1                                    | admin          | 06b277a9ac1c17d4e1ac8420258df870       |
| 92b52357-03c2-a86a-b2a6-52a5754d10ee | NULL           | NULL                                   |
| a41b1dc0-7a35-53bf-9365-52a576c3a36f | username1      | 7c5d92e64c229fb078825416aeb8c63e       |
| 86767bc1-b3b9-0849-c875-52a577d97fc3 | username2      | 7fe2434a2c4fb1994c39991c55f42b55       |
+--------------------------------------+----------------------+----------------------------------+

idを確認します。

4)パスワードを変更

update users set user_hash = '4a7d1ed414474e4033ac29ccb8653d9b' where id = 'a41b1dc0-7a35-53bf-9365-52a576c3a36f';


パスワードはmd5ハッシュとなっています。本サンプルでは'0000'を指定しています。

これで、ログイン画面からパスワード0000でログインできるようになりました。

2014年3月18日火曜日

mysqlでリモート接続を可能とする

このメモは、リモート接続でデータベースアクセスをするためのDMLです。


create user remoteuser@192.168.100.100 IDENTIFIED BY 'password'
GRANT ALL PRIVILEGES ON databasename.* TO remoteuser@192.168.100.100

権限を適当にしてしまっていますが、運用に合わせて適切に。。。


別手法として、 remoteuser@% ってのもありますのでご参考まで(自分は使ってません

2014年3月17日月曜日

昨今のプログラム自動生成ツール

昨今のプログラム自動生成ツールについてです。


先日、ジェネクサスジャパン様のプレゼンを拝聴しました。

ジェネクサスジャパン様は、プログラム自動生成ツールを取り扱っており、
GeneXusというツールを使い、管理画面で各種設定をすることにより、
各種プログラムが自動生成されます。

対応しているプログラムは、Web,Windowsアプリ、iPhone,iPad向けアプリ、Android向けアプリと多様

最近はここまで来ているか。と感心したものですが、過去さかのぼってみると
昔からこの手の話題はありました。


いま改めて調べてみても、いくつかありましたので要約
※検証はしてません。


blanco Framework
 Excelから自動生成してくれる、オープンソースのツール

MDFrame
 別途XUpperという上流ツールが必要かもしれませんが、
 同じく、ソースを自動生成してくれます。

GeneXus
 アジャイル向きという事でした。1つの設定でマルチプラットフォームへの
 対応が可能なところには驚き。
 ウルグアイで開発されているそうなので世界的な動きにも対応していそうです。
 一方、基本機能で対応できない事をやろうとすると、専用の言語習得が必要。
 ※とはいえ、Excelライクな関数などだったのでさほど苦でもないかも。

Wagby
 Java用。Struts, Spring, Hibernateの構成で動作するソースを自動生成
 社長様がGeneXusとの比較記事を書いていました。

その他、色々沢山ありました。が、時間の都合上省略します。



開発、運用をしている立場からの観点で気になった事としては、
「継続的に改修・改良に耐えうる仕組みであるか?」という事です。
継続的インテグレーションってやつですね。

作るのは1回でも、改修改良は、システムが使われる限り永続です。
私個人的には初期の開発より、改修改良に重きを置いて作り込みたいと思ってます。

今回丁度いいきっかけを頂いたので、今後、色々と使ってみたいと思います。


記事のラベルを整理する意味と勘所(私見)

日々何となく書いている記事なので、ラベルも何となくつけてます。
ようやく、100記事も間近となってきたので、記事を整理してみました。

【結論】
○ラベルには、製品名、言語名など、ピンポイントの項目名をつける。
○可能であれば、その上位の概念レベルの項目名もつける

派生として、ラベルで絞った時に、タイトルで記事にたどり着けるようにすること。


【整理して思ったこと】

意味なしラベル
○Microsoft,開発言語,データベース -> 広すぎて役に立たない
○.netとvb.net -> 混在でいいので.netへ統合 (vb.netに限らない記事も多いし)
※私の記事における意味なしです。念のため


逆に、あっていいなと思ったもの
○ツールや、言語、製品名を特定するもの(EclipseとかOracleとか
○言語名


きちんと設定して、使いやすくしておきたいと感じました。

2014年3月14日金曜日

GreaseMonkeyを活用する (初級編)

今までは、提供されていたものを使うだけだったのですが、
JavaScript,jQuery周りの知識がついてきたのと、Webの仕事が増えてきたので、
GreaseMonkeyを使って、自分でスクリプトを書いてみる事にしました。

GreaseMonkeyも覚えられて、jQueryも使う事ができるようになって、
仕事も効率化。と、いいことづくめになりそうです。


インストールなどの説明は省き、使っているケースの紹介です。

ケース1 :ログイン画面で、自動的にIDとパスを表示する

システム開発におけるテストとか、運用保守とかに使えそうです。
毎度入れるのが手間だったりするので、大助かり。


// ==UserScript==
// @name     IDを自動セットする処理
// @namespace  domain.com
// @description 任意の文字
// @include   対象のurl
// @version   2
// ==/UserScript==
  $("#txtloginID").val('loginid');
  $("#txtfPASSWORD").val('password');

jQueryで値をセットしているだけですね。簡単です。



ケース2:ボタン機能を追加することで機能拡張



// ==UserScript==
// @name     フィルタ機能の実装
// @namespace  domain.com
// @description 任意の文字
// @include   対象のurl
// @require   http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js
// @resource jQueryUICSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css // @version 2 // ==/UserScript==

大事なのは、@requireを入れるところ。
jQuery対応していないサイトだったのですが、以下1文を入れるだけで
jQuery対応となります。CSSを読むには同じ要領で、@resourceを指定します


フィルタのボタンを入れる。(alertはダミーです

$(document).ready(function(){
  $('input[name=RE]').after('<input type="button" name="filter" value="フィルタ" onclick="alert(&apos;&apos;);">');
});


ケース3:カスタムCSS


var cssValue = ".custBtn{color:blue;background-color:lightgreen;margin:0 2px 0 2px;}";
var style = document.createElement('style');
style.textContent = cssValue;
document.getElementsByTagName('head')[0].appendChild(style);



あとは通常のjavasscript(jquery)で何とでもなりそうです。

2014年3月13日木曜日

TeraTermでの複数ホスト接続をバッチ一発で実行

Linux機の運用を行っていると、複数端末に対してまとめて作業を
実施したいケースが出てきます。

仕組みを予め作り込んでおくことにより、使う時にはバッチ一発起動で
複数のホスト接続ができるようになります。

今回は接続までですが、改良する事によりそれ以降の処理も可能です。

構成イメージ

 


概略

  1. URLリストを作る
  2. バッチでURLリストを読み込み、TTPMacroを繰り返しで呼び出し
  3. TTPMacroで、URLを受け取り、ユーザとパスワード等を使って組み立てて、接続

実行するバッチの記載例

#TTPMacro.exeが存在するパスを指定
SET MACROEXEPATH=c:\Program Files (x86)\teraterm

#TTPMacro.exeを指定(固定
SET MACROEXE=ttpmacro.exe

#マクロが存在するパスを指定します。(フルパス必須)
SET MACROPATH=%~dp0\loginall.ttl

#ディレクトリを移動
cd /d %MACROEXEPATH% 

#urllist.txtを読み込んで、引数としてTTPMacro.exeを起動
for /F %%i in ( %~dp0\urllist.txt ) do start %MACROEXE% %MACROPATH% %%i

#元の位置に戻る
cd %dp~0

pause

実行するマクロの記載例

;パラメータ受け取り
HOSTADDR = param2
;ユーザー名とパスワードの定義(パラメータで受け取っても良いかも)
USERNAME = 'remoteuser'
PASSWORD = 'remotepassword'
;接続文字列の組み立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
;接続
connect COMMAND
;応答を待機
wait 'remoteuser@'
;マクロ終了
end

jquery 1行tips (入門編

自分用メモです。

select要素の値を設定する


$("select[name='selectname']").val(値);

イベントのバインド


$("#button").bind("click", function() {/*実行処理*/;});

要素の列挙(each)


$("select[name='selectname'] option").each(function()
{
    alert($(this).val());
});

select要素の指定値を削除


$("select[name='selectname'] option[value=1]").remove();

配列の中を検索して結果を返す


var arr = [ 4, "Pete", 8, "Pete", "John" ];
if (jQuery.inArray("Johnnn", arr)
{
    alter('not Found');
}

要素のコピー


$("#BackupArea").append($("select[name='MARKETCD']").clone(true););

要素のコピー(応用)


$("input[name='buttonname']").after('<div id="customBackupArea" style="display:none"></div>');
var backupElm = $("select[name='MARKETCD']").clone(true);
backupElm.attr('name','MARKETCD_BAK');
$("#customBackupArea").append(backupElm);

ラジオボタンの選択


$("input[name='name']").val(['0']);

ラジオボタンで選択されているものを取得


$("input[name='name']:checked").val();

2014年3月7日金曜日

Windowsでコマンドを利用してネットワークドライブの割り当て

自分用備忘録。
画面からやるとエラーとなってしまうのでコマンドを使う事にしました。


構文

net use [ドライブ] [共有フォルダ名] [パスワード] [ユーザー名]

Example

net use z: \\172.31.5.26\Repository password /user:domain\username
net use z: \\172.31.5.26\Repository password /user:username

net use z: \\172.31.5.26\Repository
ユーザー名とパスワードを聞かれるので、入力

'172.31.5.26' のユーザー名を入力してください:
172.31.5.26 のパスワードを入力してください:

サンプル上のネットワーク共有名は適宜書き換えてください。


追伸

Windows8.1でいくらやってもきちんとつながらないな・・・と思っていたら、使っているコマンドプロンプトが管理者でした。
管理者だと参照領域が違うようです。

2014年3月6日木曜日

ドメイン移管の簡単な方法(onamae.com)

ドメイン移管とは、ドメインの管理者を変更する手続きです。
時と場合により呼び方は様々ですが、
ドメインという商品の性質上、簡単にはできないようになってます。

特に、gTLDドメインなどでは、認証手続き(AuthCode)が必要で、
相手先とのやり取りが何度か発生し、それにより時間もかかります。


今回、お名前.comで提供している機能(方式)により、
簡単にドメイン移管ができましたので手順を残しておきます。


前提

移管元、移管先の双方が、お名前.comを利用している必要があります。

手順

1) 移動元のお名前.com管理画面より、「お名前ID付け替え」機能を利用して
  対象のドメインを、新しいお名前.comのIDへ移動
2) 新しいお名前.comのIDでログインし、同じく「お名前ID付け替え」機能を
  利用して、対象のドメインを、移管先のお名前.comのIdへ移動

ざっくりいうと、ダミーのIDを作り、それを経由して移動する。という事です。

手順がお名前.comのサイトにありましたので公式。費用も掛かりません。


公式情報

・お名前ID付け替え
http://www.onamae.com/guide/details.php?g=27

・お名前ID/パスワードを移管元にお互い通知できない場合
http://help.onamae.com/app/answers/detail/a_id/8139



今後ドメイン移管の際には、管理しているレジストラがお名前.comかを聞くようにしようと思いました。

2014年3月5日水曜日

管理者モードでのコマンドプロンプトの挙動に対する注意点

コマンドプロンプトを使っていると、
「この操作を実行するのに十分な特権がありません」

と出る事があります。
これは、WindowsVista以降で組み込まれたWindowsのユーザー・アカウント制御(UAC)による挙動で、
「Windowsにとって」特別な操作の場合、利用者への注意喚起を行う仕組みです。


本題ですが、これではまりました。
通常モードで実行できるコマンドを、管理者のコマンドプロンプトで
実行すると、通常の動作と異なる。

言い換えると、管理者特権が必要なアプリケーションにしか反映されません。


以下、net useコマンドで表示される結果

通常の権限で実行

ステータス  ローカル名 リモート名         ネットワーク名
------------------------------------------------------------------------------
利用不可   M:     \\192.168.1.201\music   Microsoft Windows Network
K      P:     \\srv\Project       Microsoft Windows Network
K      Q:     \\srv\common$       Microsoft Windows Network
K      Z:     \\srv\Repository
                        Microsoft Windows Network
------------------------------------------------------------------------------

管理者権限で実行

ステータス  ローカル名 リモート名         ネットワーク名
------------------------------------------------------------------------------
K      Z:     \\srv\Repository
------------------------------------------------------------------------------

出てくる行数が違います。

管理者モードで net use ドライブ パス とやって、ネットワークドライブを作成しても、
エクスプローラ上には出てきませんでした。
当然、通常のモードのコマンドでも出てきません。

設定をかけてもうまくいかず、コマンドの構文なのか環境なのかと疑ってかかり、
たどり着いたのがこれという結果・・・

まとめ

日常的に管理者のコマンドプロンプトを使っていたのですが、
これからは必要な時にのみ使うようにします。

2014年3月4日火曜日

【雑記】おつりが少なくなるように支払うことの意義

IT関連の記事ではありませんが、改めて考えさせられたのでまとめてみました。

長文になってしまったので結論から。

! お店ではつり銭にも経費かかります。できる限り協力したほうがみんな幸せ !

※決して、私がお店を経営しているとか、そういうわけではありません。


というわけで、本文

スーパーや飲食店、雑貨店のレジでよく「**が不足しています」というポップ(貼紙)を見ることがあります。

そのときには「ふ~ん」としか思っていなかったのですが、
先日、顔なじみの店で小銭で支払った時に「ありがとうございます。助かります」と言われ、ふと気づきました。


★銀行での両替には手数料が発生する 

そういえば、数年前(ネットでさかのぼって記事を探すと10年前にはそうなっていた)に
そんなニュースを聞いたような覚えがあります。


それをふと思い出したのです。


銀行により手数料は無料の範囲などはまちまちのようですが、
ある一定の量を超えると累進的に手数料があがっていく。

それも、枚数により変わる。


気になってどうしようもなくなったので試算


 ※クリックして拡大

赤字で記している部分がきついところです。

枚数的にたくさん出ていく部分も利益に影響する部分だと思うのですが、
それよりも、10,000円で缶コーヒー、1,000円で缶コーヒー あたりの売上比がすごいです。
1,000円だと売上の2.8% , 10,000円だと売上の4.6%にものぼります。
消費税(5%)なみなので、日々数パーセントを意識して商売をなさっている方には辛い数字ですね。


とはいっても、お釣りをもらわない生活は実質的に不可能ですし、実現しようとしたら途方もないことになります。



おつり要らずといえば、クレジットカード(CMでもやってますね)

ただ、あれも加盟店手数料(3~6%と言われている)が取られるので結果変わらず、
Suica決済は2~4%とのこと。多少安いかな。
squareなどのモバイル決済だと、3.25%~


並べて比べてみるとなんてことないじゃんって話なのですが、
とはいえ、お店からしたら経費です。1円でも少ないに越したことはありません。


聖人君子のようにお店のことを考えるのは難しいとしても、
ちょっとした配慮でそのお店に貢献できるかな。と感じました。


2014年3月3日月曜日

EmEditorを持ち運ぶ(Portable化)

タイトルの通りです。

1) メニューバーより、
「ツール」→
「インポートとエクスポート」→
「USBドライブなどのリムーバブルドライブをセットアップしてすべての設定をINIファイルにエクスポートする」を選択

2) エクスポート先ディレクトリを選択

これだけで、持ち運び可能となります。

http://jp.emeditor.com/text-editor-features/versatility/portability-options/


インストーラからでもできるようですね。

2014年2月27日木曜日

USBメモリを暗号化してデータ保管できる「TrueCrypt」

http://www.truecrypt.org/

USBメモリを、暗号化して持ち出すことができるアプリケーションです。
英語版ですが、別途言語ファイルを追加する事により日本語化も可能です。


USBに関して、実現できる方法は2通り。

1) USBメモリそのものを暗号化
2) USBメモリに、暗号化されたファイル(コンテナ)を作成し、その中にデータを格納

1)のケースは、持出先でもTrueCryptのアプリが必要であり、今回は
不特定多数の環境でもデータを見る必要があることから、2)を採用。

インストール手順

1) ソフトをダウンロード
2) インストーラを起動
3) 選択肢の中で、「Extract」を選択。展開先としてUSBを選択(フォルダは任意)
  これにより、持ち運び可能なアプリとして展開されます。
4) 進めていくと、USBへの展開が完了。
5) 言語ファイルを、上記で展開したフォルダへコピー

ここまでで、利用準備が完了です。

暗号化データの作成

アプリ[TrueCrypt Format.exe]を利用します

1) 暗号化されたファイルコンテナを作成 を選択
2) 「TrueCrypt標準ボリューム」を選択
  もう一つの選択肢は、暗号化ファイルの中に暗号化ファイルを含む。というような動作です
3) ボリュームの位置にて、USBメモリ内の、任意のパス、ファイル名を指定
  私の場合、一見わからないファイル名にしています
4) サイズ
  コンテナのサイズです。後に、これが、暗号化ドライブの容量となります。
5) パスワード
  ご自由に
6) ボリュームのフォーマット
  適度にマウスを動かしたのち、「フォーマット」
  ドライブ容量にもよると思いますが、そこそこ待ちます。

これで、暗号化したいデータを格納できるコンテナファイルが完成です。


暗号化ドライブの利用

1) TrueCrypt.exeを起動
2) 一覧より「ドライブ」を選択
3)「ボリューム」の欄で、先ほど作成したふぃあるを選択
4) パスワードを入力

これで、ドライブとして認識されます。


使い終わる際には、マウントを解除してから、USBをを取り外すのが確実です。