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@% ってのもありますのでご参考まで(自分は使ってません