布団が俺を呼んでいる

丘山大一のぶろぐ

プロジェクトマネージャ 第5週目 体調不良の罠

年末は飲み会が増えることは分かっていたので、それに合わせて勉強スケジュールを組んでいたのに、
頭痛 + 目の痛み
で勉強どころか日常生活対応で手いっぱいになってしまった。
うーん、体が丈夫なわけではない……というより貧弱なので、体調不良があることもスケジュールに組み込むべきであった……。
感覚的にですが、月4週よりは3週として勉強スケジュールを組んだ方がよさそうですね。

プロジェクトマネージャ 第4週目 「全然勉強できんかった……」

師走になると飲み会、付き合いが増えるよね……。
飲み会に参加しながら、予定を気にしつつ、飲み会の企画しながら、年末年始の計画調整と、年賀状刷り。
う~~~~ん。

あと今更ながらガンダムビルドファイターズ見た。
面白かった。戦闘シーンで、ちょっとパンチ多すぎな気もしたけど。
モビルスーツの格闘戦はビームサーベル→キック→ここぞというところでパンチ が好き。
深い理由はない。なんとなく。

ちなみに、アニメは完結後、概ねレンタルで旧作扱いになってから纏めて見る派。
放映中だとネットに情報が溢れすぎてて、どうしてもネタバレが目に入ってしまい、面白味が薄れる。
情報の氾濫が沈静化して、皆が違うものに気を取られ始めたころに、事前情報無しで見ると素直な気持ちで見られる。
アニメが面白いかどうかはネットや回りの評価じゃない、自分の「曇りなき眼で見定め、決める」のだ。

あれ、アニメ話になってしまった……。


ガンダムビルドファイターズ Blu-ray Box 1 [スタンダード版] <期間限定生産 2015/03/25まで>

新品価格
¥38,146から
(2015/12/21 20:55時点)

PowerShell 配布したスクリプトを管理者権限で実行してもらう場合のパスの取り扱い

PowerShellスクリプト自体はbatファイル作って-ExecutionPolicyで実行させれば終わり。
ただ、batを管理者権限で実行させると、スクリプト自体がデスクトップに置かれた場合にパスを取得するのが微妙に面倒くさい。

まず起動用のbat自体について。同階層にあるスクリプトを起動する場合。
powershell -ExecutionPolicy RemoteSigned -File %~dp0%スクリプト名.ps1
%~dp0% をつけて、同階層にあるスクリプトのパスを明示して実行するようにする。

PowerShell 処理の中では、実行しているスクリプトの場所は下記でとれる。
$PSScriptRoot
ネットでは $MyInvocation.MyCommand.Path を使う方法をよく見たけど、私の環境では何故か動かなかった。
まあ原因はともかく$PSScriptRootでとる方が短く済んで簡単。



【改訂新版】 Windows PowerShell ポケットリファレンス

新品価格
¥3,002から
(2015/12/3 23:18時点)

プロジェクトマネージャ 第3週目 「学習時間確保の悩み」

本丸の午後試験対策以前に、堀である午前問題を乗り越えられないことにはしょーがない。
というわけで、知識問題用に色々よみつつ、午前問題を解きなおし。
過去問をやってみたところ、一応70点台はとれた。が、まだまだ足りない(80点台後半は欲しい)。
こちらはちょっとずつ進めることにする。

課題となっているのは、やはり学習時間。
学習が遅れていること・経験不足などを加味して、ざっくり計画で最低週16時間ほどの勉強時間が必要。
平日月~金で合計4時間程度、土日でそれぞれ6時間程度勉強する必要がある。
また、知識補充系は平日・空いた時間でやればいいとしても、問題演習なんかはまとまった時間でやりたい。
つまり土日にやるしかないのだが、土日には予定が入ることが当然ある。
そんな時は問題演習ができなくなってしまう。
定期的に問題演習をしないと成長具合や弱点が掴めなくなるので、次の一週間の学習が非効率になるおそれがある。学習時間が足りない、といっているのに効率を落とすのは致命的。

また、学習に追われると、今度は本業のプログラミングへの学習がおろそかになる。
事実、今週試そうと思っていたことが半分ほどできていない。

う~~む。やはり長期休暇や有休を駆使していかなければ対応できないのだろうか……。
早くも悩みが出てきてしまった。


情報処理教科書 プロジェクトマネージャ 2016年版

新品価格
¥3,110から
(2015/11/29 19:19時点)

PowerShell Invoke-Sqlcmd で SQLServer にアクセスした後にセッションが残っている?

セッションかどうかわかりませんが、何か掴んでいるんだろうなあ、と思いつつも未調査。
環境をパッと作れなかったので……。
ただの備忘記事ですね。
失敗したのは、下記のような作業。

①Invoke-Sqlcmd データベースにアクセス
②とってきたデータを元に処理
③バッチファイル経由でデータベースをDrop
 →タイムアウト

下記のようにしたら通るようになった。
超ムリヤリな方法。
①Invoke-Sqlcmd データベースにアクセス
②とってきたデータを元に処理
③Invoke-Sqlcmd マスターデータベースにアクセス
④バッチファイル経由でデータベースをDrop

これはダメな対応ですな……。



【改訂新版】 Windows PowerShell ポケットリファレンス

新品価格
¥3,002から
(2015/10/3 12:43時点)

プロジェクトマネージャ 第2週目 「最初の一歩」

勉強の仕方がよくわからないので、とりあえず買った本を信じてやっていくことにしました。
下手に自分で考えるより、まずは先人の知恵をお借りするのです。
さて、試しに過去問やってみそ、とあったので解いてみたのですが……

午前1:6割くらい
午前2:4割くらい
午後1:見当違いのことを書く
午後2:そもそも全然書けない

わー、絶望的ー。
まずは基礎知識を身につけねばならないようです。


情報処理教科書 プロジェクトマネージャ 2016年版

新品価格
¥3,110から
(2015/11/29 19:19時点)

メモ帳のタイムスタンプ記述機能

Windows標準のメモ帳、先頭行に
「.LOG」
と入力すると、本文中にタイムスタンプがつくようになります。
ウィキペディアにも載っています。

全然知らんかった……

マルマン A7 メモ エムメモ ブルー マイクロミシン目入り N595-02

新品価格
¥80から
(2015/12/3 23:14時点)

プロジェクトマネージャ 参考書を買ってきました

プロジェクトマネージャ の参考書を購入してみました。
前々から興味はありましたが、別にプロマネをしているわけではありません。
今回購入に至った経緯は単純です。
職場の仲間が段々と退社しつつあり、その��由の大半が「プロジェクトの炎上」に起因しているように思えてきたからです。
今自分が関わっているプロジェクトは炎上していませんが、それはただの幸運であり、いずれ自分の身にも降りかかってくるのは必定です。
よって、火事になるまえに、消化と予防を勉強していこうと思ったのでした。

プロジェクトマネジメントそのものを体系立てて勉強したことはありませんし、そもそも難しいことで有名な試験です。
慌ててやることなく、一歩ずつ進めていこうと思います。

あと、ここに書くことで自分に発破をかけてみる、という意味もあったり。


情報処理教科書 プロジェクトマネージャ 2016年版

新品価格
¥3,110から
(2015/11/29 19:19時点)

IISのお勉強 WordPressのインストール その3

ISを見ながらIISのお勉強 その3です。

さて、前回までで、すでにWebページは外部にはつながるようになっています。
が、管理画面をいじると、WordPressの更新ができなくなっています。
正確には、WordPressの管理画面から更新をかけようとすると、FTP接続による認証等を求められます。
ここで、FTPを開けるべきか? と思いましたが、調べてみるとWP-Config.phpに一行追加するだけでOKなようです。
というわけでさくっと追加します。
Set-Location 'C:\inetpub\wwwroot\wordpress'
Add-Content .\wp-config.php "define('FD_METHOD','direct')"
これでFTP認証を求められなくなります。

さあ、更新・・・・・・と思うと、今度は
「いくつかのファイルをコピーできないため、最新版のインストールができません。これはたいていの場合、ファイルのパーミッションが適切でないことが原因です。」のエラーが。
こちらも調べてみるとパーミッション、もといファイル・フォルダ権限が問題のようです。
基本的には一つ一つのファイル、フォルダ毎に権限を設定していくべきですが、どうやら時々対象となるファイル、フォルダが変わるようです。毎回毎回調べて一つ一つ設定していくのは一苦労です。
そこで、マズイやり方ではありますが、アップデートの最中だけ、全ファイル・フォルダに書き込み権限を振ることにします。
下記のコマンドで、WordPress以下にUSERSに書き込み権限がくっつきます。

$fPath = "C:\inetpub\wwwroot\wordpress"
$acl = Get-Acl $fPath
$uName = 'USERS'
$fControl = [System.Security.AccessControl.FileSystemRights]::Write
$iFlags = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit,[System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$pFlags = [System.Security.AccessControl.PropagationFlags]::InheritOnly
$type = [System.Security.AccessControl.AccessControlType]::Allow
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($uName,$fControl,$iFlags,$pFlags,$type) 
$acl.SetAccessRule($rule)
$acl | Set-Acl $fPath

これでアップデートできるようになります。

アップデート完了後は、すぐに下記コマンドで書き込み権限を外します。
上記コマンドとの違いは、$rule変数に渡す引数が空(NULL)になっていること。
(※本当は書き込み権限を削除したかったのですが、やり方わからず・・・・・・)
$fPath = "C:\inetpub\wwwroot\wordpress"
$acl = Get-Acl $fPath
$uName = 'USERS'
$fControl = [System.Security.AccessControl.FileSystemRights]::Write
$type = [System.Security.AccessControl.AccessControlType]::Allow
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($uName,$fControl,,,$type) 
$acl.SetAccessRule($rule)
$acl | Set-Acl $fPath

これでまずは安心。
プラグインやテーマの拡張についてはまだ調べていませんが、まあ概ねこれでいける気がします。
いけなかったらごめんなさい。

今回のまとめ。
うむ、シャルが可愛い。

Windows PowerShell 実践システム管理ガイド2版 (TechNet ITプロシリーズ)

新品価格
¥4,320から
(2015/10/21 00:21時点)

Infinite Stratos Complete Collection [Blu-ray] [Import]

新品価格
¥4,940から
(2015/10/21 00:25時点)

IISのお勉強 WordPressのインストール その2

前回の続き。
ISを見ながらIISの設定をしていきます。

まずはWordPressにアクセス。
ここまでデフォルトなら、
http://XXX.XXXX.XXX.XXX/wordpress
(XXX.XXX.XXX.XXX はサーバのIPアドレス)
必須項目を入力していきます。
・・・・・・WordPressについては、なんとゆーか以下略。
あんまり書けることがありませんw
とりあえず最低限だけ設定。

さて、外部公開するためには、グローバルアドレスが必要となります。
私の環境はDynamic DNS を利用しているので、ご存じDice先生の設定が必要です。
まずはダウンロード。
$client = New-Object System.Net.WebClient
$client.DownloadFile("http://www.hi-ho.ne.jp/cgi-bin/user/yoshihiro_e/download.cgi?p=dice159_msi", "E:\Dice.msi")

さて、使い方を調べるためにとりあえずヘルプを引きます。
E:\Dice.msi -?
ふんふん。
なんとなくわかった気になったところでインストール。
E:\Dice.msi /quiet /passive /promptrestart

続いて設定します。
DIce 自体は下記に入っています。
C:\Program Files (x86)\Sarad\DiCE\dice.exe
なのですが・・・・・・さて、ここで非常に困ったことが起きます。
といのも・・・・・・Dice for Windows にはコマンドラインから設定を制御する機能が無いようです(汗)
というより、正確にいえばサービスとして起動できるのは有償版です。
無償版ではできないようです。
以前 CentOS で設定した時は逆にコマンドラインでしか設定していなかったので油断していました(汗)
設定自体は先ほどのインストールフォルダdice.datに入っているので、それを直接制御すればよいでしょうが、それでは設定の柔軟性に欠けます。
また、Diceがアップデートした場合(近年されていないようですが)に対応できなくなってしまいます。
残念ですが、ここはGUIで設定するか、他のマシンで設定したファイルをコピーすることで対応します。
「説明」に適当な名称、
「サービス」から使用しているサービスを、
「ホスト名」「ドメイン名」「ユーザー名」「パスワード」に上記サービスで登録した内容を設定。
スケジュールは任意でOKだと思いますが、あんまり頻繁にやっても仕方ないので、
「周期的」-「1時間毎」
を設定しておきます。
まあこのあたりは利用しているサービスとの兼ね合いと好き好きだと思います。
ServerCoreでやっている場合は、別サーバにDIceを登録してしまって、そちらでGUI制御してしまった方が速く分かりやすいと思います。

さて、ここまでできたら、サーバ側の基��設定はほぼ終わりです。
あとはルータ側でポートフォワーディングを設定。
ここも、ルータによって設定が異なるので以下略です。

諸々設定が完了したら、下記Webサイトで設定が正しいか検証できます。
http://www.cman.jp/network/
外部のWebサイトを使うのは、自分のローカルマシンのブラウザからだとうまく名前解決できなかったり、Hostsに書いてある設定で名前解決してしまったり等して、正しく検証できないからです。
やり方は簡単で、ページ左のHTTPチェックを開き、URLを入力して「ホームページ表示確認」を実行します。
おお、なんて便利。

今回のまとめ。
やっぱりシャルが可愛い。

Windows PowerShell 実践システム管理ガイド2版 (TechNet ITプロシリーズ)

新品価格
¥4,320から
(2015/10/21 00:21時点)

IS<インフィニット・ストラトス>2 (初回生産版) 全7巻セット [マーケットプレイス Blu-rayセット]

新品価格
¥29,989から
(2015/10/21 00:24時点)

布団が俺を呼んでいる | All posts by okayama

布団が俺を呼んでいる

丘山大一のぶろぐ

ブログの移行のご案内

長らくご愛顧いただきました当ブログですが、この度移行することにいたしました。

移行先



なぜ移行するのか

このブログ、BlogEngine.NETを使っていたのですが、正直使いにくいところがありました。
ただ個人的な要件があり、それらを満たすものがコレくらいしか見つからなかったということもあり、なんだかんだ だましだまし使ってまいりました。
ですがさすがに限界が来ており、この度Github pagesを利用したブログを開設することにしました。

専用のブログサービスを使わず、Github pagesを使う理由ですが「手元のソースをプッシュして公開する」という形にしたかったからです。
ブログサービスに乗せてしまうと、どうしても記事や構成がサービスに依存してしまい、再度移行したいときに不便そうなのと、サービスの方針に振り回されてしまうのが怖いので、それを避けたいという理由があります。
まあそれはGithub pages を使っても同様なのですが、影響は最小限ですむかなーと考えております。


このブログの今後について

削除する予定は当面ありません。
というより、記事を出力できなかったので移行できない=>削除もできない の流れです。
がっでーむ。
時間が経てば考慮しますが、すくなくとも一年やそこらで削除するつもりはありません。


別ブログで、ということになりますが、今後ともよろしくお願いいたします。

PowerShell ディスクサイズの使用状態をログで吐き出したい

自分メモ。
ディスクサイズの使用状態を日時のログで吐き出す。
実際使う時はタスクスケジューラあたりで呼び出す。

Get-PSDrive -Name C | Select-Object @{Name='datetime'; Expression={Get-Date -Format('yyyy/MM/dd')} } , Used, Free | ConvertTo-Csv -NoTypeInformation |Select-Object -Skip 1 |Out-File -FilePath 'Drive_C.txt' -Append

もっと簡単なやり方があったはずだが、「Windows Server 2008R2で動く」という本来あってはならない要件があり、試行錯誤してた結果こんなんを書いていた。


SSMSで既定の言語を表示した結果とSQLで表示した時に結果が違うことがある

SSMSの表示が正しくないとき(時々あるよね)案件。


問題

SSMSでログインのプロパティを覗いていたら、既定の言語が「Arabic」になっているものがあった。


Arabicかー、珍しいなー、と思ったが引っかかったのでSQLを投げて確認。

select name, default_language_name from sys.server_principals


う~ん、ひとつだけ浮いている方がいますね。
一人だけ素のenglish。ハイ、これがArabicだったログインです。

そしてログインを作っているSQLの中身を見てみたら既定のデータベースを「english」で指定していました。
多分us_englishで指定すべきところをenglishで指定した結果、ログインは作成されたけど言語の一覧にないのでプロパティ画面のコンボボックスがセット処理が正しく走らず、一番上の「Arabic」になったと思われます。
https://docs.microsoft.com/ja-jp/sql/relational-databases/system-compatibility-views/sys-syslanguages-transact-sql?view=sql-server-ver15
※記事投稿時点ではリンク先の表示が崩れてます

ちなみに、他のログインは既定の言語を指定しなかったのでデータベースの規定値を引っ張ってきて正しく設定された模様。


似たようなバグもあったけど

最初、コレかな?と思ったSSMSのバグもあったけどタブン違う。
* https://docs.microsoft.com/ja-jp/sql/ssms/release-notes-ssms?view=sql-server-ver15
* https://feedback.azure.com/forums/908035/suggestions/38236363


教訓

経験上、既定のデータベースの表示がおかしくなることもあるよ!
SSMSは便利だけど、疑問解消・原因調査の際はSQLで!

VBAのプロシージャ呼び出しの括弧のまとめ

VBAでプロシージャ呼び出しの際、引数に括弧をつけるのかつけないのか・つけたらどうなるのかが異様に分かりづらかったので真面目に調べました。
というか自分の整理のためにまと���ました。
参考にさせて頂いたのは下記ブログです。
先人の知恵はありがたや~


VBAプロシージャの引数の基本

  • 基本は参照渡し
  • 戻り値を使わないプロシージャ呼び出しは括弧不要
  • 戻り値を使うプロシージャ呼び出しは括弧が必要
  • Call を使う時は括弧が必要
  • Call を使った時は参照渡し
  • 個別に括弧をつけると値渡し


実際の呼び出し


下記のhogeとhoge2という二つのFunction プロシージャの呼び出しパターンとその時の引数の渡し方で試します。
実際にコピペして動作させた方が分かりやい(と思います)。

Option Explicit

' 呼び出すFunction

Function hoge(x As Integer) As Integer
  x = x * 2
  hoge = x + 1
End Function

Function hoge2(x As Integer, y As Integer) As Integer
  x = x * 2
  y = y * 2
  hoge2 = x + y
End Function

' 以下、呼び出し側

Sub fuga()
  Dim a As Integer
  Dim b As Integer
    
  ' 戻り値を使用しない・括弧をつけないで呼び出す。引数は参照渡し。
  a = 3
  hoge a
  MsgBox a ' message 6
  
  ' 戻り値を使用しない・括弧をつけて呼び出す。個別に括弧をつけているので引数は値渡し。
  a = 3
  hoge (a)
  MsgBox a ' message 3
   
  ' Callで呼び出す・引数は参照渡し。
  a = 3
  Call hoge(a)
  MsgBox a ' message 6
  
  ' Callで呼び出す・個別に括弧をつけているので引数は値渡し。
  a = 3
  Call hoge((a))
  MsgBox a ' message 3
    
  ' 戻り値を使用する。引数は参照渡し。
  a = 3
  b = hoge(a)
  MsgBox a ' message 6
  MsgBox b ' message 7
  
  ' 戻り値を使用する。個別に括弧をつけているので引数は値渡し。
  a = 3
  b = hoge((a))
  MsgBox a ' message 3
  MsgBox b ' message 7
        
  ' Callで呼び出す・引数内部で計算してしまっているので……これは値渡し?
  a = 3
  b = 2
  Call hoge(a + b)
  MsgBox a ' message 3
  MsgBox b ' message 2
  
  ' 戻り値を使用しない・括弧をつけないで呼び出す。引数は参照渡し。
  a = 3
  b = 2
  hoge2 a, b
  MsgBox a ' message 6
  MsgBox b ' message 4
  
  
  ' 戻り値を使用しない・第一引数は括弧をつけているので値渡し。・第二引数は括弧をつけていないので参照渡し。
  a = 3
  b = 2
  hoge2 (a), b
  MsgBox a ' message 3
  MsgBox b ' message 4
    
  ' Callで呼び出す・引数は参照渡し。
  a = 3
  b = 2
  Call hoge2(a, b)
  MsgBox a ' message 6
  MsgBox b ' message 4
  
  a = 3
  b = 2
  ' Callで呼び出す・第一引数は括弧をつけているので値渡し。・第二引数は括弧をつけていないので参照渡し。
  MsgBox a ' message 3
  MsgBox b ' message 4
  
  ' hoge2(a, b) ' 戻り値を使わないのに括弧をつけているので構文はエラー
  ' Call hoge2 a, b  ' Callで呼んでいるのに括弧がないので構文エラー
  
End Sub


ハマりそうなところ


個別に括弧をつけた場合、値渡しになるわけですが、これプロシージャの定義がByRef でも上書きされるんですよね。
これは参考元の方に書かれていますが、単に先に評価しているからなのでしょうね。

という理屈は分かった気になりましたが、やっぱり分かりづらいです。


2020/2/19 :間違いがあったので修正

.Net Core で GetObject したいのですが

どうすればいいざんしょ?


経緯

.Net Core がWPF 対応したことだし、手元の古いアプリの移行可能性を検討しようと思い立つ。
で、そのアプリはサードパーティのComライブラリを呼び出している。
で、既存の動きに合わせてMicrosoft.VisualBasic.Interation からGetObjectを呼び出そうとしたら……あれ、無い?
ドキュメントにあたると、たしかに.Net Core の記述がない。


調査する

でがらし会で情報を持っている人募集。で、この人https://twitter.com/kowillmから情報がくる。

実装自体は進んでいるような感じ。
ただ、Not Tested ともある通り、完成していない感じはある。

実装もある程度進んでいる雰囲気はある。

しかし手元の.Net Framework の dllの中身と比較すると実装が異なる、というか足りない感じ。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.VisualBasic.dll


さてどうしよう

VisualBasic.dll の実装自体は(こう言ってはなんですが)意外と活発に見えます。
しかし最新のパッケージが2018/12/3と一年以上前であり、リリースできる状態までこぎつけていないのか、あるいはリリースを一時中断する理由があるのか判別がつかない。
というのも、ない理由が「仕掛りなだけ」ならいいのですが、「他のdllにメソッドを移植した」「.Net Core では別実装を検討中」「問題が見つかった」「.Net Coreで実装すべき機能ではない」などの理由だと(検証的に)困っちゃうんですよね。
.Net Core へのVB関連の取り組みがあまりされていない感じもあり、またWinFormに依存する部分は含めない的な方針もあるようで……Windowsのための実装のcom系に使われる機能はどういう取り扱いになるのか不透明&不透明。
Marshal.GetActiveObject がないから、というのも理由の一つな気もしますが。

無ければ作ればいいじゃないの精神で、必要な部分だけ引っこ抜いて個別実装してもいいのですが、「まだ無い」理由が分からないと徒労に終わる可能性も高いので、なかなか踏ん切りがつきません。
該当部分は.Net Frameworkで作れ! が正しいとも考えられますし。

どういう状況なんでしょ。

コミックマーケット C97 参加はしないけど書いたよ

宣伝宣伝。

今回は行きませんが、原稿は書きました。
サークル代表が頒布しているはず。

火曜日 南地区”リ” ブロック 26a
だそうです。

よろしくお願いします。

Oracle DBリンク関連の情報を取得

自分メモ。
DBリンクを呼び出す処理を見ることになったのですが、機能が独特でよく分からん。
基本的にデータベース同士を密結合する機能なのであまり使うべきではないかな、という感じもしている。

色々取得


1.DBリンクの取得

SELECT * FROM ALL_DB_LINKS

2.DBリンクのパッケージ確認

SELECT * FROM ALL_OBJECTS@DBリンク名 WHERE OBJECT_TYPE = 'PACKAGE'


3.パッケージの中身を確認

SELECT TEXT FROM all_source@DBリンク名 WHERE NAME = 'パッケージ名' ORDER BY LINE

PowerShell 二行を一行にまとめる

自分メモ。
うまく言えないんですが、
aaa
bbb
ccc
ddd
というテキストを
aaa bbb
ccc ddd
に変換してファイル出力する感じ。


こんなん

$originalFilePath="hogehoge.txt"
$filePath = "fugafuga.txt"
[int]$count=0
Get-Content $originalFilePath | ForEach-Object {
  $count+=1
  If($count % 2 -eq 0){
    Write-Output($_) | Out-File -FilePath $filePath -Append -Encoding utf8
  }else{
    Write-Output($_ + "`t") | Out-File -FilePath $filePath -Append -NoNewline -Encoding utf8
  }
}

管理者ユーザなのにexeファイルのファイル操作できなくなる現象

exeファイルのプロパティのセキュリティにアクセスできなくなる現象とも。
実害が出るレベルではまりました。


現象

ファイルを削除しようとすると、
「このファイルを削除するには管理者の権限が必要です」→「続行」→
「この操作を実行するアクセス許可が必要です」→「再試行」→
以降ループするので「キャンセル」せざるをえなくなる

リネームしようとすると、
「このファイルの名前を変更するには管理者の権限が必要です」→「続行」→
「この操作を実行するアクセス許可が必要です」→「再試行」→
以降ループするので「キャンセル」せざるをえなくなる

実行しようとすると、
「指定されたデバイス、パス、またはファイルにアクセスできません。これらの項目にアクセスするための適切なアクセス許可がない可能性があります」
で、メッセージ内容から「セキュリティが変なのか……」と考えファイルのプロパティからセキュリティを
開くと、たしかに権限がふられていない。ファイルの所有者の所有者も見えない。
しかし、権限をふろうとしても権限をふれない。

どういうこっちゃねん。


原因

他のユーザがexeファイルをロードしている状態で、さらに別ユーザがexeファイルを削除していたため。


原因詳細

エクセルファイルなんかで「別のプログラムがファイルを開いているので操作を完了できません」を見ることがあった人も
多いと思いますが、その複雑版です。共有フォルダに配置した、複数のユーザがたたくexeファイルで起きました。
登場人物は下記。

  • Aユーザ:exeファイルを実行していた人
  • Bユーザ:exeファイルを先に削除した人
  • Cユーザ:管理者であり、exeファイルを削除したい人

Aユーザは、Cユーザのマシン内の共有フォルダに入ったexeファイルを実行しています。起動後なので、exeはロードが終わった状態です。
続いて Bユーザは、そのexeファイルを削除します。Aがexe実行中でもファイル削除できます(Bのエクスプローラからは消える)
最後にCユーザが共有フォルダに入ったexeファイルを削除を実施しますが上記「現象」にはまり何もできなくなります。
Cマシン内の共有フォルダにあるexeは、Bによって削除された亡霊みたいな状態。


対応

exeにアクセスしている人を強制的に全部切断すれば解消されます。
というか先に切断しておきましょう。


泣き言

これWindowsのバグでは、という気がしなくもない。けど何かしら事情があってこうなっている気もする。

WSL でGitbucket環境構築

ちょっとした個人用リモートリポジトリが欲しい時は、Gitbucketを構築しています。
Gitbucketは動かすだけならjavaさえあればよいので、Windowsでもお手軽です。
が、逆にいえばjavaを入れなければなりません。
これが嫌だなー、という人は仮想環境を作るなりDockerで構築するのがよいと思うのですが、今回はWSLでやっていきます。

理由:現在使用中の環境のうち一つで、Dockerサービスが動かなくなったので(泣)

手順

使用環境はストアから入手したUbuntu。

まずはJavaをインストール。
sudo apt install default-jdk

インストール完了後、バージョン表示してインストール確認。
java -version

Gitbucketを入れるためのディレクトリを作成。
sudo mkdir /opt/gitbucket

Gitbucketをダウンロード。
sudo wget https://github.com/gitbucket/gitbucket/releases/download/4.32.0/gitbucket.war -P /opt/gitbucket

さて、後はgitbucketを動かせば完了なのですが、このままではWSL内にファイルを保持してしまいます。
そしてWSLの環境はリセットをすることがありますので、油断するとファイルが失われてしまいます。
これを防ぐため、Windows側でファイルの保存フォルダをあらかじめ作成しておきます。
今回は
D:\WSL\Ubuntu\GitBucket
というフォルダを作成しておきました。

さて、再びWSLに戻り、起動用ファイルを作成します。
叩きやすい場所に作るのがよいと思いますが、今回は/opt/gitbucket 内に作成しました。
sudo vi startgitbucket.sh

startgitbucket.shに、下記の内容を記述します。
java -jar /opt/gitbucket/gitbucket.war --port=8600 --gitbucket.home=/mnt/d/WSL/Ubuntu/GitBucket
ポートも指定していますが、ポートは空いている番号なら何番でもOKです。
今回はなんとなく8600番を指定しました。

最後に、実際に起動して完了。
sh startgitbucket.sh

http://localhost:8600/ にブラウザでアクセスすれば、動いているのが確認できます。



よりよい方法

この方法だと、いちいちファイルをたたいて起動しなくてはならないため、サービスとして登録した方がよいと思います。
が、そのあたりよく分からないしよけいに面倒くさいは今回触れません。あくまで「簡易のちょっとした」環境整備です。


さらによりより方法

素直にgithubなりなんなりでリモートリポジトリを用意した方が楽だよ!


独習Git

新品価格
¥3,542から
(2019/8/25 14:47時点)