スクウェア・エニックスノベルス『スタンプ・デッド』1~5巻&コミック版(完結)、
『太陽で台風』1・2巻(完結)発売中!
ガンガンノベルズ『魔法少女アーヤ☆アミー』発売中!
徳間デュアル文庫『魔王さんちの勇者さま』1~4巻(完結)発売中!
徳間文庫『欠陥妖怪住宅』発売中!
ぽにきゃんBOOKSライトノベルシリーズ『ブチ切れ勇者の世界征服』1~2巻発売中!
徳間文庫『パラレル家族計画』発売中!

2017年4月、第11回HJ文庫大賞様にて『銀賞』をいただきました!
2017年5月、ジャンプ小説新人賞’16 Winter様にて 小説フリー部門『銀賞』受賞をいただきました!

«  | ホーム |  »

WinShot

どうも、はむばねです。
おっしゃ、はむばねさんが使ってるフリーウェアを適当に紹介するコーナーがやってきたよー\(^o^)/
コーナーとかいってるけど、これ以降も続くのかは不明だよ!\(^o^)/

そんなこんなでね。
本日ご紹介するのは、WinShotでございます。
簡単に紹介すると、「スクリーンショット取得を様々な機能でサポートするソフト」でしょうか。

Windows標準の機能のみを使った場合、通常は「PrintScreenキー押下→ペイント等の画像ソフトに貼り付けて保存」という形になるかと思います。
まぁぶっちゃけ、数枚程度ならそれでもそんなに困ることはないかなーとも思うのですけれど。
ただ、枚数が増えてくるとその作業の負担が加速度的に増えていきまして。
具体的に言いますと、画像付きの手順書とかを作成する場合いちいちそんなことやってたら死ねます。

そんな時に活躍するのが、本ソフトウェアというわけですね。
本当にかなり色々な機能があるのですが、今回は主に私が使用している機能だけをご紹介します。
それだけでも、かなりの省力化が可能かと思いますので。

さて、それらの機能の説明をするにはホットキーの登録画面を見ていただくのが手っ取り早いかもしれません。

2_20170319152424a77.png

ちな、↑の通り起動するとタスクトレイに常駐します。
猫さんの顔が目印。
スタートアップに登録しておくと便利ですね。
んで、そっから右クリックして『環境設定』→『ホット・キー』の順に選択すると↓こんな画面が出ます。

1_201703191524234a8.png

アクションとして、「印刷」「プレビュー表示」「クリップボードへコピー」「ビットマップで保存」「JPEGで保存」の5種類。
それぞれの対象として、「アクティブウインドウ」「デスクトップ」短形範囲指定」「コントロール/クライアント」の4種類が設定されいます。
んで、それぞれの組み合わせに対してキーを割り当てられるわけですね。
例えば私の場合だと、画像の通りPrintScreenキーに「アクティブウインドウをJPEGで保存」を割り当ててあります。
通常ですとPrintScreenを押してもクリップボードにデスクトップ全体がコピーされるだけで、その後ペイントソフトにペーストして保存するという行程が必要になるわけですが。
こう設定することによって、PrintScreenを押すだけで自動的に保存までやってくれるわけですね。
これだけでも、省力化の効果は計り知れないレベル。

ちな、自動保存先もファイルの命名規則も↓こんな感じで自由に設定出来ます。

1_20170604150055cc8.png



あとよく使うのが、短形範囲指定。

1_20170605193755b68.png

こんな感じで、マウスで指定した範囲をキャプチャしてくれる機能ですね。
赤い死角で囲まれた部分のみをキャプチャしてくれます。
これによって、一旦ペイントソフトに貼り付けて切り取って……などの作業も必要なくなります。


また、コントロール/クライアントを利用すると今出ている画面のどの部分をキャプチャするのかが指定出来ます。

2_20170605193756870.png

3_20170605193754d56.png

ちょっとわかりにくいかもしれませんが……こんな感じで、どの部分をキャプチャするのがを選択出来ます。
赤で囲まれてるところを取得してくれるわけですね。
ウィンドウ単位だけでなく、ボタンやバー、フォーム、サブフォームなど、一部分だけをキャプチャすることが可能です。


他にも(私は使ってませんが)n秒間隔で自動実行される連続キャプチャ機能や、他のアプリに直接送って編集したりプレビューを表示出来たりもするようです。
設定もかなり細やかな要望に応えられる仕様になっていて、例えば実行してから実際にキャプチャするまでに遅延を発生させる「時間差キャプチャ」なんかも設定出来ます。
仕様書を作る際は映り込むマウスカーソルの位置も重要になってくるケースがあるのですが(ここを押すんだよ、と示したい場合とか)、普通にやるとこれが範囲指定と両立出来ません(マウスで範囲を指定するので)。
しかしこの時間差キャプチャを利用することで、キャプチャ範囲を指定した後に目的の場所までマウスを持って行ってからキャプチャすることが可能となるわけです。
もちろん遅延させる秒数も指定出来ますし、マウスカーソルをキャプチャさせない設定も可能。


このソフトがあるとないとでは、作業効率がマジで段違いです。
手順書作成はもちろん、ブログに画像を用いる場合とかゲームのスクショ撮る時とか、とにかくキャプチャするあらゆる場面で活躍。
入れておくことのデメリットもないので、ぶっちゃけ入れない理由がないレベルです。
#デフォルトだとPrintScreen単体にホットキーは割り当てられていないので、導入前と動作が変わることもありません。
ちなみに私は(フリーソフト申請書を出すのがめんどかったので)一年くらいWindows標準のPrintScreen機能とペイントで手順書とか作ってたけど、死ぬほどめんどかったぞ!
逆に言うと、この私でさえも「めんどい」の壁を乗り越えて導入したレベルということである。
「PrintScreenとか1回も使ったこと無いし今後使う予定も無いわ」という人以外はとりあえず入れとけば? とさえ思います。
スポンサーサイト

FC2ブログでAAがズレる場合の対応

どうも、はむばねです。
FC2ブログに移行してからというもの割と快適なブログライフを送っているわけですが、やはり多少は微妙な点はありまして。
その数少ない不満点の一つが、AAがズレるということ。
ご存知の方も多いと思いますが、私はまぁまぁAA使う芸風なんでね……。
いくつかは調整でどうにかなるのもあるのですが、どうにもならないのもあって困ってたのです。

    ∩_∩     人人人人人人人人人人人人人人人人人人人人人人人人人人人人人
   / \ /\   < すごい高揚感を感じる。今までにない何か熱い高揚感を。       >
  |  (゚)=(゚) |   < 風・・・なんだろう吹いてきてる確実に、着実に、俺のほうに。   .  >
  |  ●_●  |   < 中途半端はやめよう、とにかく最後まで書いてやろうじゃん。      >
 /        ヽ  < 紙面の向こうには沢山の読者さんがいる。決して一人じゃない。   >
 | 〃 ------ ヾ | < 信じよう。そしてともに戦おう。                        >
 \__二__ノ  < 叩きや邪魔は入るだろうけど、絶対に流されるなよ。         >
              YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

↑こんな感じになっちゃうんですよね。
リアルタイムプレビューだとちゃんと表示されるのに、実際に更新するとズレるという。

まぁたぶんcssで対処可能だろうとは思ってたんですが、めんどくてずっと放置していたのですけれど。
今回の受賞を期に、一念発起して対応に取り組みました。
「小説賞の受賞を期に一念発起してAAを正常表示出来るようにする」ってなんだこの字面。

というのは、ともかくとして。
ま、つっても実際やることはcssをホントちょっと弄るだけなんですけどね。
自分の備忘録と、あと同じく困っている方もいるかもしれないので一応ここに記載します。
「情報系」カテゴリにする程か? って気もしなくはないですが……。

とまれ。
実際の対応は、こちら。

1.管理画面の「テンプレートの設定」を開きます。
2.「[テンプレ名]のスタイルシート編集」の、任意の場所に下記のコードをコピペします。

.aa{
font-family:"MS Pゴシック","MS PGothic","Mona","mona-gothic-jisx0208.1990-0",sans-serif;
font-size:12px;
line-height:14px;
}


3.「更新」ボタンを押します。
4.ブログ記事編集時、AAの前後をspanタグ等で括ってclassに"aa"を指定します。

以上だ!
ね、簡単でしょう?(ガチで
なお、font-sizeとline-heightはご自身の環境に合わせて変更してください。

一応、実際の画面のSSも貼っときますね。

css画面。
1_2017041415191542d.png

記事編集画面。
2_201704141519149d5_201704271451314ca.png



    ∩_∩     人人人人人人人人人人人人人人人人人人人人人人人人人人人人人
   / \ /\   < すごい高揚感を感じる。今までにない何か熱い高揚感を。       >
  |  (゚)=(゚) |   < 風・・・なんだろう吹いてきてる確実に、着実に、俺のほうに。   .  >
  |  ●_●  |   < 中途半端はやめよう、とにかく最後まで書いてやろうじゃん。      >
 /        ヽ  < 紙面の向こうには沢山の読者さんがいる。決して一人じゃない。   >
 | 〃 ------ ヾ | < 信じよう。そしてともに戦おう。                        >
 \__二__ノ  < 叩きや邪魔は入るだろうけど、絶対に流されるなよ。         >
              YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY


それでほら、この通りですね。

つーか、別にFC2に限らずcssが弄れるブログならどこでも出来るはずけどね。
なんでアメブロん時やらなかったんだっけっかな……?
なんか、どっかのタイミングでズレるようになってた気がするんだけども……。
アメブロも、一応cssは弄れるはずだし。
その時点でもう移行決めてたのか、単にめんどかったのか……。
今んとこ、後者の可能性が濃厚である。

とまれ。
ご参考になれば幸いです。

Clibor

どうも、はむばねです。
さて、Twitterの方をご覧いただいている方はご存知かと思いますが。
先日、↓のツイートをしたところ。



なんと、製作者の方からリプライをいただいてしまいました。




実際、バージョンアップしたら該当のエラーは出なくなってます。
というわけでね。
チョロチョロしく製作者さんの好感度を上げたはむばねさんは、せっかくなのでこのソフトの紹介をするぜ!


さて。
文書作成中、あるいはソースコーディング中。
「あー、ここさっきコピーしたのにクリップボード上書きしちゃった」「何回もコピペするとかがあってめんどい……」などと思ったことはないでしょうか?
そんな時に活躍するのが、このCliborだ!
ざっくり言うと、「クリップボードの履歴を保存し、任意のタイミングでコピーし直せるソフト」でしょうか。

実際の画面は、↓こんな感じ。
個人情報とかをモザイク処理したらだいぶ見づらくなってしまいましたが……。

1_2017030117300798c.png

使い方は非常に簡単。
起動さえしておけば、コピーする度に勝手に記録してってくれます。
呼び出す時はホットキー(デフォルトだとCtrl2回)を押せばおk。
対応する番号かアルファベットを押せば、普通のクリップボードにコピーしてくれます。


2_201703011723302aa.png

また、定型文を登録しておくことも可能です。
これまた、別のホットキーを割り当てておけば一発で呼び出せます。
こっちは辞書登録でも対応出来るっちゃ出来ますが、それだと半角で入力してる時いちいち全角にする必要がありますし、何よりTelnet等の端末で利用出来ない(出来るけどやりたくない)ですからね。
コマンドなんかを登録しておけば、いちいち打つ手間も省けてとっても便利。
画像は定型文の内容をそのまま表示してる形ですが、「メモ」を登録しておけばそっちで表示することも可能です。
「~コマンド」のように登録しておけば、見やすくなりますね。

見た目やフォントなど、設定も割と細やかにカスタマイズするのに対応してくれてます。
また、あくまでアプリに記録されているわけなので、OS再起動でフラッシュされないのもありがたいところですね。
データのバックアップ/リストアが手軽に出来る点もグッド。
ちな、バージョンアップする際にはデータをCSV出力して新しいバージョンに取り込むと便利ですよ。


シンプルですが、ゆえに使いやすいアプリですね。
小説を書くにもプログラムを書くにも、今やこのソフトの存在は欠かせないものとなっております。
作業効率アップ、間違い無し!
さぁ、みんなも導入しよう!(露骨な擦り寄り)

Word2010でファンクションキーを無効にする方法

どうも、はむばねです。
対応しても対応してもまた新たなイラッとポイントが出てきやがるな!
というわけで、また新たなWord設定のお話です。
調子よくタイピングしてる時にファンクションキーに指が当たって、なんか余計なものが表示さえれてイラッと来る。
そんな経験はありませんか?
私は数え切れないくらいあります。
よくあるのは、F1(ヘルプ機能)ですね。
1をタイプしようとして割とよくぶつかり、起動に微妙に時間がかかって更にイライラするやつです。
 
というわけで、本日はファンクションキーへの対処方法ですよっと。
どうせ使わねーので、Wordでファンクションキー自体を無効にしてしまいましょう。
ただし一括無効にする方法はどうもないようなので、1個1個無効化します。
まぁ、というかぶっちゃけInsertキーを無効化するのと全く同じ手順なんだけどな!
しかし、主に自分用の備忘録としてあえて書く。
新しく環境作った時、地味に役立つからな……。
 
閑話休題。
ちなみに私が今使ってるキーボードだとF1はちょっと遠いので、バックスペースを押す時に引っかかってやっぱり起動に微妙に時間がかかってイライラがマックスになるF12(名前をつけて保存)を例にしています。
 

 
例によって「ファイル」→「オプション」でオプション画面を表示し、「リボンのユーザー設定」の項目から「ショートカットキー:」の「ユーザー設定」をクリック。
 
 

 
「分類」の項目で「すべてのコマンド」を選択し、「割り当てるキーを押してください」のところで無効にしたいファンクションキーを押します。
すると「現在の割り当て」のところにコマンド(上記例だと「FileSaveAs」)が表示されますので、それを確認します。
ちなみに、F1の場合はヘルプが表示されるだけで何も起こりません。
F1に割り当てられたコマンドは「Help」ですので、ここでは何もせず次の手順に進んでください。
 
 

 
続いて、「コマンド」の項目にて前手順で表示されたコマンドを探してクリックします。
適当なとこを1回クリックして、頭文字のキー(今回の場合ならf)を押すと一気に飛べて便利です。
なお、日本語入力がオンになっていると効かないのでご注意ください。
 
 

 
「現在のキー」に表示されているキーを選択肢、「削除」をクリックすれば完了です。
 
 
 
これまた例によって、まとめの記事にも(ちょっとだけ)追記しときました。
いやー、しかしアレですね。
この備忘録、いつになったら完璧なものになるんでしょうね。
冒頭でも書いた通り、削除しても削除してもまたいらん設定が目に付くんですよね。
そうこうしているうちに、次のバージョンのOfficeに以降しそう……。
 
つーか、ちょっとはメモ帳を見習っていただきたいところですね。
あの、何の設定も必要ないシンプルな美しさよ。
あえていうなら、文末での改行表示を変えるくらいか。
それも、書式から一発クリックするだけですしね。
はむばねさんは、15年前から執筆環境としてメモ帳を推しております。
15年前から(ほぼ)何も変わらない魅力が、そこにある。

PHPにて、フォームから受け取った画像を確認画面で表示する

どうも、はむばねです。
先日、PHPでアップロードされた画像を一時保存せずに確認画面で表示する方法はねーのかよファッキン!
表示部分を別ファイルに分けてimgのsrcで指定すればできるけど、なんか力技感が漂うじゃねーかクソッタレー!
という記事を書いたらですね。
Data URI schemeを使えば出来るんじゃねーのかボケナスが! という旨のコメントをいただきまして。
早速、以下みたいなで試してみました。


//アップロードされた画像を取得
$img = file_get_contents($_FILES["img"]["tmp_name"]);
// BASE64エンコード
$base64 = base64_encode($img);
//表示
print "〈img src=\"data:image/jpeg;base64,${base64}\"〉";



したら、無事表示成功!
実際の、確認画面の後にファイルをアップロードする処理まで入れると↓こんな感じになりました。



【確認画面での処理】
//アップロードされた画像を取得
$img = file_get_contents($_FILES["img"]["tmp_name"]);
//セッションにも格納
$_SESSION['img'] = $img ;
// BASE64エンコード
$base64 = base64_encode($img);
//確認表示
print "〈img src=\"data:image/jpeg;base64,${base64}\"〉";


【サーバに保存する際の処理】
if (isset($_SESSION['img'])) {
  //セッションのデータをファイルとして書き出し
  file_put_contents("imgPath/img.jpg", $_SESSION['profileImg'], LOCK_EX));
  //セッションからは削除
  unset($_SESSION['profileImg']);
}




セッションに保存されるのは(ファイルパスではなく)実データなので、move_uploaded_fileやrenameだと保存出来ない点は一応注意ですかね。
まぁ、私が最初気付かずそれでやって(・3・)アルェー? ってなっただけなんですけど。

うむ、なかなかにシンプルで綺麗なコードなのではなかろうか。
……と思うのですが、調べた時にこの情報が出てこなかったのはなぜなのか。
なんか問題あるのかなぁ……?
Data URI schemeだとデータ量はでかくなるけど、それも1.3倍程度らしいし。
単に私の検索方法が悪かったのか……?


とまれ、ほしるちさん、情報いただき本当にありがとうございました!
おかげで、(とりあえず該当の環境では)モヤモヤしない形で実装することができました!
大変助かりました、感謝です!

PDOでプリペアドステートメントを利用する場合にバインド済SQLを(無理矢理)ログに出力する

どうも、はむばねです。
ようやく情報系の話を書くだけの余裕ができたぜ(脳のリソース的な意味で)!
例によって誰得感漂う内容ではありますが、まぁ私の書くものが誰かの得になることの方がレアなので気にしないことにしよう。。
ていうか、ブログに書いとかな自分で調べた事とか考えた事とかを忘れれてしまうんや……。
ほぼ、自分用の備忘録ですね。
チラシの裏で良いという説も有力ですが、それも気にしない。

さて。
こないだ、とある(php+mySQLでの)ログ出力の処理を実装していたのですが。
プレースホルダが反映された後のSQLを確認する方法ってないんですかね?
え? mySQL側のログを見ろって?
はっはっは、閲覧権限がねーんだよファッキン!
ていうかそもそも、mySQL側のログにはプレースホルダ反映済みのSQLが記録されるんだっけ??
事前にSQLをコンパイル(実行だっけ?)してバインド時に結合するという動きであるならmySQL側でもログには記録されないような気がするのですが。
まぁ実行している以上、(それがログのためだけに手間になろうとも)記録する方法はあるとは思いますけれど。

mySQL側で試す環境もないではないのですが、めんどかったし今回の環境では(今のところ)どうせ使えないのでphp側で実装してみました。
全力の力技でな!
php側で元のSQL文とバインドする値を勝手に結合してログに出力してるだけです。
力技というか、正確なログですらないよね。
これで記録されるのは「実行されたSQL」ではなくて「実行されたはずのSQL」なのだから。
でも、一応書いてみる。

つっても、要はただの文字列操作しかしてません。
TMPテーブルの、TMP_IDとTMP_NAMEをselectする例

------------------------------------------------------------------------
//SQL ステートメントを準備
$stmt = $dbh->prepare("select * from TMP where TMP_ID like :TMP_ID and TMP_NAM like :TMP_NAM");

//検索条件を指定
$paramList = array(
':TMP_ID' => "000%",
':TMP_NAM' => "sample%",
);

//バインドしてSQL実行
$stmt->execute($paramList);

//prepareしたSQL文を取得
$query = $stmt->queryString;

//パラメータ格納配列のキー(SQL中の名前付きパラメータと同値)を取得
$keys = array_keys($paramList);

//名前付きパラメータをバインドする値に置換
for($i=0; $i $param = $paramList[$keys[$i]];
$query = str_replace($keys[$i], $param, $query);
}
------------------------------------------------------------------------

これで、$queryに実際に実行された(はずの)SQL文が格納されますね。
バインドするパラメータを(プレースホルダとして使用している名前付きパラメータを配列のキー名にして)連想配列に格納して、後で名前付きパラメータをキーに置換しているだけです。


以下、一応それっぽく動きそうなコード。
ついでに、errorInfo()でエラー情報も取ってきてます。

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

$host = "host";
$user = "user";
$pass = "pass";
$db = "db";

// MySQLへ接続する
$dbh = new PDO("mysql:dbname=${db};host=${host}", $user, $pass);

//SQL ステートメントを準備
$stmtTMP = $dbh->prepare("select * from TMP where TMP_ID like :TMP_ID and TMP_NAM like :TMP_NAM");

//検索条件を指定
$paramList = array(
':TMP_ID' => "000%",
':TMP_NAM' => "sample%",
);


execSQL($stmtTMP, $paramList);



function execSQL($stmt, $paramList) {

//バインドしてSQL実行
$stmt->execute($paramList);

//パラメータ格納配列のキー(SQL中の名前付きパラメータと同値)を取得
$keys = array_keys($paramList);

//prepareしたSQL文を取得
$query = $stmt->queryString;

//メッセージ整形
$mes = "\t${query}\n";

//名前付きパラメータをバインドする値に置換
for($i=0; $i $param = $paramList[$keys[$i]];
$query = str_replace($keys[$i], $param, $query);
}

//タブ挿入
$query = str_replace("\n", "\n\t", $query);

//エラー情報取得
$errorInfo = $stmt->errorInfo();

//ログメッセージ生成
$mes .= date("Y/m/d H:i:s") . " SQL executed:\n";
$mes .= "\t${query}\n";
$mes .= "\tSQLSTATE: ${errorInfo[0]}\n";
$mes .= "\tError Code: ${errorInfo[1]}\n";
$mes .= "\tError Message: ${errorInfo[2]}\n";


//書き込みモードでファイルオープン
$fp = fopen('logs/online.log', 'a');

//ロック取得(排他ロック、既にロックされている場合は待機)
flock($fp, LOCK_EX);

//ログメッセージ出力
fwrite($fp, $mes);

//ロック解除
flock($fp, LOCK_UN);

//ファイルクローズ
fclose($fp);

return 0;
/* End -- execSQL */
}
?>
------------------------------------------------------------------------


きっと、以下のようなログが出力されるはず。
------------------------------------------------------------------------
2015/05/06 19:49:32 SQL executed:
select * from TMP where TMP_ID like 000% and TMP_NAM like sample%
SQLSTATE: 00000
Error Code:
Error Message:
------------------------------------------------------------------------


とまぁ、一応それっぽいログが出力されるようにはなるわけですけどね。
ぶっちゃけ、こんなもんが一般的な手法なわけないよね?
先述の通り、ログとしては全く正確ではないですからね。
あくまで、「こちらの意図した通りに動いてくれれば意図したログが出力される」という機構。
ログの意味合いを半分以上果たせてない。
例えば、mySQL側でバインド失敗とかしててもたぶんログには正常なSQL文が出力されるのではなかろうか。
元のSQL文も変数に格納しときゃえぇやんっていう中わざわざSQL文実行後にprepareされた文を取得してたり、errorInfo拾ってきたりもしてますが、十全とはとても言えませんよね。

世の中的には、この問題をどうやって解決してるんだぜ?
やっぱDB側からのアプローチになるのか??
しかし、DB2もそういや思い出してみたらログにはバインド前のSQL文が記録されてたような気もしてきたぞ……?
いや、それはdiagだったからか……?
あかん、そろそろ勤めてた時の記憶も曖昧になってきたぜ……。

まぁそんなわけなので、「いやバカじゃねーの? 普通こうするでそ」って方法があったら教えやがってください。
普通じゃなくてもいいです。

はむばね式Word設定

どうも、はむばねです。
昨日の記事を見たふくし氏から「普段入れてるWordの設定についてまとめたらブログのネタになるんじゃね?」と言われたのでそれをやろう。
ま、そんな大した設定入れてるわけでもないですけどね。

なお、バージョンは2010だ!
私はあんまり好きじゃない2010だ!
当時他に選択肢がなかったので仕方ない!

というわけで、早速いってみよう。



・編集記号の表示
2010の何がファッキンって、まずどこに設定項目があるのかわかんねー点だよね!
えぇから「ツール」を復活させろやと言いたい。
言いたいが、まぁ今回それは置いといて基本的なところから。



左上の「ファイル」から「オプション」で設定画面が出てきます。



「表示」の項目で、「すべての編集記号を表示する」にチェックを入れます。
これで、例えば間が開いてるのが半角スペースなのか全角スペースなのかタブなのかとか、改行されてるのが改行記号が入ってるからなのか単に文字数で切れてるだけなのか、とかが見た目でわかるようになります。
後述しますが、Wordのマジファッキンな機能として勝手にスペースやら何やらを変換しやがることがあるので、この設定を入れとかないとWordが余計なことをしたのかどうかすら判別に困ります。
とはいえ全部の記号を出すと割とごちゃごちゃするので、ある程度はお好みで。



・オートコレクトの設定



「文章校正」から「オートコレクトの設定」を選択します。
選択する前の画面でスペルチェックの設定をすることもできるので、お好みで切ってもいいでしょう。
個人的には、たまに使うのでスペルチェックはオンにしています。




「オートコレクト」タブでオートコレクト適用項目を設定。
私は、全てウザいので全部のチェックを外してます。



・入力オートフォーマットの設定



「入力オートフォーマット」タブで設定。
これも私は全外しですが、基本的にはお好みで。
……なんです、が。



行の始まりのスペースを字下げに変更する。
これ!
この項目だけは、女房を質に入れてでもチェックを外しましょう!
……いやごめん言い過ぎた。
流石に、女房を質に入れてまでは外さなくていい。
いいけど、他の何を置いてもチェックを外すべき設定項目だと思います。
個人的に、Wordの中で最もクソオブクソな機能だと思ってます。

何かっつーと、まぁ項目名そのまんまなんですが、行頭のスペースを勝手にインデントに変更しやがるんですよね。
しかも冒頭で書いた編集記号の表示をやってないと、見た目にはわからない。
更に言うなれば、入力した時は確かにスペースなのに、別の行に行ったタイミングでインデントに変更されるというクソっぷり。
正直、悪意を持って実装されたとしか思えない機能です。
結構長い間これに気付いてなくて、何度校正段階で「ここ字下げ入ってないんやけど……」ってなったことか。


・オートフォーマットの設定
オートフォーマット機能を利用する場合(入力時の自動変換ではなく、「オートフォーマットを実行」する場合)、隣の「オートフォーマット」タブでも同様の設定をすると良いでしょう。
私は1ミリも使う気はないけど、念のためこっちも設定してる。


================================= 2016/07/07追記ここから =================================



「入力オートフォーマット」のタブで「Tab/Space/BackSpaceキーでインデントとタブの設定を変更する」のチェック外す。




「オートフォーマット」のタブで「行の始まりのスペースを字下げに変更する」のチェックを外す。


これもやっとかないと、行頭でスペース打つと勝手にインデントに変更しやがります。

================================= 2016/07/07追記ここまで =================================


================================= 2016/07/11追記ここから =================================

Insertキーを押すと上書きモードに変更されるクソ設定を無効にする方法です。

※2016/10/09追記
同じ設定で、ファンクションキーも無効化出来ます。
ほぼ同じですが、設定例はこちら



「リボンのユーザー設定」を選択して「ユーザー設定」をクリック。





【分類】で「すべてのコマンド」を選択し、【コマンド】で「OverType」で選択。
【現在のキー】に「Ins」が表示されてたらそれを選択して、「削除」をクリック。
表示されてなかったら、たぶん設定されてないのでそのままおk。

なお【コマンド】は山程あるので、いずれかを選択した状態でキーボードのoを押すと良いわけですが。
入力モードが日本語だと飛ばないので注意が必要だよ。
私は最初、それで「なんでやねん」とoを連打したよ。
デフォの入力モードが日本語になってるWordのトラップだよ。

================================= 2016/07/11追記ここまで =================================



・オートシェイプ挿入時に描画キャンパスを表示しない



オプションのトップに戻って、「詳細設定」から「オートシェイプの挿入時、自動的に新しい描画キャンパスを作成する」のチェックを外す。
これも大体項目名そのままですね。
毎度オートシェイプを挿入する度にでっかい描画キャンパスが挿入されて、何度ブチ切れそうになったことか。
ただ家のパソコンだとこの項目設定した覚えがない(家だとオートシェイプとかほとんど使わんしな)のにチェック外れてたので、もしかすると2010だとデフォルトでオフになってるかも。



・オートシェイプの挿入をクイックアクセスツールバーに追加




同じく家では設定してねーけど、会社でよく使ってた時にはいちいちリボン開くのがめんどすぎるんでクイックアクセスツールバーにオートシェイプボタンを追加とかもしてました。



一番最後は若干余談的でしたが、これが私が新しい環境でWordを利用する場合に必ず入れる設定です。
とりあえずこれだけ入れとけば、あんまり余計なことはされないはず!
たぶん!

.thenを用いた非同期処理待ちの世界一シンプル(かもしれない)例

どうも、はむばねです。
昨日もチラッと書きましたが、昨日はJavaScriptで非同期な処理の結果を待ってから処理する方法についてほぼ1日悩んでました。
いやね、jQueryのDeferredを利用すればできそうっていうのは早期段階でわかったし、解説してくれてるところも山ほどあるんですけどね。
どいつもこいつも長ぇよ。
説明も! コードも!
いや、わかってる。
ちゃんと説明しようとすると、色々と書かないといけないことも。
恐らく、本来はそんなに難しいことを書いているわけではないであろうことも。
だがしかし、とにかく私はただ「非同期処理の結果を待って処理を行う」ことがしたいだけなんだ。
そしてこちとらJavaScript素人で、なんだったら括弧が増えただけで結構混乱するんだ。
というわけで、本記事ではできるだけシンプルに、「非同期処理の結果を待って処理を行う」ことだけに絞って説明したいと思います。

本記事のターゲットは、主に……。
・JavaScriptのことなんてよくわからねぇが、とにかく非同期処理のせいでデータ連携が上手くいかねぇ!
・仕様とか実装とか、細けぇことはいいんだよ! 関係するところだけ教えろくだしあ!
・ていうかC言語でいうとどういうことなんだってばよ!
という方向けです。
ターゲット層狭いな!
まぁ基本的に私が情報系の記事を書く時は、過去(調べてた時)の自分がこういう記事見つけてたら嬉しかっただろうな、というのを目標に書いてますからね。
半分備忘録も兼ねてるので、まぁ参考になる人がもしいれば嬉しいね、程度。
……いかん、シンプルにって言ってる割に前置きからして長くなってきましたね。
というわけで、実に4年ぶりのテーマ「情報系」いくよー\(^o^)/

※思ったよか説明が長くなってしまったので、ガチで実際のコードだけ見たい人は一番下の項目まで飛ばしてください。



【前提】
JavaScriptはシングルスレッドで動s細けぇことはいいんだよ!
とにかく、JavaScriptは必ずしも書いた順番通りに動くわけではない!
以上だ!


【サンプル】
じゃあ、例えばどういう時に順番通り動かないのか?
話をシンプルにするため、実際にはクソの役にも立たないサンプルを用意する!

---------------------------------
var ret = sample("after");
document.write(ret);

function sample(str) {
 var tmp = "before";
 setTimeout(function() {
  tmp = str;
 }, 200);
 return tmp;
}
---------------------------------

関数sampleは、0.2秒(200ms)待った後にtmp(初期値:"before")に引数strを代入し、tmpをreturnするだけのクソのような処理を行う!
そのsampleに対して、"after"という文字列をぶち込んで返ってきた値を表示するというクソのようなプログラムだ!
C言語ライクに考えるならば、sample内で0.2秒待った後に"after"が代入されたtmpをreturnし、無事"after"と表示されることを期待するであろう!
しかし、実際にこのプログラムを実行した結果表示されるのは"before"である!
関数内の処理が全て完了する前に表示の処理が実行された(というか変数がreturnされた)ということであろう!


【どうすればいいのか】
jQueryのDeferredオブジェクトを利用するのは、先に述べた通りである!
ではDeferredオブジェクトとは何なのか?
細かい話は省く!
今回のケースで利用するだけならば、「(非同期処理が)終わったかどうかのステータスを管理するオブジェクト」と思っておけばよろしい!
で、実際その「終わったかどうかのステータス」を保存するのが、Deferredが内包するPromiseオブジェクトだ!
Promiseオブジェクトは、作成された時点ではpending(処理中の状態)のステータスを持っている!
これを、Deferredオブジェクトを使ってresolved(成功)かrejected(失敗) かに書き換えることによって、該当処理が終わったかどうかを他の処理に通知(?)できるようにするわけだ!
先の例でいうと、sample内にDeferredオブジェクトを定義して、Deferredオブジェクトから「終わったよ」と通知が来ない限り次の処理に進まないよう呼び出し元を書き換えればよい!
これ以上の細かいことは散々他のところで解説されているのでggrks!


【で、どうすればいいの?】
ポイントは大きく分けて4つだ!
というか、先ほどの方法論の所で述べた通りである!
1.Deferredオブジェクトを生成する(関数内)
2.Promiseオブジェクトのステータスを変更する(関数内)
3.Promiseオブジェクトをreturnする(関数内)
4.返ってきたDeferred(Promise)オブジェクトの内容によって処理内容を変えるよう記載する(関数呼び出し元)


【だからどうすればいいんだよハゲ】
それぞれの書き方について、具体的に記載する!
なお、恐らくこの項目だけを見てもわかりづらいと思うので、後述するサンプルと見比べるのを推奨する!

1.Deferredオブジェクトを生成する(関数内)
------------------------------------------------------------------
var [オブジェクト名] = new $.Deferred;
------------------------------------------------------------------
これだけだ!
見ればわかると思うが、ここでは本当にただオブジェクトを生成しているだけである!
後の(関数内の)処理は、全てここで定義したDeferred型オブジェクトを利用する!

2.Promiseオブジェクトのステータスを変更する(関数内)
------------------------------------------------------------------
[オブジェクト名].resolve([引数]);
[オブジェクト名].reject([引数]);
------------------------------------------------------------------
言うまでもないと思うが、ここで言う「オブジェクト名」とは1で生成したオブジェクト名のことである!
この操作によって、Promiseオブジェクトの持つステータスが失敗か成功かへ変化する(実行中のステータスではなくなる)んだな!
成功の場合はresolveへ、失敗の場合はrejectへステータスを変化させよう!
例えば、こんな感じに書くイメージだ!
無論必ずしも両方書く必要はないので、成否関係ない場合はresolveだけ書いとけ!
-----------------------------------------------------------------
A; //非同期処理
if(成功){
 dfd.resolve("成功!");
}else{
 dfd.reject("失敗!");
}
------------------------------------------------------------------
ちなみに、ここで格納した引数は呼び出し元で使用することができるぞ!
returnする時ではなく、ステータスを更新する時に返り値を設定するので注意だ!
本当は「返り値を設定する」というと語弊がある気もするが、まぁなんか雰囲気で察しろ!

3.Promiseオブジェクトをreturnする(関数内)
------------------------------------------------------------------
return [オブジェクト名].promise();
------------------------------------------------------------------
やはりここでいう「オブジェクト名」とは1で生成した以下略!
これによって、2で格納したステータス(と返り値)を呼び出し元に送り、処理が終わったことを通知するんだな!

まとめると、関数側の流れはこんな感じだ!
-----------------------------------------------------------------
var dfd = new $.Deferred;

A; //非同期処理
if(成功){
 dfd.resolve("成功!");
}else{
 dfd.reject("失敗!");
}

return dfd.promise();
------------------------------------------------------------------



4.返ってきたPromiseオブジェクトの内容によって処理内容を変えるよう記載する(関数呼び出し元)
呼び出し元では、.thenメソッドというものを利用する!
ここでも細けぇ話は置いといて、返ってきたPromiseオブジェクトのステータスによって処理を変える(Promiseオブジェクトが返ってくるまで処理を実行しない)ようにするメソッドだと思っておけぃ!
------------------------------------------------------------------
.then(
 function([引数]) {
  //成功時の処理
 },
 function([引数]) {
  //失敗時の処理
 }
);
------------------------------------------------------------------
C言語ライク(?)に言うと、.thenはfuction型の引数2つを持つ関数みたいなもんだな!
第1引数はPromiseオブジェクトがresolevedの時に実行される関数で、第2引数はrejectedの時に実行される関数だ!
第2引数は省略可能で、その場合はresolvedの場合のみ処理が走るぞ!
無論、他で定義した関数を指定することも可能だ!
.thenを連結することで、順番に処理を実行していくことも可能だぞ!
なお、ここの[引数]で指定した変数で2で格納した返り値を受け取ることができるぞ!

まとめると、以下のような使い方ができるということだ!
------------------------------------------------------------------
sample()
.then(
 function([引数]) {
  //成功時の処理1
 },
 function([引数]) {
  //失敗時の処理1
 }
)
.then(
 function([引数]) {
  //成功時の処理2(失敗時は何もしない)
 }
)
.then( anotherFunc //成功時の処理3
);
------------------------------------------------------------------



【サンプル(修正版)】
以上を踏まえて、冒頭のクソサンプルを書き換える!
なお、本稿の目的を踏まえrejectの存在は無視しているので注意だ!
また、返り値の受け方についても書き方が変わっているので先述の説明を踏まえるように!
踏まえること多いな!

---------------------------------
var ret = sample("after");
document.write(ret);

function sample(str) {
 var tmp = "before";
 setTimeout(function() {
  tmp = str;
 }, 200);
 return tmp;
}
---------------------------------

---------------------------------
sample("after")
.then(
 function(ret) {
  document.write(ret);
 }
);

function sample(str) {
 var tmp = "before";
 var dfd = new $.Deferred;
 setTimeout(function() {
  tmp = str;
  dfd.resolve(tmp);
 }, 200);
 return dfd.promise();
}
---------------------------------

これで、想定通り"after"と出力されるクソプログラムとなったわけである!
dfd.resolve(tmp);が実行されるまでreturn dfd.promise();は実行されず、それを待ってから.then内の処理が実行されたわけだな!



【世界一シンプル(かもしれない)サンプル】
……とここまで書いて思ったが、こっちのサンプルの方がもっとシンプルだな!
関数もねぇ! 返り値もねぇ! 処理もそれほど走ってねぇ!

---------------------------------
var str = "before";

setTimeout(function() {
 str = "after";
}, 200);

//beforeと出力される
document.write(str);
---------------------------------

---------------------------------
var str = "before";
var dfd = new $.Deferred;

setTimeout(function() {
 str = "after";
 dfd.resolve(str);
}, 200);

dfd.then(
 function(ret) {
  //afterと出力される
  document.write(str);
 }
);
---------------------------------

なお、さんざん繰り返している通りDeferredはjQueryのライブラリなので当然jQueryの読み込みが必須なので注意されたし!
コールバックによる処理ならば純正JavaScriptのみでいけるはずだが、散々ディスられている上に見ただけで萎えたので今回は考慮していない!



以上だ!
間違っている点、勘違いしている点、効率の悪い点等、ツッコミをお待ちしている!
疑問も受け付けるが、答えられるかは不明だ!

勉強してないわー マジ全然勉強してないわー

どうも、はむばねです。

あなたに送る独り言byはむばね

というわけで、ITIL V3 Foundation受かってきたよー\(^o^)/
試験終了後、明らかに試験終了ボタンしか押すとこないのに、押すと「全ての試験が終わっていないのに終了しようとしています。いいですか?」的なメッセージが出て焦ったw
結局普通に「はい」押して大丈夫だったようですが何の仕様なんだよw

いやしかし、思ってたよりテストテストしたテストでしたねー。
普通に単語レベルの意味とか内容とかを聞かれる感じ。
ちゃんと勉強していったらちゃんと受かるタイプの試験ですね。

ちなみに私が勉強に用いたのは、以下の3点。


あなたに送る独り言byはむばね
ITIL入門 ITサービスマネジメントの仕組みと活用



あなたに送る独り言byはむばね
ITILの基礎 ITIL V3 ファンデーション試験 対応



無料deITIL V3 Foundation模擬試験


①は、OJT期間が始まった時に先輩からオススメされたもの。
ITIL(というかITSM)について、総合的に理解するのに役立つ本。

②は、今回の試験を受けるに当たって一応買ってみたもの。
試験対応って書かれてたのでもっと試験対策本みたいなのかと思ってたら、①と同じような内容だった。
役に立ってないとまでは言わないけど、①があれば特にいらなかったかなー。

③が、実際には試験対策としては一番有効だったと思います。
どっかで見た記載では「本試験よりはこれより複雑で難しい」的なことが書かれてた気がするのですが、個人的にはそんなに変わらなかったんじゃねーかなという感じ。
とりあえずここで満点とれるようになっとけば、本試験もそこそこいけると思います。
ただ一応大まかな流れは理解しといた方がいいと思いますので、全く何の知識もない人がここオンリーで試験に臨むのはキツいと思いますが。
一通りITILについて理解してる人なら、試験対策としてはたぶんこれだけでオッケー。
本当は試験対策に特化した、単語の説明とか含まれる範囲について書かれてる本があれば一番いい気がしますが……とりあえず私は見つけられませんでした。
普通にあってもいいと思うんですけどね、作るのそんなに難しくなさそうですし。


ともあれ、無事合格出来てやれやれってところですね。
仮にも8ヶ月業務でITSM活動やってきて、これで不合格だったら申し訳が立たないところですよ。
まぁ、ぶっちゃけ試験は単語とか概念ベースなのでそんなに関係ないっちゃない気もしますが……
かなり際まで引っ張ってしまいましたが、とりあえずこれで今期やるべきタスクは大体終了ですかね。

教えてExcel詳しい人!

どうも、はむばねです。
今日も今日とて微妙に早起きできたので、今日こそは朝のうちに更新します。
ネタとしては、昨日質問を受けたものの、結局ついぞ答えを導くことができなかった問題について。
Excelの、ハイパーリンクに関してなんですけどね。
Excelのハイパーリンクでは、他のセルへのリンクを張ることもできるじゃないですか。

あなたに送る独り言byはむばね


こんな感じに。
んで、質問してきた方はですね。
たとえば1番目のセルがB1~E5へのリンクだとすると、2番目のセルでB6~E10へ、3番目のセルはB11~E15へ、と順番にリンクを張っていきたかったらしいのですよ。
いちいち入力するのはクソめんどいので、これが自動でピピッとできればいいですよね、という話。

んで、単純に考えるとオートフィルが使えるんじゃないかなーと思うわけですよ。


あなたに送る独り言byはむばね

こんな感じで、ググッと下げてやると。



あなたに送る独り言byはむばね

こんな風にリンクが張られる、ってね。
まぁでもそこまでは質問者の方も試されたようで。




あなたに送る独り言byはむばね

実際にはこうなる(全て同じリンク先が参照される)のですね。
家でやると表示上の数値だけは変わりましたが(まぁEだけですが)、やっぱりリンク先はそのままです。


んで、これがどうにかならないんですか? という質問でした。
ぶっちゃけ知らねぇよという話なんですが、聞かれたからには全力で調べましたよ。
でも、どうも調べてみる限りお手軽にできる方法はなさそうな感じ?
ならば代替手段はないものかと調べて考えて。
最初はリンク先のセルの行番号をあらかじめ別の列に(1,6,11,16……)(5,10,15,20……)という風に保存しておいてリンクの式内で参照するという方法を考えたのですが、どうもそれは美しくない。
というわけで2時間近くに及ぶ試行錯誤の結果、私が至ったベストは下のような形でした。


あなたに送る独り言byはむばね

どうも画像の右が切れるようなので、こっちでも書いておくと、
=HYPERLINK("#Sheet2!B" & 1+(ROW()-1)*5 & ":E" & ROW()*5 )
こんな感じの式を書くことにしたわけです。
行番号を、公差5の等差数列として記述したわけですね。
これなら行ごとに勝手に数字が変わっていきますので、単純なコピペでもOKになってきます。

が、これもちょっとややこいというかめんどいですよね。
というわけで、もっと簡単に同じ機能を得ることができる方法知ってる人募集!



……まぁしかし、ていうかね。
Javaとかに関しての質問なら、それなりに答えるよ?
教科書に書いてあることくらいは基本的にマスターしたつもりですし、それ以上のことも(C言語の経験から)ある程度動作や内部仕様の予測もできる。
しかし、Excelのことまで答えられると思うなよ。
修論のデータとりには使ったけど、ホントにデータ保存してちょっとグラフ作るくらいしかしてないですからね。
ROW()関数や&での結合はおろか、ぶっちゃけハイパーリンクの存在すら昨日初めて知ったわ。
「何ができるか」もわかってない状況で「どうやるか」を考えるなんて、無茶にも程がある。

«  | ホーム |  »

プロフィール

hamubane

Author:hamubane

たぶんライトノベル作家的なもの


Twitter

既刊情報

最新コメント

最新記事

カレンダー

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

月別アーカイブ

カテゴリ

未分類 (0)
ブログ (4307)
スタンプ・デッド (73)
情報系 (22)
短ネタ (35)
太陽で台風 (2)
しゅーかつ (18)
レパートリー確認PJ (27)
自著を無理矢理褒める (7)
感想 (266)
天神周辺グルメ (41)

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QR