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

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

第11回HJ文庫大賞"銀賞"受賞作『カンスト勇者の超魔教導 ~将来有望な魔王と姫を弟子にしてみた~』
1・2巻、HJ文庫より発売中!
第30回ファンタジア大賞 "金賞"受賞作『お助けキャラに彼女がいるわけないじゃないですか』
3巻、8/18(金)ファンタジア文庫より発売です!

2018-07

«  | ホーム |  »

Twitterクライアント『Tabtter』

どうも、はむばねです。
ほいさ、今日も今日とてはむばねさんが使ってるフリーウェアを適当に紹介するコーナーがやってきましたよっと。

今回ご紹介するのは、TwitterクライアントであるTabtterです。
まぁ、これに至ってはフリーソフトですらないんですが。

むしろ、そこが好きなポイントでもあるんですけどね。
使い方は、簡単。
Tabtterのサイトにアクセスしていただいて。


2_20170604164808d00.png

「Twitterアカウントでログイン」をクリック。
Twitterのログインしていない場合は、次の画面でログイン。
んで。


3_20170604164010d86.png

ここは、他のツイッターと連携するサイトやアプリと同じですね。
「連携アプリを認証」をクリック。
これだけで、使えるようになります。


4.jpg

実際の画面は、こんな感じ。


8_20170604170843a27.png

わかり辛いので拡大しました。
このように、複数のタブを持っているから『Tabtter』なんですね。
自分宛のリプライ、特定の人のTL、特定ワードでの検索結果、等々。
様々なタブを並行して持っておくことが出来ます。
まぁこれも便利なんですが、私がこれを使っている理由はそこではない。


5_20170604165545707.png

ちな、設定項目はかなり多岐に渡ります。
ご自分でお好きなように設定してください。
非常にありがたいのですが、私がこれを使っている理由はそこでもない。

では、どこなのか。
答えは、ここ。

6_20170604164006ad5.png

NGワード設定です。
一応色んなTwitterクライアントを試してみましたが、少なくとも無料の範疇でここまで細やかにNGワードを設定出来るクライアントを私は知りません。

NGワードを設定出来るクライアント自体は、まぁまぁあるんですけどね。
個々のアカウント毎にNGワードを設定出来るクライアントとなるとグッと希少になります。
#ここで言う「個々のアカウント」とは、自分で複垢持ってる場合のことではなく自分がフォローしている各アカウントのことです。
つーか、この時点で要件満たすのがTabtterだけだった気がする。

↑の画像の例で言うと、例えば「はむばね」とか「http://hamubane.blog.fc2.com/」とかを設定してTL上の全アカウントに対してNGをかけることは他のクライアントでも出来るんですよ。
つーか、これに関してはTwitter公式でも(ミュート機能で)出来ますよね。
しかし「別に他の人が話題にする分には問題ないんだけど、この人がこの話題を口にすると不快な発言が多いからこの人だけこのワードをNGにしたいな」とか「この人がリツートする内容は面白いんだけど本人のツイートは別に見たくないな」とか思うようなこと、ありませんか?
……ありませんか、そうですか。
ぶっちゃけ、それがない人は他のクライアントでも問題と思います。
うん、まぁ、ていうかあんま需要がないからたぶん対応してるクライアントが少ないんでしょうね……。

しかし、その要求がある人にとってTabtterは神がかり的なクライアントに思えることでしょう。
つーわけで、以下ではどんなNGワード指定の方法が出来るのかを紹介するぜ!

ちなみに、これらのNGワードが有効なのはホーム、リスト、検索タブのみです。
個人アカウントを見に行った場合などには適用されませんので、一応ご注意を。


・特定の人に対してのみNGワードを指定する
構文:NGワード [@アカウント名]
例:はむばね [@hamubane]

これで、私のアカウント(@hamubane)の発言の中で「はむばね」が含まれるツイートのみが表示されなくなります。
他の人のツイートに関しては、「はむばね」が含まれていても表示されます。


・特定の人のリツイートのみを表示する
構文: [@アカウント名] -[rt]
例: [@hamubane] -[rt]

これで、私自身のツイートは表示されず、私がリツイートしたツイートは表示されるようになります。
いつかのアップデートでこれが出来るようになった時、私の中でこのクライアントが「神がかり的」から「神」に格上げされましたね。
リツイートする内容は面白いんだけども、本人のツイートには興味がない。
なのに、めっちゃ本人が呟くのでどうにかしたい。
そんな思いに応えくれる機能がついに登場したのです。
……うん、まぁ、流石にニッチな需要であることは理解していますが。
けど、元々私が「特定個人にのみNGワード設定が出来る」クライアントを探してたのも実はこれの代替としてだったんですよね……。
リツートは表示するけど、本人のツイートは表示しない。
逆(リツイートのみ非表示)が出来るクライアントはなんぼでもある(というか公式でも出来る)んですが、これが全く見当たらなかった上にほぼ検索すら不可能(逆パターンばっかり出てくるので)であるため、仕方なくその人に対して様々なNGワードを設定することで対応していたのだ。
もっとも、その人にNGワードを設定するとその人がリツイートした内容にも適用されるため、やたらめったら指定することも出来ないので歯がゆい思いをしていたのです。
これが出来るようになったことで、今は無茶苦茶快適なTwitterライフを送ってますね。

すみません、長くなりました。
引き続きいくつか指定方法をご紹介致しますが、たぶんTabtterでないと出来ない機能はここまでです。
あとは、正規表現に対応してるクライアントなら大体出来るんじゃねーかな。
でもまぁ、せっかくなので。


・全アカウントに対してNGワードを設定する
構文: NGワード
例: はむばね

はい、一番スタンダードな奴ですね。
これで、TLから「はむばね」を含むツイートは全て表示されません。


・特定のタグを表示しない
構文: 対象タグ
例:#hamubane

これもスタンダードなやつですね。
「#hamubane」というタグが表示されなくなります。
ちな、TabtterのNGワードで[](大括弧)とか|(パイプ)とか-(ハイフン)とか以外は文字列そのままを認識します。
なので、#や@も特殊記号としての役割はなく、単純に「ツイートにその文字が含まれていれば」という解釈になります。


・特定の人向けのリプライを表示しない
構文: @アカウント名
例: @hamubane

これで、私(@hamubane)宛のリプライは全て表示されなくなります。
そもそもリプライ元とリプライ先の人両方をフォローしてないとリプライはTL上に表示されないわけですが、「両方フォローしてはいるけどこの人たちのやり取りは別に見たくないな……」という場合にどうぞ。
先に書いた通り@も普通に文字として認識されるだけなので、@hamubane全部のツイートが表示されなくなるということはありません。
この機能も、実は出来るクライアント少ないかも?(他で試したことないから、もしかしたら公式でさえ出来るのかもしれないけど)


・特定のアカウントのツイート全てを表示しない
構文: [@アカウント名]
例: [@hamubane]

[]で囲んだ場合は、@はアカウントそのものを指す特殊記号となります。
まぁこれは、別にその人をミュート指定すればえぇだけやん、という話ではある。


・特定アカウントの引用ツイートを表示しない
構文: twitter.com/アカウント名
例: twitter.com/hamubane

ここは@も[]も付けないことに気をつけてください。
また、これは「私が引用リツイートを用いたツイートを表示しない」であり、「私のツイートを引用したツイートを表示しない」ではないのでご注意を。
今んところ、後者の方法も「引用リツイートに特定ワードが含まれる場合に表示しない」方法もわかってません。
少なくとも、引用元にNG指定しているワードが含まれてる場合でも普通に表示されます。
どうにかする方法はありそうな気もするけど、今んとこ個人的に需要がないので本腰入れては探してません。


他にも数え切れない程の使い方がありますが、私が使ってるのはこれくらいですかね。
正規表現が使えることもあり、かなり幅広い指定が出来ると思います。
詳細は、公式のヘルプとかマッチングルールの説明とかを見ていただければと思います。


ちな、セーブ&ロード機能もありますのでね。

7_201706041640077be.png

一度設定を保存してしまえば、別端末にも容易にロード出来ます。
これで、出先でも自宅と同じ環境でTwitterが出来るぜ!
※ログアウト忘れやパスワード保存にはご注意ください。


というね。
私的にはほぼ全ての要求を満たしてくれている、素晴らしいTwitterクライアントなのであります。
しかし、こんなに素晴らしいのに検索してもほとんど出てこないのはなぜなんだぜ?
……はい、たぶん同じような要求を持っている人が希少だからですね。
しかしほとんど唯一無二の機能を持っていると思いますので、他のクライアントに不満を持っている方は試してみてはいかがでしょうか?

ちな、私の唯一の不満点は検索機能がクソという点です。
なぜか、完全一致がまともに機能してねーんだよな……。
ここさえしっかりしてれば、エゴサも出来て完璧なのに……。
……と思ったけどこれ、本家の検索機能がクソなだけなのかな……?

いずれにせよ、エゴサに便利なクライアントをご存知でしたら教えていただけますと幸いです。
今んとこYahooリアルタイム検索が一番正確っぽいのですが、時々漏らすのと微妙に使い勝手悪いのがな……。

あとは、私はどっちにしろ使ってないので不便には感じてませんが、アンケート機能は使えなくなるので一応注意かな。
スポンサーサイト

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出力して新しいバージョンに取り込むと便利ですよ。


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

情報処理安全確保支援士

どうも、はむばねです。

moblog_37401b3b.jpg 

やったー、SMの合格証書届いたよー\(^o^)/

情処は、合格発表時と証書送付時の二度嬉しくなれる点が(だけは)嬉しいですよね!
物理的に証書が重なっていくので、収集欲も満たされます。
まぁ、だからこそ無駄に取ってしまうわけですが……。

春期の申し込みは明後日からですか。
忘れないようにしないといけませんね。


さて、情処といえば。
合格発表の時から、気になってたことがあったのですよ。


o0680041313822539631.png 


↑の図の、右のとこ。
情報処理安全確保支援士……?
こんな区分、あったっけ……? と。
セキュリティスペシャリストは前からあったけど(ていうか持ってるし)、普通に高度試験(真ん中の区分)の中だったよね……?と思ってたら、どうやら今回(2016年秋期)からこう変わったようですね。
どうりで知らんわけです。


んで、もうちっと調べてみるとですね。
なんか、情処の合格だけでなく「情報処理安全確保支援士」とかいう資格が出来てるようなのですね。
別途登録が必要らしいのですが、旧セキュリティスペシャリスト合格者なら新たに試験受け直さなくても登録出来るとのこと。
うん、あの……そういうの、合格者にちゃんとアナウンスして貰えませんかねぇ……?
常に情処のHPチェックしとけって? 無茶言うなや。
登録期限は2年らしいけど、2年とか気がついたら過ぎてるレベルやんけ……。


で、まぁせっかくなんで私も登録しようかなって思ったのですけれど。
ウェブからチャチャッと登録出来るのかと思ったら、どうやら郵送じゃないと受け付けられない模様。
もうこの時点でだいぶめんどい。
しかもですね。
調べれば調べる程にめんどいことが判明していきます。


というわけで。
解説! ここがめんどいよ、情報処理安全確保支援士!




①用意する書類がめんどい

o0603064513822574569.png 

↑が、必要な書類です。
まず、8つもある時点でだいぶめんどい。
しかも、内訳を見ると更にめんどい。
百歩譲って、HPからダウンロードする書類に記載するのは良しとしよう。
億歩譲って、役所で身分証明書と戸籍謄本が必要というのも全く1ミリたりとも良くはないがまぁ一旦置いておこう。
ただね。
「登記されていないことの証明書」。
これに至っては何やねん。


o0594020013822578781.png 

説明書の該当ページを見ても、こう書かれてるだけ。
だから何やねん。
説明下手か。

いやまぁ、情処が説明下手なのは今に始まったことでもないですが。
ほんでまぁ、名前そのまんまなんで仕方ないっちゃ仕方ないのかもしれませんが。
でもこれ、なんで登録されたらダメなのだ……?
試験にさえ合格してれば、能力は認められて良いのでは……?
判断能力が十分であると裁判所に認められてないって、どうせそんな重要な資格にならんやろ。

まぁ私はこれ割と近くに法務局があるので良いのですが、近くにない方はこれの取得だけで結構時間取られそう。



②登録料が高くてめんどい
これはもう、シンプルに高い。
登録免許税、9000円。
これはまぁ、わかる。
国で定められてるなら仕方ない。
しかし、登録手数料10,700円 is 何。
もう不透明で仕方ないよね。
その他、必要書類を揃えるだけでもそこそこの出費になると思います。
まぁしかし、ベンダ資格受けてると合計2万ちょいくらいならそんなに高くないかなって気もしてきますね。
しかし各種ベンダ資格は試験会場費やら採点や講習の人件費やらその他運営費やらがあると思うのでまぁわからんでもなのですが、これは手続きやるだけやろ……という気もしなくはない。




③登録後もめんどい

o0738028313822586917.png 

登録後はオンライン講習が年1回、集合講習が3年に1回必要とのこと。
完全に社会人殺しに来てる。
そして、更に更に。


o0712011713822588840.png 

なんかサラッとかいてあるけど高ぇよ。
年間2万、3年に1回8万落とせってことですよね。
まさか、Cisco(3年以内に更新しないと失効)より悪どい方法を取ってくるとはな。
しかも集合講習に至っては
>開催場所:登録状況を考慮して決定(関東以外の開催も予定)
とのことで、状況によっては交通費もかかることに。
つーか、現時点で開催場所が超限られる予感がプンプンしている。



④たぶんあんまり意味ない
まぁぶっちゃけ、これが一番でかいですよね。
お金の話をすると、まぁ総合的にはより高くて時間がかかるベンダー資格はままあります。
Oracleを筆頭にね。
ただCiscoにせよOracleにせよLPICにせよ、持ってると確かに一定の技術を持っている証明にはなるんですよ(私が技術を持っているとは言っていない)。
少なくとも試験内容は、それなりに実務に即している。
が、現在初回登録期間で未だ誰一人として情報処理安全確保支援士を名乗れない現段階で断言しよう。

絶対これ、持ってても実務に1ミリも役立たない

情報処理推進機構が旗振ってる時点で、もう確実だと思います。
毎年講習やるんで常に最新の技術持ってることが証明出来ますよとか与太飛ばしてますが、そんな1日かそこらの講習で最新の技術身に付けられれば苦労しねーってね。

まーしかし腐っても国家資格ではあるわけなので、人事受けはもしかすると悪くないかもしれない。
この資格保有者が○人以上いない会社は何かが出来ない、とかの悪どい方法が取られることもあるかもしれない。
なので、就職する上では持ってても損はないのかもしれない。
逆説的に言えば、金払ってめんどい手続きと講習さえ我慢すれば登録は出来るわけですしね。



つまり、総合すると今の私には全く1ミリたりとも必要ない資格ということだな!
























……が、しかし。


o0400019613829670573.jpg 


取れる資格は、片っ端から全部欲しい……!




たとえ1ミリも使う予定がなくとも……!
一生使う予定がなくとも……!
欲しい……!
この世の、ありとあらゆる資格が欲しい……!


ぐあぁぁぁぁぁぁぁぁ……!
疼く……! 収集癖が疼くぞぅ……!
二度とガチャのあるゲームはしないという楔を心臓に打ち込んだはずが、まさかこんなところで危機を迎えようとはな……!




いや、まぁ、ね。
実際問題、まずは様子見っていうのが正解なのはわかりきっているのですよ。
猶予は2年あるわけですしね。
その間に有用性が見えたとか、金に余裕が出来たとか、そういう状況が見えれば登録すればいい。
……が、しかし……!
初回登録者という、今を除けば決して得られぬ肩書にどうしても惹かれてしまう……!
限定商法に弱い、典型的な日本人!


ま、まぁアレです。
しばらくしたら発作が収まるっつーか、たぶん「めんどい」の壁を越えられない案件なので、一旦は放っておこう……。
問題は、この記事を書くに当たって大体の詳細を把握してしまったため「めんどい」の壁が大幅に下がってしまっているという点だな!
わ、私の「めんどい」の壁はそう簡単に乗り越えられるもんやないから……(震え声

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のみでいけるはずだが、散々ディスられている上に見ただけで萎えたので今回は考慮していない!



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

«  | ホーム |  »

プロフィール

hamubane

Author:hamubane

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


Twitter

既刊情報

上の方は絶版じゃないよ!

お助けキャラに彼女がいるわけないじゃないですか2 (ファンタジア文庫)

最新コメント

最新記事

カレンダー

06 | 2018/07 | 08
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 31 - - - -

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

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

ブロとも申請フォーム

この人とブロともになる

QRコード

QR