のえら

技術備忘とかメモとか.間違いはつっこんでいただきたい所存.アフィリエイトはやっていません.

Struts2でアクション内でリクエスト内容を確認する

コントロール内でリクエストされたパラメータをログ出力で確認する方法
パラメータのvalueが配列になっているので、無理くり連結して出力している

for (Entry<String, String[]> ent : request.getParameterMap().entrySet()) {
    log.info(ent.getKey());
    log.info(StringUtils.join(ent.getValue(), ", "));
}

jsPDFをIE8-9に対応させたかった→できませんでした

Blobやatob、ArrayBufferをIE9でも使えるようにして出力を試してみたが、dataURIにIEが対応していないっぽい
jquery - how to get base64 pdf string working in IE ( base64 pdf string is coming from odata call) - Stack Overflow

引用:

According to this you cannot use data uri for navigation in IE.
?Internet Explorer through version 7 (approximately 5% of web traffic as of September 2011), lacks support. However this can be overcome by serving browser specific content.
?Internet Explorer 8 limits data URIs to a maximum length of 32 KB. (Internet Explorer 9 does not have this limitation)
?In IE 8 and 9 data URIs can only be used for images, but not for navigation or Javascript generated file downloads.

そしてIE8ではpolyfillで必死に対応しても無理ゲーだったことをここに記す。

ウォンバットさんたち×ラブライブ!のクロスオーバーが描きたいだけの人生だった(タイトル)

自分の好きな「ウォンバットさんたち」と「ラブライブ!」が一緒になったら幸せなんじゃね?と思った結果の産物。
絵にする気力はなかった。。そのうち。。

【コアラさんとにこにー】
(コアラさん原稿なう)
なに、漫画描いてるの?・・・ふーん、なかなかいい話だけどぉ、そうね、なんだったらにこのアイドル生活密着ドキュメント描いてもいいのよ?
(原稿が進まない・・・)


【コアラさんとにこにー(番外編)】
はいっ にっこにっこにー!
(帰りたい…)


【キウイさんとほのか】
キウイくんってキウイなの?
え、キウイはキウイですが・・・
そっか、キウイくんはキウイなのかー・・・
あっ、キウイは鳥ですよ!?
(ショエー!なんかデジャブ?!)


ウォンバットさんとまきりんぱな】
もぐもぐもぐもぐ…
もぐもぐもぐもぐ…
凛はそんなかよちんも大好きにゃ〜
いみわかんない…


【フェアリーさんとことうみ】
フェアリーはフェアリーなのに飛べないの…
大丈夫、ことりもことりだけど飛べないよ、お揃いだねー
ことりちゃん眩しい・・・!フェアリーもアイドルとして羽ばたきたいなぁ
羽ばたくならば、やはり特訓です!さぁ行きますよ!


【デビルさんとのんたそ(とウォンバットさん)】
やっぱり焼肉はええなぁ♪
俺も肉好きだ!一番の好物はウォンバット
そっかぁ、大好きなんやね〜
(仲良しさんなんやなぁ)

(なんか寒気がするのよぅ…!)


【カモノハシさんとえりちー】
僕は陰湿なんだなぁ
…私も、一人で全部できる、って思っていたこともあったわ、でもね、一緒に歩いてくれる仲間って素敵よ?
(な、なんだかやりづらいんだなぁ…!)

データベースコピーウィザードを使用してSQL Server 2005 から SQL Server 2008 R2にデータを移行する

データベースコピーウィザードを使用するにあたって、色々問題が出てしまったのでググったり設定変更して実行してみたり、試した結果うまくいったのでメモしておく。
ググったとき、「これをこうする」「これならできた」、と情報が色々あり、以下の記述と異なる場合があるけど、あくまで例、ということで。

概要

データベースコピーウィザードは、SQL Server Management Studio(SSMS)で使用できるタスクのひとつ。

https://technet.microsoft.com/ja-jp/library/ms188664(v=sql.105).aspx
引用:

データベース コピー ウィザードを使用すると、サーバーを停止することなく、データベースとそのオブジェクトをサーバー間で簡単に移動またはコピーできます。

「簡単」かどうかはさておいて、移行作業がひとつの画面でできるのは便利。

使用方法は上記公式ページや以下の参考ページにあるので省略。
http://madogiwatosan.blogspot.jp/2013/02/sqlserver.html
http://www.sunvisor.net/db/copy_wizard

予備知識
  • データベースコピーウィザードは、データの転送を行うSSIS(SQL Server Integration Services)パッケージ作成・実行するタスクなので、呼び出しにはSQL Server Agentが使用される
  • 実行時にエラーが発生した場合、SSISの基礎知識があると原因を調査しやすい(と、思う)

前提

  • 移行元はSQL Server 2005、移行先はSQL Server 2008 R2で、それぞれのサーバーOSに対して同名同パスワードの管理者権限アカウントが存在している
  • SSMSの起動は移行先のサーバーにログインして行う
  • 移行先のSQL Serverはインストール+SP3更新済み、それ以外は未設定
  • SQL Serverの認証は「混合(Windows認証+SQL Server認証)」で、SSMSの操作は各インスタンスいずれもsaアカウントで行う
  • Active Directoryは未使用

事前準備

【移行元サーバー】
・移行対象のDBファイル(mdf, ndf, ldf)があるフォルダを共有にする
 対象のフォルダ右クリック>プロパティから、共有タブを開いて各種設定
 ※共有名は任意/Everyoneフルコントロール
  ⇒ウィザード内で共有のパスを指定するので短くてわかりやすいのがよいやもしれん
・移行対象のDBファイル(mdf, ndf, ldf)のアクセス権をEveryoneフルコントロールにする

#実はこのアクセス権の設定いらないんじゃないだろうか・・・?

【データベースコピーウィザード実行PC】
SQL Server Agentのサービス実行アカウントをOSに作成した管理者ユーザーアカウントにして、サービスを起動しておく
 ⇒ビルトインアカウントではファイルアクセスの段階で失敗する(アクセス拒否というエラーになる)
 ※管理者ユーザーアカウントのユーザー名とパスワードは移行先のサーバに登録されているものと同一である必要がある
  存在しないユーザーを指定していた場合、「ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。」とエラーが表示される
  #これはSSISのジョブの仕組み・・・?
   http://stackoverflow.com/a/2595916
   上の回答で引用している元のページはこれかな
   https://msdn.microsoft.com/ja-jp/library/aa337083(v=sql.105).aspx
引用:

ローカル アカウントを使用した接続
クライアント コンピューターのローカル Windows アカウントで作業している場合、リモート コンピューターの Integration Services サービスに接続できるのは、同じ名前、同じパスワード、および十分な権限が設定されたローカル アカウントがリモート コンピューター上に存在する場合だけです。

でもリモートのSSISに接続してるわけじゃないんだよな・・・?

で、この準備をしておかないと、実行時に以下のようなエラーが出力される
「パス '\\xxx\~\HOGE.mdf' へのアクセスが拒否されました。」

データベースコピーウィザードの実行にあたって

実行前に、移行元移行先ともにSQL Serverのサービスが起動していることを確認する。また、移行作業(SSMSの起動)を行うPCの、SQL Server Agentのサービスも特定のアカウント(前述の管理者アカウント)で開始していることを確認する。
移行対象のユーザーDBがアタッチされていない場合、SSMSとウィザードで検出することができないので注意する。

コピー方法の選択

移行中のユーザーDBの扱いについて、コピー方法を「SQL管理オブジェクトの方法を使用する」にした場合、デタッチせずにコピーすることもできるが、容量やアクセスによっては結構遅くなる、らしい。
#プロセスを生かしたままコピーするから当たり前か
ちなみに、この方法でコピーする場合は共有設定などの事前準備は不要(おそらく、SQL Server経由でデータを移している/そもそもデタッチしないと通常のファイルコピーは不可能なので)

「デタッチ後にアタッチする方法を使用する」の場合、ウィザードの中でDBファイルが存在する共有パスを指定するが、パスを参照できるであろう[...]ボタンが機能してくれないようなので注意。
実際にアクセスできるパスを手入力しても「ネットワークパスが見つかりません」と怒られる。謎。
で、この方法はDBファイルにアクセスするので、ここで前述のアクセス権の設定が絡んでくる。

コピーオプション

このウィザードではオプションで、ユーザーDBに紐付くいくつかのオブジェクトも一緒にコピーができる
使用可能な関連オブジェクト:

  • masterデータベースからのストアドプロシージャ
  • SQL Servereエージェントジョブ
  • ユーザー定義エラーメッセージ
  • エンドポイント
  • SSISパッケージ
  • ログイン

ただし、masterなどのシステムデータベースは移行不可。
https://technet.microsoft.com/ja-jp/library/ms188664(v=sql.105).aspx
引用:

model、msdb、および master の各データベースをデータベース コピー ウィザードでコピーまたは移動することはできません。

紐付くオブジェクトの中に「ログイン」があるが、これはユーザーDBに登録されているログインの情報を元に再作成してくれる、という機能。便利といえば便利だけど、以下の理由によりオススメしない。
・SID、パスワードが引き継がれない(新規作成となるため)
・アカウントが初期状態では無効になっている
・ユーザーDBに関連しないログインは作成されない
⇒後述する「ログインの移行」を参照に、移行元のサーバから生成するのがよさげ

その他データのコピー

ユーザーDBの外部に格納される情報は別途必要に応じて移行する。
「外部の項目」はここ参照。
https://msdn.microsoft.com/ja-jp/library/ms187580(v=sql.105).aspx
⇒見落とし注意なのが、「リンクサーバー」と「ロール」、「データベースの所有権」あたり?

ログインの移行

移行元環境からSIDとパスワードを引き継いだままログインを作成するには、Microsoftが提供しているスクリプトを実行してSPを作成し、それを実行して移行用のクエリを出力させるのが一番手っ取り早い、というか確実。
https://support.microsoft.com/us-en/kb/918992
1)移行元のサーバーに対して上記ページ内のクエリを実行する
2)生成された以下のSPを実行

EXEC sp_help_revlogin

3)出力されたクエリを移行先のサーバーで実行する
※クエリ内のビルトインアカウントやsaユーザーなど不要なログインはコメントアウトするか削除しておく

この作業を行ったタイミングで、コピー済みのユーザーDBのログインとサーバーインスタンスのログインがマッピングされる。(いわゆる「不明なログイン」が解消される)

ロールの付与

インスタンスに付随するログイン(ユーザー)のロールを移行するようには出力されないので、以下のページを参考に移行元のサーバーのログインに付与されているロールを、各ログインに付与するクエリを生成する。
生成したクエリを移行先のサーバーで実行すると、各ログインに対してロールが再設定される。
http://www.sqlservercentral.com/Forums/Topic647463-146-1.aspx

引用:

Declare @Prefix varchar(255)
Declare @tmpstr varchar(MAX)

Set @Prefix = '
exec master.dbo.sp_addsrvrolemember @loginame='''

Set @tmpstr=''

Select @tmpstr = @tmpstr
    + Case When sysadmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''sysadmin''' Else '' End
    + Case When securityadmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''securityadmin''' Else '' End
    + Case When serveradmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''serveradmin''' Else '' End
    + Case When setupadmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''setupadmin''' Else '' End
    + Case When processadmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''processadmin''' Else '' End
    + Case When diskadmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''diskadmin''' Else '' End
    + Case When dbcreator = 1 Then @Prefix + [LoginName] + ''', @rolename=''dbcreator''' Else '' End
    + Case When bulkadmin = 1 Then @Prefix + [LoginName] + ''', @rolename=''bulkadmin''' Else '' End
 From (select convert(varchar(100),suser_sname(sid)) as [LoginName],
		sysadmin,
		securityadmin,
		serveradmin,
		setupadmin,
		processadmin,
		diskadmin,
		dbcreator,
		bulkadmin
	from sys.syslogins
	where sysadmin<>0
	or    securityadmin<>0
	or    serveradmin<>0
	or    setupadmin<>0
	or    processadmin<>0
	or    diskadmin<>0
	or    dbcreator<>0
	or    bulkadmin<>0) L

Print @tmpstr

※地道に調べて手作業で設定、でもいいし、ログインを右クリック>ログインをスクリプト化>CREATE、からロール部分だけ抜粋してもいい。が、上記スクリプトのほうが早いと思われる。

リンクサーバーの生成

リンクサーバーを右クリック→CREATE文の生成でクエリを作成し、移行先のサーバーにて実行。
※hostsファイルを編集する必要があれば、別途対応する

余談

当初、自身の作業PCでSSMSを起動してデータコピーを行おうとしたが、コピー前にエラーが発生していた。SSISの実行アカウントについて試したのは以下のパターン。ログ内容抜粋。

  • ビルトインアカウント(ローカルシステムアカウント)

⇒「"xxx.mdf"へのアクセスが拒否されました」のエラー

  • 移行先に登録がない名称のローカルユーザーアカウント

⇒「ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。」のエラー

  • 移行先に登録がある名称のローカルユーザーアカウント

⇒コピー実行まで進む

【更新終了】ウォンバットさんたち メモ

たまにウォンバットさんたち関連の情報を求めていらしてる方がおられるようなので、役立つかは不明なプチ情報を展開。
個人で収集している情報のため正確ではないので注意。コメントかリプで情報いただければ更新します。

不定期更新

2019/09/22:更新終了しました

●グッズ販売について

公式ショップ(コーナー)「さんたちのおみせ」#とは

公式案内ページはこちら
http://www.sunlemon.co.jp/wombat/santachi/santachi.html

一覧(公式ブログにリンク)

ウォンバットさんたちコーナーを展開しているお店は「キデイランド」さん、「Desk my Style」さんがメインっぽい。上記2店舗をメインに、一部店舗にて少し置いているかも?

その他、一部の以下のお店でも期間限定でコーナー展開していたり、少し仕入れていたり。。

このあたりは、お店に行く前に、そのお店に電話して確認するのがオススメ。ウォンバットさんはお店の在庫や仕入れ状況は把握してない、お店の人じゃないので当たり前なんだけど、ついつい確認とってしまいそうになる。。

近くにお店がない場合はAmazonで「ウォンバットさんたち」で検索して購入するのが一番かも。
サンレモン楽天ショップは終了しているので注意。
あと、少し前は、問い合わせしてからなら駒込の本社で一部購入できたらしいけども、今は会社で小売販売はしていない(公式HPのアクセスマップに注意書きあり)

●限定グッズについて

イベント(ウォンバットさんと写真撮影とか)開催時は、たまに限定商品が発売される。
※先行販売ではなく、その会場限定の商品
池田市(非公認)親善大使のグッズも、イベント時にお店に並んでいることがあるのでチェック。

ボールペンやミラーなどの布製品以外の小物はこういうイベントメインで販売しており、カプセルトイの缶バッジも各イベントごとに限定柄があることが多いので、イベント会場近くに住んでいるお友達に購入を頼むのがベスト。

ツイッター

twitter.com

  • サンレモンスタッフ

twitter.com

20170407追記:
各キャラごとのツイッターが、ウォンバットさんのアカウントに統合されたため、以下のアカウントはなくなりました。。

●関連動画

厚生労働省 依存症啓発事業 動画

youtu.be

→3月末に終了

4コマ漫画動画

www.youtube.com

ウォンバットさんを描いてみよう(デスマイ通信)

www.youtube.com

●LINEスタンプ

第一弾
store.line.me

第二弾
store.line.me

struts2でのラジオボタン動的生成について

yahooの知恵袋眺めてたら、JSPでList<Map>からラジオボタンを動的に作る質問を見かけて、そういえば最近Struts2で似たことやったなぁ、と思って忘れないためにメモらいず。

【やりたいこと】
List<Map<String, String>>のオブジェクトがあった時に、Mapのキーと値でラジオボタンを動的に生成したい。

アクション側はこんな感じ

Map<String, String> userProfile1 = new HashMap<String, String>();
Map<String, String> userProfile2 = new HashMap<String, String>();
// usersはgetter/setter追加
List<Map<String, String>> users = new ArrayList<Map<String, String>>();
userProfile1.put("name", "Mark");
userProfile1.put("age", "20");
userProfile1.put("code", "0001");
users.add(userProfile1);

userProfile2.put("name", "Joseph");
userProfile2.put("age", "18");
userProfile2.put("code", "0002");
users.add(userProfile2);

画面側はこんな

<s:iterator value="users" status="stat">
    <s:textfield name="users" type="radio" value="%{users[#stat.index]['code']}"></s:textfield>
    <s:property value="%{users[#stat.index]['name']}"></s:property>
</s:iterator>


余談:
ListとMapをループする場合はiteratorをネストする

<s:iterator value="users" status="stat">
	<s:iterator>
		<s:hidden name="%{key}" value="%{value}"></s:hidden>
	</s:iterator>
</s:iterator>

ウォンバットさんと作者さんに会いにキデイランド原宿まで行ってきたのよぅ☆

前略

恒例の、ウォンバットさんイベントに行ってきたお話。
最近はグッズは買いに行くものの写真撮影には参加していなかったのだけども、今回のイベントは同日に作者さんのサイン会があるということで、スケジュールを調整、自宅作業の合間を縫って参戦。
今回も例によってソロです。心の中ではウォン友のフェアリーさんと一緒だからいいんだ。。

ところがどっこい

この日は某オンリーイベントの開催日で、どうしても購入したい本とグッズがあったので原宿と蒲田を往復するという強行軍に。。
ざっくりあらわすとこんなスケジュール。

9:40 原宿到着→
開店待機→
10:30 整理券入手→
原宿出発→
11:10 蒲田到着→
会場にて本とグッズ購入→
11:50 蒲田出発→
原宿到着→
13:00 写真撮影会→
サイン会まで待機→
14:00 サイン会

お店が開店を早めてくれたり、快速乗ったりで時間に余裕ができ、写真撮影会まで時間が潰せたので結果的にはいいスケジュールだったやもしれぬ。足パンパンじゃが。
開店の件も含めて、接客対応とか案内とかもろもろ、キデイランドの店員さんたち、めっちゃ親切丁寧ですばらしかった・・・!

f:id:noterr0001:20150517101633j:plain

さてさて写真撮影

前述のイベントについては省略して、撮った写真を上げるよ。

f:id:noterr0001:20150517125927j:plain

お姉さん「ウォンバットさん、ポーズをお願いします!シャキーン!」
シャキーンするウォンちゃん。

f:id:noterr0001:20150517125931j:plain

2ショットを撮る。手元のショッパーはアレです。時間が余ったから寄り道してきたんだ。。

f:id:noterr0001:20150517130216j:plain

そしてサイン会

写真撮影が10分くらいで終わったので、ジョナサンでお昼を食べて時間を潰し、いざサイン会へ。
作者さんがサインを描いている横で、ウォンバットさんのアレが応援してた。途中からデビルさんが頭の上に乗ったんだけどすごいフィットしてて意外と落ちない。すごい。
自分の番になって、サインをお願いした後ウォンバットさんのお腹をなでていたらくすぐったそうに動いてくれて、あまりのかわいさに笑ってしまった。。ぐうかわ。

f:id:noterr0001:20150517141351j:plain

ねんがんの さいんを てにいれたぞ!

f:id:noterr0001:20150517223819j:plain

コアラさん気質なのでコアラさんをリクエスト。
名前を聞かれたときに、「漢字の一と、カタカナのノと、漢字の瀬で・・・」ってお伝えした際に、作者さんが少し「あっ」みたいな反応をしてくださったので、もしや覚えてくださっているのでは!?と思って、「いつもブログとかでネタ描かせていただいています・・・!」と伝えたら「やっぱり!」と返ってきて緊張マックス。
作者さんが覚えててくださったことにテンパリすぎて何を話したか覚えてない。。緊張しすぎでたぶん毛根3割くらい死滅してる。
動揺しすぎて、サインいただいた後階段を降りるときに若干踏み外した。

戦利品とか

写真撮り忘れた。
頼まれたやつとかプレゼント用とかで結構買った気がする。
・アクリルキーホルダー × 7
・おすしさんたち × 2
・缶バッジ × 5
・プリントシール × 1

次回参加は未定。