月別アーカイブ 4月 2019

takahashi 著者:takahashi

Intel HD Graphics コントロールパネルが開かない時に確認したいこと

先日、Windows10 October 2018 Update(1809)を適用した後あたりから、グラフィックドライバの設定がおかしくなり(無効化していたはずのバッテリー駆動時のフレームレートを低下させる機能が再び有効になっていた)、唯一の設定手段であるIntel HD Graphics コントロールパネルを開こうとしたところ、

このスプラッシュ画面までは表示されるものの、何度試しても肝心のコントロールパネルは一向に表示されません。

Windows 10でのIntel HD Graphics問題の対処法(更新) – Windows 10 Solomonレビュー[redémarrage]

こちらの情報も参考にしていろいろ試したのですが、何度ドライバを入れなおしても一向に解決しませんでした…

困り果ててOSのバージョンのロールバックも考えたのですが、その前に「もしかしたら開かない原因がイベントビューア(システムログビュアー)に落ちているのでは」と思いダメ元で見てみました。

すると…

障害が発生しているアプリケーション名: Gfxv4_0.exe、バージョン: 8.15.100.6472、タイム スタンプ: 0x5c0ebadd
障害が発生しているモジュール名: amdvlk64.dll、バージョン: 1.0.39.0、タイム スタンプ: 0x5a4370eb
例外コード: 0xc000041d
障害オフセット: 0x000000000000ae51
障害が発生しているプロセス ID: 0x5a98
障害が発生しているアプリケーションの開始時刻: 0x01d4f425b8b07ceb
障害が発生しているアプリケーション パス: C:\WINDOWS\System32\DriverStore\FileRepository\igdlh64.inf_amd64_555cfc07a674ecdd\Gfxv4_0.exe
障害が発生しているモジュール パス: C:\WINDOWS\System32\amdvlk64.dll
レポート ID: ...
障害が発生しているパッケージの完全な名前: 
障害が発生しているパッケージに関連するアプリケーション ID: 

このようなエラーを発見。

Gfxv4_0.exe はIntel HD Graphics コントロールパネルの一部であり、これが何らかのエラーで止まってしまったというまさにドンピシャのエラーが記録されていました。

原因となっている amdvlk64.dll ですが、名前の通り、AMD製グラフィックドライバー周りのファイルだと思われます。

実は問題が起きたPCには、外部GPUとしてAMD製のグラフィックカードであるRadeonが搭載されていて、そのチップ用のグラフィックドライバもインストールされているのですが、確認したところ、何故か古いバージョンのものに戻ってしまっていました。

そこで、AMD Radeon公式サイトから、自動アップデートツールを入手して、ドライバのアップデートを実行しました。

AMD公式のドライバ配布ページに行き、赤枠のアプリをダウンロードすれば、GPUのモデルがわからなくても自動で最適なドライバをインストールしてくれます。
アップデート完了後のドライバユーティリティの画面。旧バージョンにはなかった”アップデート”の文字が追加されました。

ドライバのインストール完了後、一度再起動を行い、再度HD Graphicsコントロールパネルを開いたところ…

無事表示されるようになっていました!!!
まさか、他社製のグラフィックドライバが足を引っ張っていたとは…

ということで、何かトラブルが起きたときはまずログを確認しましょう。

…というお話でした(汗

  • この記事いいね! (0)
takahashi 著者:takahashi

PHPでMS SQL ServerをCygwinで使うべきではない理由

何故なら、公式のMSSQLドライバがCygwin用に提供されていないからです。

GitHubのMicrosoftの公式リポジトリでも、Cygwinはサポートしないとはっきりと明言されています。

Driver in cygwin enviroment #258 – GitHub

Transact SQL クライアントのオープンソースの実装であるFreeTDSについてはCygwinにもドライバがあるので、これを使えば”とりあえずは”Cygwin上のPHPからSQL Serverへ接続することはできます。

しかしFreeTDSではSQL文実行後一定時間経過しても結果が返ってこない場合、接続を切ってしまううえ、この仕様を修正するにはFreeTDSのソースを修正するしかない、という状況になっているようです。(調べて見つけた記事にそのようなことが書かれていたのですが、その記事のURLを見失ってしまいました…また見つけたら追記します。)

代替えとして、Windowsネイティブでありながら、基本的なLAMP環境を簡単に動作させることができるXAMPPというパッケージがあります

XAMPP

こちらなら、SQL Serverの公式PHPドライバが利用可能ですので、 個人的にはこちらを利用するのがおすすめです。

本当はUNIXライクなOSで動作させるのが一番なのですが、もしWindowsでどうしても…という方は一度検討してみてください。

  • この記事いいね! (0)
著者:杉浦

【Chrome】任意のJavaScriptを自動実行するChrome拡張であるScriptAutoRunnerの紹介

ScriptAutoRunner – Chrome ウェブストア
 ScriptAutoRunnerはあるページに移動した時に自動でJavaScriptを実行するChrome拡張です。これを使うとページを開いてブックマークレット、ページを開いてブックマークレット、ページを開いてブックマークレット、……という作業から解放されます。
 使い方はインストールして、オプションからコード記述画面へ移動。対象ページのドメインと実行コードを記述するのみです。例えば次の様に使えます。

 このブログの右サイドバーにのみ使われているクラスcol-md-4から右サイドバーを参照、style.display=’none’で画面上から削除。メインコンテンツでのみ使われているクラスcol-md-8でメインコンテンツを参照、メインコンテンツのクラスを空にすることで、クラスにかかったstyleによる横幅指定を解除。これが自動実行のため次の様になります。

 ページを開くたびにサイドバーが消えて、記事に集中できるようになりました。

  • この記事いいね! (2)
asaba 著者:asaba

【javaScript】fetchApiでレスポンスをxmlに変換する方法

ajaxのように手軽に書けつつ早いapiであるfetchApiでxmlを取ってくる方法を探していたのですが、中々見つからなかったので

こんな感じで仕立ててみました。基本的な書き方はJqueryのajaxと変わらないので、ajaxを使ったことのある方ならばすぐに要領を掴め

そうですね。


postfetch() {

//通常のレスポンスを返す
.then(function (response) {
console.log(response);
})
//xmlに変換
//.then(function (response) {
//const text = new DOMParser().parseFromString(response, "text/html")
//console.log(text);
//})
}

レスポンスで受け取ったデータを即座にDOMParserでxmlで変換するだけなので、コンソールで確認できたら後は自由に使うことが
できます。
最後に言うのもアレなのですが、fetchでxmlを扱う場合は、速度にこだわらない場合はajaxでも代用が利きます。

  • この記事いいね! (0)
takahashi 著者:takahashi

fuelPHP + PDO_sqlsrvでストアドプロシージャ実行時にIMSSPエラーが出てきたときの対処法

FuelPHP上でMSSQLサーバーにあるストアドプロシージャを実行しようとしたところ、こんなエラーが発生。

PDOException [ IMSSP ]:
SQLSTATE[IMSSP]: The active result for the query contains no fields.
エラー

見慣れないエラーコードだったので少し戸惑いましたが、調べてみたところ、解決策が見つかりました。

“The active result contains no fields” using PDO with MS SQL – Stack Overflow

このエラーが出た場合、実行するSQL文の前に

SET NOCOUNT ON;

を実行しておくとエラーを回避できるようです。

このオプションを追加したところ、自分の環境でもエラーが出なくなりました。

同じエラーでお困りの方は、是非試してみてください。

  • この記事いいね! (0)
asaba 著者:asaba

【androidJava】BroadcastReceiverを試しに使ってみる

BroadcastReceiverとは、何かのタイミングで端末に特定の処理を通知するときによく使われる便利なライブラリです。

軽い機能であればfirebaseよりも手軽に実装することができるので、息抜きにミニアプリを作ってみたいと思ったときに試してみて

ください。

自分が書いたコードはこんな感じに仕上がりました。まずボタンを押すと、pickerがでてきます。そのpickerを使って時間を指定して、その時間になったらトーストで時間ですよ~とお知らせするシンプルなものになっております。お休みのときにささっと書いたので情報少しが古い&コードが乱雑ですがご容赦くださいまし。

MainActivity↓

</pre>
<pre>public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimePicker();
            }
        });
        }
        public void TimePicker(){
            final Calendar calender = Calendar.getInstance();
            int hour = calender.get(Calendar.HOUR_OF_DAY);
            int minute = calender.get(Calendar.MINUTE);

            TimePickerDialog dialog = new TimePickerDialog(
                this,
                new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        System.out.println(hourOfDay);
                        calender.setTimeInMillis(System.currentTimeMillis());
                        calender.add(Calendar.SECOND, 5);

                        Intent intent = new Intent(getApplicationContext(),
                                AlarmBroadcastReceiver.class);
                        PendingIntent pending = PendingIntent.getBroadcast(
                                getApplicationContext(), 0, intent, 0);
                        // アラームをセットする
                        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                        if (am != null) {
                            am.setExact(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), pending);

                            Toast.makeText(getApplicationContext(),
                                    "Set Alarm ", Toast.LENGTH_SHORT).show();
                        }
                    }
                },
                hour,minute,true) ;
            dialog.show();
        }
}</pre>
<pre>

今回のお題であるBroadcastReceiverです。

</pre>
<pre>public class AlarmBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // ここに端末に対してしたい処理を書きます。例ではトーストになっているので変えても構わないです。
        Toast.makeText(context, "Received ", Toast.LENGTH_LONG).show();
    }
}</pre>
<pre>

マニフェストには、パーミッションでWAKE_LOCKを設定しておきます。

その後に、applicationタグのすぐ上に”AlarmBroadcastReceiver”を定義しておきます。これがないとBroadcastReceiverが反応しない

ので忘れないでくださいね。

</pre>
<pre><uses-permission android:name="android.permission.WAKE_LOCK"/></pre>
<pre><application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <receiver android:name=".AlarmBroadcastReceiver"
              android:process=":remote" />
</application></pre>
<pre>

レイアウトのほうはボタンだけなので割愛させていただきました。コードの量も少なめで実装できるので、メンテナンスにも苦労しなさそうです。おすすめです。

  • この記事いいね! (0)
著者:杉浦

【Laravel】Bladeで直書きJavaScriptのコンポーネントを作る時の勧め

BladeはシンプルながらパワフルなLaravelのテンプレートエンジンです。
Bladeテンプレート 5.7 Laravel

 BladeはLaravelで用いられるテンプレートエンジンであり、PHPの構文を書きやすく、読みやすい形でHTMLに埋め込みます。例えば

<?php if(auth()->guard('admin')->check()): ?>
  <div class="alert alert-danger">
    <?php echo e($slot); ?>

  </div>
<?php endif; ?>

ならばBladeでは

@auth('admin')
<div class="alert alert-danger">
    {{ $slot }}
</div>
@endauth

と記述できます。
 Bladeはコンポーネント指向――多数の部品を組み合わせることで完成品を作る考え――の元にwebページを作ることが出来ます。例えば、

@section('link_button')
    <a class="btn btn-primary font-weight-bold text-white" href="{{$link}}">
        {{$text}}
        <i class="fa fa-angle-right fa-lg right -pull-right"></i>
    </a>
@overwrite
@yield('link_button')

と定義すると

@include('link_button',['text'=>'hoge','link'=>'/hoge'])
@include('link_button',['text'=>'fuga','link'=>'/fuga'])
@include('link_button',['text'=>'foo','link'=>'/foo'])

と呼び出した時に/hoge, /fuga, /fooそれぞれに飛んでいくボタンの見た目のリンクが作られます。この仕組みはJavaScriptに応用できます。
 やり方はscriptタグを書いたコンポートを定義するだけです。例えば、

@section('alert_by_javascript')
<script>
    if (document.readyState !== 'loading') {
      alertHoge()
    } else {
      document.addEventListener('DOMContentLoaded', alertHoge);
    }
    function alertHoge(){
      alert({{$hoge}});
    }
</script>
@overwrite
@yield('alert_by_javascript')

と定義して

@include('alert_by_javascript',['hoge'=>'hoge'])
@include('alert_by_javascript',['hoge'=>'fuga'])
@include('alert_by_javascript',['hoge'=>'foo'])

 と呼び出すと、hoge, fuga, fooと文字列を表示するalertが発生します。パッと使うだけならこの通り簡単なのですが、注意点は素のJavaScriptを書いている点で問題点が発生します。深刻なのはグローバル汚染です。全て同じ階層にあるため他コンポーネントと変数名、関数名が被った時に容易にバグります。
 解決方法の一つは常に即時関数で囲みスコープを作ることです。こうするとコンポーネントの外に漏れることはありません。しかし、外部で使いたい時もあります。グローバル汚染を防ぎながら外部でJavaScriptを適宜呼び出せるようにする方法が次です。

@section('auto_redirect_to_top_script')
  @php
    // グローバル汚染回避のためにランダムな文字列か指定された文字列を名前に持つ関数を作る
    $function_name = $function_name ?? str_random();
  @endphp
  <script type="text/javascript">
    if (document.readyState !== 'loading') {
      {{$function_name}}();
    } else {
      document.addEventListener('DOMContentLoaded', {{$function_name}});
    }
    function {{$function_name}}(){
      alert({{$hoge}});
    }
  </script>
@overwrite
@yield('alert_by_javascript')

 関数の名前を呼び出す際に関数名を決めます。こうするとスコープは閉じたままで、外から任意に呼び出せます。

@include('alert_by_javascript',['hoge'=>'hoge','function_name' => 'hoge_function'])// hoge_function()が走る
@include('alert_by_javascript',['hoge'=>'fuga','function_name' => 'fuga_function'])// hoge_function()が走る
@include('alert_by_javascript',['hoge'=>'foo'])// `${ランダムな文字列}`()が走る

 この手法の注意点はやはり素のJavaScriptを書いている点です。古いIEを代表とするいくらかのブラウザは近年のJavaScriptの記述を読み取れず、実行できません。このコンポーネントに書かれているJavaScriptはほぼそのままwebページに表示されます。なんとなくで記述を行うといくらかのブラウザではJavaScriptを実行してくれません。他にも圧縮、難読化、コメントなど素のJavaScriptそのままならではの問題点が出てきます。

  • この記事いいね! (1)
著者:ym

開封通知メールのenvelope-Fromは”<>“

開封通知要求の付くメールに対して、メールソフトが自動で開封通知を送信する場合、Sender: ヘッダー、envelope-From は <> にしないといけないらしい。

最近、迷惑メール防止の為、envelope-From が <> のメールを受け取らない事業者が非常に多いんですよねぇ。 RFC 的には <> のメールも受け取らなければならない、と記述はあるようですが。
非常に困ります。

RCPT TO はあるのに、MAIL FROM (envelope-From) が空なので、拒否られたメールはサーバ運営側へ宛先不明として到着します。

やむを得ず、捨てるしかないのですが。開封通知を送信した当人に対して「自動応答って意味ないって。回答停止しようよ。ほら、相手が拒否したよ。」的なメールを送信したほうが良いのだろうか。

本文にある 「Final-Recipient: rfc822;」欄のメールアドレス宛に戻す様なプログラムで。。

いや、他はみてないけど自動応答については MDN の仕様変えて envelope-from つけてよ。

  • この記事いいね! (0)
takahashi 著者:takahashi

WSLでWindows側のドライブをマウントする方法

Windows上でLinuxの環境を動作させることができるWindows Subsystem for Linuxですが、実は外部ドライブを接続した際、自動で認識してくれない仕様になっています。

恐らく、自動でマウントしてしまうと、取り外すときにややこしいことになる(安全な取り外しができなくなるなど)可能性があるのが理由なのだとは思いますが、そうは言ってもWSLから外付けドライブに直接アクセスしたいときももちろんあります。

実は、自動的にマウントはされないものの、デバイスを接続後にWSL上からコマンドでマウントを行うことが可能です。

Windows 10の「WSL」でネットワークドライブなどをマウントする – @IT

次のようにコマンドを入力します。

#(まだない場合は)マウント先のディレクトリを作成
mkdir -p ディレクトリのパス
#作成したディレクトリに実際にデバイスをマウント
mount -t drvfs デバイス名 マウントポイント(ディレクトリ名)

デバイス名は、マウントする対象のドライブ、マウントポイントはマウント先をそれぞれしていします。

例えば、Windows上の”E ドライブ “をWSLにマウントしたい場合、

mkdir -p /mnt/e #ない場合のみ
mount -t drvfs :E /mnt/e

のようにすればマウントされ、WSL上では /mnt/e の中に外部ストレージの中身が入った状態になります。

外すときは

umount /mnt/e

でマウントを解除できます。

マウントの自動化などの詳しい操作方法は上記の参考サイトを参考にしてください。

  • この記事いいね! (0)
著者:杉浦

データを扱う単位と末尾の=に注目しながらBase64の説明

 この記事で扱うBase64は
RFC 4648 – The Base16, Base32, and Base64 Data Encodings#section-4
で定義されている素朴なBase64です。URLセーフなものであったり、固定長で区切られたりするBase64は取り扱いません。

 Base64はオクテットデータ(8bit単位のデータのこと。現代では1byteと同義)を限られた表現空間で自由に表すために生まれた形式です。Base64形式による変換をオクテットデータに実行することで、英数字とほんの少しの記号しか使えないかつての電子メールの様な表現空間で、画像、音楽といったそのままでは表せないデータを表せるようになります。Base64は次の64文字とパディング1文字で自由にバイナリを表します。


     Value Encoding  Value Encoding  Value Encoding  Value Encoding
         0 A            17 R            34 i            51 z
         1 B            18 S            35 j            52 0
         2 C            19 T            36 k            53 1
         3 D            20 U            37 l            54 2
         4 E            21 V            38 m            55 3
         5 F            22 W            39 n            56 4
         6 G            23 X            40 o            57 5
         7 H            24 Y            41 p            58 6
         8 I            25 Z            42 q            59 7
         9 J            26 a            43 r            60 8
        10 K            27 b            44 s            61 9
        11 L            28 c            45 t            62 +
        12 M            29 d            46 u            63 /
        13 N            30 e            47 v
        14 O            31 f            48 w         (pad) =
        15 P            32 g            49 x
        16 Q            33 h            50 y

RFC 4648 – The Base16, Base32, and Base64 Data Encodings#section-4

 6bit分のバイナリパターン2^6=64種それぞれに英数字と記号を割り振ることによって、英数字と記号のみで自由にデータを表します。64文字を使うからBase”64″なわけですね。
 アルファベットの大文字26文字、小文字26文字、数字10文字、記号2文字の合わせて64文字が0個以上連なった文字列が主なデータ部になります。これは[0-9a-zA-Z+/]*で正規表現として記述できます。これの64文字を4文字ずつ使い6*4=24bit、つまり3byteずつデータを表現するのが基本です。例えば次の様になります。

8bit単位のデータを用意
01010111 00100101 11011101 01101100 01011100 01101010
↓6bitずつで区切る
010101 110010 010111 011101 011011 000101 110001 101010
↓10進数に変換
25 62 27 35 33 5 61 52
↓対応する文字に変換
Z + b j h F 9 0
↓24bitを表す4文字ずつにまとめる
Z+bj hF90

 変換過程は人間の目で整理できるように示してあります。実際はbitのまま取り扱うので実装したコードはけっこうシンプルです。
 24bitずつ8bit単位のデータを区切っているので余りが生まれます。この余りを処理するために、65文字目である=が変換後の文字列末尾に足される時があります。この=の付け足しは={0,2}で正規表現として表せます。4文字ずつ文字列を作るのに、末尾の=の数が0,1,2の3種類に限られるのは8bit単位のデータを24bitずつ文字列まとめているからです。余りなし、8bit余り、16bit余りの3種類しかないわけですね。余り0のパターンは最初の例です。余り8bitのパターンを例にすると次の様になります。

24bitずつ区切った時8bit余る8bit単位のデータを用意
01010111 00100101 11011101 01101100
↓6bitずつで区切る
010101 110010 010111 011101 011011 00
↓6bitずつで区切った時点で余っている2bitを6bitになる様4個の0で埋める
010101 110010 010111 011101 011011 000000
↓10進数に変換
25 62 27 35 33 0 
↓対応する文字に変換
Z + b j h A
↓24bitを表す4文字ずつにまとめる
Z+bj hA
↓24bitを表す4文字ずつにまとめた時余っている2文字が4文字になる様に=で埋める
Z+bj hA==

余り16bitのパターンを例にすると次の様になります。

24bitずつ区切った時16bit余る8bit単位のデータを用意
01010111 00100101 11011101 01101100 01011100
↓6bitずつで区切る
010101 110010 010111 011101 011011 000101 1100
↓6bitずつで区切った時点で余っている4bitを6bitになる様2個の0で埋める
010101 110010 010111 011101 011011 000101 110000
↓10進数に変換
25 62 27 35 33 5 48
↓対応する文字に変換
Z + b j h F w
↓24bitを表す4文字ずつにまとめる
Z+bj hFw
↓24bitを表す4文字ずつにまとめた時余っている3文字が4文字になる様に=で埋める
Z+bj hFw=

 文字列からオクテットデータの変換は逆方向に行うだけです。デコードも三種類のパターンがあるわけですね。
 どの様な8bit単位のデータでも64種の文字の連なりと1種の文字の付け足しで表せることとその変換方法がわかりました。次の正規表現はBase64形式を表現する正規表現です。

[0-9a-zA-Z+/]*={0,2}
  • この記事いいね! (0)