読者です 読者をやめる 読者になる 読者になる

ほのぼのぼのぼの

ひよっこエンジニアのほのぼの記録

Windows 10 から Internet Explorer 11 を削除したら PowerShell で wget が使えなくなった

概要

Internet Explorer 11 をアンインストールした Windows 10 環境において,PowerShellwget コマンドを実行したらエラーが出ました。

環境

  • Windows 10 Enterprise 2016 LTSB Evaluation
    • LTSB: Long Term Servicing Branch

エラー内容

PS C:\Users\KUBO\Desktop> wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/50.1.0/win64/kn/Firefox%20Setu
p%2050.1.0.exe
wget : Internet Explorer エンジンを使用できないか、Internet Explorer の初回起動構成が完了していないため、応答のコンテンツを
解析できません。UseBasicParsing パラメーターを指定して再試行してください。
発生場所 行:1 文字:1
+ wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotImplemented: (:) [Invoke-WebRequest], NotSupportedException
    + FullyQualifiedErrorId : WebCmdletIEDomNotSupportedException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

補足

wgetコマンドは,Invoke-WebRequestエイリアスだそうです。

PS C:\Users\KUBO\Desktop> Get-Alias wget

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           wget -> Invoke-WebRequest

その後

  • Internet Explorer 11 を再度インストールしたら使えるようになりました。
  • IEのインストール後には,一度起動して「初回起動構成」を完了させる必要がありました。

アップグレードしたWindows 10をWindows 7に戻せないとき

はじめに

Windows 10 にアップグレードした(された)ものの、ソフトウェアなどが対応してなくて、Windows 7 に戻そうとして戻せなかったときの応急処置。

ロールバックの方法は、次のサイトを参考にしました。 www.atmarkit.co.jp

症状

次のメッセージと再起動を永遠と繰り返す。永遠と。

以前のバージョンの Windows を復元しています

1時間半ぐらい再起動を繰り返した時点で、ロールバックできないんだな、と察しました。

環境

  • NEC LM750/H
    • 2012 年モデル
    • Windows 7 Home Edition プリインストール
    • Windows 8 は公式サポートしているけれど、10 はサポートしていない可哀想なPC

やったこと

  1. 再起動するタイミングで、電源を落とす。メーカロゴが表示されたタイミングで電源を切るのが理想ですが、難しかったらBIOSに入りましょう。間違えても、起動中(「復元しています」やOSブート中)に電源を切ってはいけません。普通に壊れます(もう壊れかけているけれど)。
  2. Windows 8 以上の、つまりUEFI世代のセットアップディスクで起動します。今回はたまたまそこにあったWindows8のディスクを使いました。
    そんなディスクなどない場合は、Windows 10 ISOで作成できます。*1
  3. セットアップディスクで起動したら、「コンピュータを修復する」を選択します。
  4. 「続行」
  5. 起動するOSを選択します。
    Windowsロールバック」と「Windows 10」が表示されているかと思います(記憶あやふや)。Windows10を選択します。
  6. すると、久しぶりのWindows 7が起動しました。なおロールバックに失敗しているので、起動に相当時間かかります。エクスプローラも起動しないかもしれません。そんな場合は、タスクマネージャを起動(Ctrl+Shift+Esc)をして、「新しいタスクの実行」からファイルを操作しましょう。もしくは、メモ帳(notepad.exe)を起動して、「名前をつけて保存」のダイアログから操作します。*2
  7. 起動したWindows7は、システムファイルが破壊されてて全く使い物になりません。そのままの利用は諦めましょう。どうにか起動したらバックアップをとりましょう。各種ソフトウェア(メーラーとか)の設定を控えましょう。今やらないと二度と起動しないかもしれません。
  8. ファイルが救出できたら、再インストールしましょう!

うちの環境で動かなかったソフトウェア

  • 一太郎2008 + ATOK
    • ATOK がだめだった。ストア系アプリで全く入力できない。なおシステムファイルも壊れる模様。

blog.goo.ne.jp

あとがき

これ、家族のPCでのことだったんですが、勝手にアップグレードしてシステムファイル破壊するなんて、まったくテロだよテロ。
でも、個人的にはWindows10はサクサク動くのと仮想デスクトップに対応しているので好き。

というわけで、新しい一太郎を買ったのでした。

それにしても一太郎、未だにEscキーでメニューが表示されて驚き。MS-DOSな操作感で古くからのユーザにとても優しい。 www.justsystems.com

*1:Windowsでアクセスするとインストーラ作成ツールがダウンロードされますが、そんなのがめんどくさい場合は、Windows以外のPC(MacとかMacとかMacとか)でアクセスしましょう。ISOファイルが普通にダウンロードできます。あとは、回復ドライブを作成しましょう。 http://pcfan.121ware.com/useful/1010/

*2:余談ですが、これ、WindowsPEなどExprolerが起動しないときにも使える技です。

Raspberry Pi と交通系ICカードを使ったポイントシステム(ソフトウェア編)

ポイントシステムをつくる

概要図はこんな感じ。 f:id:u9bo:20160626215531p:plain raspi+カードリーダでIDを読み取り、ID情報をサーバへ送信して集計します。 raspiはクライアントとして利用します。そうすることで、今後のraspi増設にも対応できそうです。

もろもろ開発

まずは、nfcpyをpathの通っている場所へ移動します。

$ sudo mv /root/nfcpy /usr/local/lib/nfcpy

こんなプログラムnfctest.pyを作成します。 ライブラリにpygameurllib2を使用しています。 Python初心者なのでもっと良い書き方あるかも。

import binascii
import nfc
import urllib
import urllib2
from urllib2 import Request, urlopen, URLError
from pygame import mixer


class MyCardReader(object):
    def __init__(self):
        mixer.init()
        self.alert = mixer.Sound('./beep.wav')
    
    def on_connect(self, tag):
        print "touched"
        self.idm = binascii.hexlify(tag.idm)
        return True

    def read_id(self):
        clf = nfc.ContactlessFrontend('usb')
        try:
            clf.connect(rdwr={'on-connect': self.on_connect})
        finally:
            clf.close()

    def put_http(self):
        url = 'http://hogehoge.com/nfc.php'
        values = {'id':self.idm}
        data = urllib.urlencode(values)
        req = urllib2.Request(url,data)
        try:
            response = urllib2.urlopen(req)
            self.httpres = response.read()
        except URLError, e:
            if hasattr(e, 'reason'):
                print 'We failed to reach a server.'
                print 'Reason: ', e.reason
            elif hasattr(e, 'code'):
                print 'The server couldn\'t fulfill the request.'
                print 'Error code: ', e.code
        else:
           print self.httpres

    def playsound(self):
        self.alert.play()

if __name__ == '__main__':
    cr = MyCardReader()
    while True:
        print "touch card:"
        cr.read_id()
        print "released"
        print cr.idm
        cr.put_http()
        cr.playsound()

プログラムの概要を説明すると、

  1. ICカード読み込み
  2. カードIDを集計サーバのhttp://hogehoge.com/nfc.phpへ送信

  3. 情報を送信したら./beep.wavを再生

といった感じです。 平文でIDを送信するのはなんだか怖いので、本格的に利用する場合は暗号化など考慮する必要がありそうです。

集計サーバのhttp://hogehoge.com/nfc.phpはこんな感じ。

<?php
$id = $_POST['id'];
if (!empty($id)) {
    date_default_timezone_set('Asia/Tokyo');
    $fp = fopen("./nfclog.txt", "a");
    $str = date('Y-m-d H:i:s')."\t".$id."\n";
    echo $str;
    fwrite($fp, $str);
    fclose($fp);
} else {
    echo "id未指定¥n";
}

$_POST['id']./nfclog.txtに記録しているだけです。 本格的に使う場合は、DBへ登録するようにしたらよいですね。

動かしてみた

うごかしてみました。

$ sudo python nfctest.py 
touch card:
touched
released
xxxxxxxxxxxxxx
2016-06-26 18:25:40 xxxxxxxxxxxxxx

こんな感じで、

  • 読み取ったID
  • サーバのレスポンス(タイムスタンプとID)

が表示されます。

今後の予定

  • プログラムnfctest.pyのデーモン化
  • 集計システムの開発

qiita.com

blog.shibayan.jp

Raspberry Pi と交通系ICカードを使ったポイントシステム(環境構築編)

はじめに

前回は、RaspberryPi(raspi)のセットアップをしました。 9bo.hateblo.jp 今回は、ICカードを読み取るための環境構築をします。

開発環境

開発メモ

ソフトウェアのインストール

まずは、NFCカードリーダで、カードを読み取るところまでやってみます。 今回はnfcpyというPythonのライブラリを使用しました。 Pythonは標準で入っているようなので、pipとbzrをインストール

yum install bzr python-pip

nfcpyの導入

公式ドキュメントを参考に導入します。

Getting started — nfcpy latest documentation

$ pip install libusb1 pyserial
$ mkdir ~/nfcpy
$ cd ~/nfcpy
$ bzr branch lp:nfcpy trunk

NFCカードリーダを接続して、raspi上で認識されているか確認

$ lsusb
Bus 001 Device 004: ID xxxx:xxxx Sony Corp. 

認識されていますね。

では、サンプルプログラムを動かしてみましょう。 pythonでUSB機器を操作する場合には、sudoで動かす必要があることに注意してください。

$cd ~/trunk
$sudo python examples/tagtool.py show
[nfc.clf] searching for reader on path usb
[nfc.clf] using SONY RC-S380/P NFC Port-100 v1.11 at usb:001:004
** waiting for a tag **
Type3Tag 'FeliCa Standard (RC-S???)' ID=xxxxxxx PMM=xxxxx SYS=0003

tagtool.pyを起動して、適当なICカードをタッチすると、固有IDが読み取れていることが確認できます。

次回は、今回作成した環境を用いて、ソフトウェアを作成します。

参考文献

qiita.com

blog.shibayan.jp

Raspberry Pi と交通系ICカードを使ったポイントシステム

SuicaPasmo などの交通系ICカード電子マネーとしての用途以外に、最近では電子錠やタイムカードなどにも利用されるようになりました。 これらはそれぞれのカード固有の番号(ID)を使って、システムやサービスを実現しています。

一人1枚は持っているこのご時世、ICカードを使って何かシステムを作れたら夢が広がりそうです。 例えば、みんなでタッチしてポイントを貯めるとか。簡易タイムカードとして使うとか。 朝8:00までにタッチしたら2ポイント、8:30までにタッチしたら1ポイントなどと個人ごとにポイントを競い合うシステムなんてものも作れそうです。

今回は、ICカードリーダとRaspberry Piを使ってポイントシステムを制作してみます。

Raspberry Pi のセットアップ

VNCを利用したNOOBS操作

セットアップには最低でもキーボードとディスプレイが必要ですが、今回はVNCを使って、別のPCからセットアップしてみました。 NOOBSをダウンロードして、recovery.cmdlineを次のように書き換えます。 変更前

runinstaller quiet ramdisk_size=32768 root=/dev/ram0 init=/init vt.cur_default=1 elevator=deadline

変更後

runinstaller vncinstall ramdisk_size=32768 root=/dev/ram0 init=/init vt.cur_default=1 elevator=deadline

つまり、quitを削除してvncinstallを追加します。

参考文献

www.slideshare.net 自動インストールなどもできるそうな。

qiita.com

OSインストール

では、Raspberry Pi を起動し、VNCで接続してみます。 今回は、VNC ViewerでRaspberry Pi のipアドレス:5900にアクセスします。 f:id:u9bo:20160612213929p:plain こんな感じでアクセスできました。

OSは、Debian系のRASPBIANではなくFedoraに近いpidoraにしました。

今回はここまで。 次回は、ICカードリーダを使う設定などを進めます。

余談

手元のノートPCからサーバマシンなど操作する需要は(個人的には)結構あって、 キーボード・ディスプレイ・マウスの3点セットをノートPC上で実現するKVMコンソールにあこがれます。 tsuchinoko.dmmlabs.com

はじめてのSQL

とても個人的な備忘録なのですが、初めてのSQLを触った自分がこの先も覚えておこう(でも忘れそう)と思ったコマンドたち。 殴り書きなので、表現の間違えなどご容赦ください。

テーブルを探す

9boを含むテーブルを探す場合

SHOW TABLES LIKE '%9bo%'

テーブルのコメント

SELECT 
    table_name, 
    table_comment 
FROM 
    information_schema.tables 
WHERE
    table_name='テーブル名'

カラムのコメント

show full columns from テーブル名

カラム構成

desc テーブル名;

テーブルの構成

show create table テーブル名

参考になりそうなページ

MySQL :: MySQL 5.6 リファレンスマニュアル

Linuxbrew で始める Go 言語

Golangを勉強してみたくて、前回構築した開発環境*1にインストールしてみました。

WindowsだとZipアーカイブあるいは、MSIインストーラを使った方法が用意されていますが*2、 どのソフトウェアに対してもほぼ言えることですが、アップデートがやっかいです*3。 Linuxbrewを使うと簡単にインストールできます。

インストール

$ brew update
$ brew install go

Macのときと同じぐらい簡単です。

インストールできたか確認

$ which go
~/.linuxbrew/bin/go
$ go version
go version go1.6 linux/amd64

実行してみましょう!

おなじみのプログラムを書きます。

package main
import "fmt"

func main() {
    fmt.Printf("Hello, world!\n")
}

では、実行してみましょう。

$ go run test.go
Hello, world!

動きました! Golangを使える環境が整いました!これから設定など進めていきます。

*1:Mac ユーザが Fedora 23 で開発できるようになるまで。 - ほのぼのぼのぼの

*2:Go言語のインストール - golang.jp

*3:Windowsにインストールされたapache+PHPのアップデートがとても辛かった経験があります。二度とやりたくない。ぷんぷん。