のえら

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

ウォンバットさんたち3周年おめでとうございますマンガ。そのよん

前回のお祝いマンガからどれだけ空いてるんだって話ですよホント。。
まだまだ続くよお祝いマンガ。
カモノハシさんとデビルさんが全然出せない。。


f:id:noterr0001:20150317182800j:plain
f:id:noterr0001:20150317182819j:plain


以下、メモしてた内容

キウイさんが一番上になったら軽いんじゃないかな
え、大きさそんなに変わらないよ・・・?
いや、ほら、ぱっかーんって
ならないからね?!

ぱっかーん、って考えてたのに某CMが先に出てしまったというね。西尾維新先生のクリエイターの十戒思い出しますな。

SQL Server 2008 R2 でログイン(ユーザ)の一覧をクエリで取得する

SQL Server 2008 R2 のログイン一覧を取得して加工したいんじゃが、コピペできる標準の機能としては存在しないらしい。
http://dba.stackexchange.com/questions/22803/listing-the-existing-sql-server-logins-and-users
クエリをがしがし組み合わせると取得可能っぽい。

http://sqlserverzest.com/2013/08/06/sql-server-get-all-login-accounts-using-t-sql-query-sql-logins-windows-logins-windows-groups/
単純な一覧だけならこっちのほうがシンプルかなー。

サンプルクエリ:

SELECT *
FROM sys.server_principals
WHERE TYPE IN ('S')
and name not like '%##%'
ORDER BY name, type_desc

typeがSのものは、SQLユーザという意味
##が付いているユーザはSQL Serverデフォルトユーザなので除外

sys.server_principals で取得できるカラム:
name
principal_id
sid type
type_desc
is_disabled
create_date
modify_date
default_database_name
default_language_name
credential_id


※ログイン情報の取得について
ログイン情報を取得するビューが2000と2005以降では微妙に異なる。
2000だと「syslogins」
2008だと「sys.server_principals」

システム情報取得についての比較表はこのページが参考になる。
http://mssqlfun.com/2012/08/02/sql-server-2000-system-tables-and-their-equivalent-dmv-in-sql-server-2005/


使用サンプル:
ユーザの既定のDBを移行するスクリプトを出力するクエリ。
⇒saやビルトインアカウントも出力されるので手動で除外しないといけない

SELECT 'Exec sp_defaultdb @loginame=''' + name + ''', @defdb=''' + default_database_name + ''''
FROM sys.server_principals 
WHERE TYPE IN ('S')
and name not like '%##%'
ORDER BY name, type_desc

※2000で同じ出力をする場合は以下のクエリとなる

SELECT 'Exec sp_defaultdb @loginame=''' + name + ''', @defdb=''' + dbname + ''''
FROM master.dbo.syslogins

【未解決】jQueryでinputboxに特定の文字しか入力できないようにする

jQueryでinputboxに特定の文字しか入力できないようにする必要があって、書いてみたコード。

var charList = ["H", "O", "G", "E"];
$(function() {
  $("input.hoge-only").on("keypress", function(e) {
    if ($.inArray(String.fromCharCode(e.which), charList) == -1) {
      return false;
    }
  });
});

キーボードが押されたときにそのキーの文字を取得して、用意してあった特定の文字以外なら入力をキャンセルさせる、という感じ。
やぼったいなー、と思いつつ他の処理も思いつかないのでこれで対応してるんだけども。。うーん。

あと、最初はキーコードで判定しようと思ってやってみたんだけど、ブラウザによって微妙に異なるっぽいのと、fromCharCodeという便利なメソッドがあったのでやめた。


追記(20150309):
正規表現使うとこう?

var charList = /(H|O|G|E)/;
$(function() {
  // 特定のinputboxに入力制限を行う
  $("input.limit-char").on("keypress", function(e) {
    if ( !charList.test(String.fromCharCode(e.which)) ) {
      return false;
    }
  });
});


追記(20150310):
これ日本語入力対応してないな。。

SQL Server 2008 R2 のアップグレードアドバイザでメソッドが見つからないエラー

SQL Server 2008 R2 のアップグレードアドバイザを実行してみたらエラーが大量に出てきた。
が、明らかにアップグレードそのものに対するエラー内容ではない。。
とりあえず解決方法を調べてみた。

■エラー内容
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	ORDERBYORDINALS
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	DROPSYSOBJ
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	OLDSYSTEMTABLES
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	DUMPLOAD
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	HOSTIDRETURN
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	SYSPERFINFO
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	FTPROPS
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	FTCATALOGNAMERESTRICTION
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	INVALIDCHAR
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	MERGE
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	FTCATPROPITEMCOUNT
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	SPCONFIGURE
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	SPHELPTRIGGERNEWCOL
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	NONANSIOUTER
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	XPAGENTPROXY
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	DEPRECATEDSP
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	DBCCCONCURRENCYVIOLATION
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	ORDERBYALIAS
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	OLDDBCC
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	INFOSCHEMATA
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	VIEWFORBROWSE
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	BACKUPRESTORETRANSACTION
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	TRACEFLAGS
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	SYSLOCKINFO
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	LARGECONSTTYPE
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	DBCOMPTLEVEL
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	BACKUPLOG
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	VIEWCHECKOPT
Database Server	"PreUpgrade
(アップグレード前)"	メソッドが見つかりません: 'System.Collections.Generic.IEnumerable`1<Microsoft.SqlServer.Management.SqlParser.Parser.Error> Microsoft.SqlServer.Management.SqlParser.SqlCodeDom.SqlCodeObject.get_Errors()'	FORXMLAUTO

英語版だと「"Database Server","PreUpgrade","Method not found: 'System......」となっている。

■環境

SQL Server 2008 R2 Standard SP3 64bit のアップグレードアドバイザーを実行。
対象は SQL Server 2000 32bit で、対象コンポーネントは「SQL Server」のみ。
認証には sa ユーザを使用。

サイド バイ サイドで移行するにあたって、バージョンに問題ないことは確認済み。
https://msdn.microsoft.com/en-IN/library/ms143694(v=sql.105).aspx

■調べてみた

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/aacfd6d3-2503-4b4e-83c7-acb6be6513d3/error-running-ugrade-advisor-2008r2-on-sql2005-method-not-found?forum=sqlsetupandupgrade
どうやら SQL Server 2008 R2 SP1 の Feature Pack をあてると解決するらしい。

ダウンロードはここから
http://www.microsoft.com/ja-JP/download/details.aspx?id=26728
SqlUA.msi をダウンロードしてサーバで実行する。
SP3 あたってるし、ないだろー、と思いつつ再度アップグレードアドバイザを実行してみたら、上記のエラーが消えた。。マジか。

SP3 にアップグレードアドバイザは含まれていないのだろうか・・・?

Cygwinのアレやコレ

Cygwinに関するTIPSがたまってきたのでメモする。
全部Windows Server 2008 R2で動作確認済み。

Cygwinのバージョンを確認する

Cygwinを起動し、以下のコマンドを実行する。

uname -a

パッケージ版であれば、以下のコマンドでも確認可能

cygcheck -c cygwin

参考URL:
http://cygwin.com/faq/faq.html#faq.what.version

Cygwinの削除

「プログラムの一覧と機能」に表示されない(アンインストーラがない)ので、手作業でファイルとレジストリを削除する必要がある。
参考URL:
http://cygwin.com/faq/faq.html#faq.setup.uninstall-all

まるっと引用:

Setup has no automatic uninstall facility. The recommended method to remove all of Cygwin is as follows: 

1.If you have any Cygwin services running, remove by repeating the instructions in http://cygwin.com/faq/faq.html#faq.setup.uninstall-service for all services that you installed. Common services that might have been installed are sshd, cron, cygserver, inetd, apache, postgresql, and so on. 

2.Stop the X11 server if it is running, and terminate any Cygwin programs that might be running in the background. Exit the command prompt and ensure that no Cygwin processes remain. Note: If you want to save your mount points for a later reinstall, first save the output of mount -m as described at http://cygwin.com/cygwin-ug-net/using-utils.html#mount. 

3.If you installed cyglsa.dll by running the shell script /usr/bin/cyglsa-config as described in http://cygwin.com/cygwin-ug-net/ntsec.html, then you need to configure Windows to stop using the LSA authentication package. You do so by editing the registry and restoring /HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa/Authentication Packages back to it's original value of msv1_0, and then rebooting. 

4.Delete the Cygwin root folder and all subfolders. If you get an error that an object is in use, then ensure that you've stopped all services and closed all Cygwin programs. If you get a 'Permission Denied' error then you will need to modify the permissions and/or ownership of the files or folders that are causing the error. For example, sometimes files used by system services end up owned by the SYSTEM account and not writable by regular users. 

The quickest way to delete the entire tree if you run into this problem is to change the ownership of all files and folders to your account. To do this in Windows Explorer, right click on the root Cygwin folder, choose Properties, then the Security tab. If you are using Windows XP Home or Simple File Sharing, you will need to boot into Safe Mode to access the Security tab. Select Advanced, then go to the Owner tab and make sure your account is listed as the owner. Select the 'Replace owner on subcontainers and objects' checkbox and press Ok. After Explorer applies the changes you should be able to delete the entire tree in one operation. Note that you can also achieve this in Cygwin by typing chown -R user / or by using other tools such as CACLS.EXE. 

5.Delete the Cygwin shortcuts on the Desktop and Start Menu, and anything left by setup-x86{_64}.exe in the download directory. However, if you plan to reinstall Cygwin it's a good idea to keep your setup-x86{_64}.exe download directory since you can reinstall the packages left in its cache without redownloading them. 

6.If you added Cygwin to your system path, you should remove it unless you plan to reinstall Cygwin to the same location. Similarly, if you set your CYGWIN environment variable system-wide and don't plan to reinstall, you should remove it. 

7.Finally, if you want to be thorough you can delete the registry tree Software\Cygwin under HKEY_LOCAL_MACHINE and/or HKEY_CURRENT_USER. However, if you followed the directions above you will have already removed everything important. Typically only the installation directory has been stored in the registry at all. 

ざっくり書くと、関連サービス止めてフォルダとレジストリ削除という。

■homeディレクトリ配下のユーザフォルダを削除する

WindowsGUIにて home/[Windowsアカウント名] を削除しようとしても、「許可が必要です」というような警告が表示され、再試行しても削除できなかった。
※他のユーザが使っているアカウントだったのでアカウントを切り替えての作業ができなかった
(GUIからでは)プロセスが使用中、という警告によりアクセス権の変更も不可能。
また、Cygwinを起動して rm コマンドで削除しようとすると、Permission denied エラーになってしまう。
対象のフォルダおよびファイルは、cygwin起動時に新規で作成されるものを含めた以下の6つ。
・home/[username]
・home/[username]/.bashrc
・home/[username]/.bash_profile
・home/[username]/.inputrc
・home/[username]/.profile
・home/[username]/.bash_history

このとき、cygwinでpermissionを確認してみると???になっていた。

解決策:
http://stackoverflow.com/questions/3739477/undeletable-file-in-cygwin
Windowsコマンドから、いったん所有者を変更することで、削除が行えるようになる

手順:
1.コマンドプロンプトを「管理者権限」で起動する
2.所有者を変更するコマンドを実行

takeown /r /f DRIVE:\PATH

成功、となっていれば所有者がAdmin(コマンドプロンプトを実行したユーザ)になっている
3.指定したユーザにアクセス権を付与する
この後フォルダ削除を行うため、現在ログインしているアカウントに対してアクセス権を追加する

icacls DRIVE:\PATH /grant USERNAME:F /T

※コマンド補足
USERNAME ユーザアカウントに、DRIVE:\PATH より下にあるすべてのファイルとサブディレクトリに対してフルアクセス権を付与する
4.コマンド実行後、上記でアクセス権を追加したユーザアカウントでフォルダの削除を行う

ローカルセキュリティポリシーで怒られたでござる

Windows Server 2008 R2にて以下の作業を行おうとしたらエラーが出たのでメモらいず。

セキュリティの設定>ローカルポリシー>ユーザー権利の割り当て
「サービスとしてログオン」にユーザを追加しようとしたらエラー発生
※追加しようとしたユーザは自分自身

エラー内容:
拡張エラーが発生しました。保存に失敗しました Local Policy Database

ローカルセキュリティポリシーを「管理者権限で実行」で起動したら変更できた


権限が足りなかった??

ファイアウォールの(受信)規則をコマンドで追加したい

Windowsファイアウォールの受信規則の作成をコマンドでやりたいなぁ、と思って調べたり試したりしたのでメモしておく。Windows 7 で実行できることを確認済み。

参考にしたページ:
http://www.atmarkit.co.jp/fwin2k/win2ktips/1035advfwall/advfwall.html

コマンド:

netsh

advfirewall

firewall

add rule name="●●接続制限" dir=out action=block protocol=any remoteip=xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx description="●●への接続を制限する"

作成した規則を無効にするときは以下のとおり

set rule name="●●接続制限" new enable=no

上記コマンドだと、「●●接続制限」という名前の規則すべてに対して実行されるので、さらに条件を付けたい場合は「new」オプションの前で指定する。
ヘルプ内の注釈にもあるけど、new キーワードの後に記述した値が更新されるので、newが抜けていないか、newの前に設定内容を書いていないか確認すること。

規則を削除するときは以下のとおり

del rule name="●●接続制限"

これも「●●接続制限」という名前の規則すべてを削除するので、必要があればプロトコルIPアドレスを指定すること。

補足:
上記 add rule で指定しているオプションの内容は以下のとおり
name=<文字列>
 規則の名前
dir=out
 送信に対しての規則
 受信の場合は in にする
action=block
 接続をブロックする
 許可の場合は allow にする
description=<文字列>
 規則の説明
remoteip=<IPv4 アドレス>
 リモートIPアドレスを指定する
 送信先のIPアドレスと一致した場合に規則が適用される
 複数ある場合はカンマで区切る

そのほかは add rule ? か set rule ? コマンド、またはファイアウォールのプロパティで確認するヨロシ。

おまけ:
batとかで実行したい場合はnetshからコマンドくっつけるだけ
netsh advfirewall firewall add rule name="●●接続制限" dir=out action=block protocol=any remoteip=xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx description="●●への接続を制限する"