布団が俺を呼んでいる

丘山大一のぶろぐ

PackageManagement に挑戦その3

前回から大分間があいた。更新についてapt update && apt upgrade 的な、プロバイダ経由で入れたパッケージの更新ってどうやるんでしょう?Update-Package [もっと読む]

PackageManagement に挑戦その3

挑戦と書きつつ、自分メモ。ChocokateyGetで入れたもので、スタートメニューに出てこないものはC:\ProgramData\chocolatey\libのどこかに落ちているので、自力でスタート [もっと読む]

PackageManagement に挑戦その2

今度は実際に入れてみる。使うプロパイダはChocokateyGet。powershellを管理者実行にして作業開始です。まず一つChocolateyGet を入れてみます。Install-Packag [もっと読む]

PackageManagement に挑戦

秋のOS見直し祭りにつき、諸々再インストール中。でも色々インストールしなおすのって面倒ですよね。というわけで、Windows のPackageManagement に初挑戦です。れっつとらい [もっと読む]

職場で開発のやり方を色々変えてみた

比較的TFS + 電話・メール +ExcelGitBucket+ Teams + Markdown [もっと読む]

サポート業務で「ありがとう」と言われてしまって反省する巻

プログラマ・エンジニアが外部から言われる「ありがとう」は嬉しいけど危険だって誰かが言ってた。 [もっと読む]

サーバの共有フォルダの中身を整理してみた

梅雨の時期は体調が悪くて……更新さぼってました。
さて、共有の名のもとにカオス化するアレを整理する話。 [もっと読む]
布団が俺を呼んでいる | 丘山大一のぶろぐ

布団が俺を呼んでいる

丘山大一のぶろぐ

Windows Server 2019 インストールしてみた (追記あり)

ダウンロードできるようになっていたので、インストールしただけという話。
手持ちのDVD-Rだと容量が足りなくてUSBメモリ経由でインストールしました。容量不足辛い。


ひとまずのインストール構成

実機:Intel NUC5i5RYH
デスクトップエクスペリエンス有

さて、この構成の問題はNUC5i5RYHのドライバはクライアントOS向けにしか提供されていないことです。
構成的にはサーバテスト用として素晴らしいのですが、これが非常にネック。
というわけで、WIn10用のドライバをゴニョゴニョしてねじ込みます。
ねじ込みかたは下記を参考にさせていただきました。

ありがたや~。


インストールとネットワーク接続直後

リモートデスクトップしてのキャプチャ。


Winverしたら「Microsoft Hyper-V Server 2019」って出るんですけどなんでですかね?
Hyper-V ServerはCUI構成のみを指していたと思っていたけど変わったのかな?
2019は情報を全然追いかけていなかったので色々分かりませんね……調べないと。


10/6 追記:
RS5に大問題発生中の模様で、MSDNからWindows Server 2019 が無くなっています。
Win10 でのアップデートだけかと思いきや、こちらにも影響が……。
ま、また入れなすのか……。

いや待て、逆に考えれば、このisoイメージは貴重品なのでは? とっとかなきゃ! ←イマココ


Intel NUC Core i7搭載 小型PCベアボーン 2.5インチ/M.2 SSD対応 BOXNUC7I7BNH

新品価格
¥60,950から
(2018/10/3 22:48時点)

WLinux 色々環境整備(主にPython)

実は、Pythonの勉強をしていた時にWindowsでは動作しないライブラリに出会ってしまいました。
そのことはGithubのIssueに載っていたのですが、そこに気が付くまでに2時間程度かかってしまいました。
(初学者にありがちな「自分の操作の何が間違っているのか」を探すのに夢中で前提条件を調べていないパターン)
また諸事情からPythonの実行環境は仮想マシンに置いていたのですが、これは実行するには重い。
ちょっと試したい時には不便すぎる。
解説記事もMac向け、すなわちunix系なものが多く、う~ん、初学者がWIndowsを使って学習するには落とし穴が多いなと感じていました。
そんなこんなで、勉強が止まっていたわけです。

以上言い訳


いざ再開の準備

WLinuxには最初からPythonが入っています。しかもGUIが使える。軽い。
というわけで、Python勉強環境の整備開始です。


Python実行環境整備

  1. pythonはすでに入っているので、仮想環境を作ります。
  2. venvを入れるため、apt-get install python3-venv
  3. 続いて、仮想環境hogehoge作成。 python3 -m venv hogehoge
  4. アクティベイトのコマンドは source [仮想環境パス]/bin/activate
  5. 現在の環境確認に which python


VSCodeのインストール

WLinuxにはVSCodeインストール用のスクリプトが準備されているため、これをたたきます。
  1. sudo /opt/installcode.sh
  2. vscodeはWindowsと同じく「code」で実行可能
  3. vscodeが起動したら、まずは日本語拡張機能を入れて日本語化。
  4. 次にpython拡張機能を入れる。


実行してみる

  1. ワークスペースに仮想環境内のpythonを指定。"python.pythonPath":"[仮想環境を入れたパス]/hogehoge/bin/python3"
  2. hoge.pyを作成し、import numpy as np をF5で実行。
  3. エラーが出ることを確認。
  4. numpyのインストール。 pip install numpy
  5. 再度F5実行。エラーが出ないことを確認。

グラフ表示

  1. pip install matplotlib
  2. import matplotlib.pylab as plt を実行。
  3. 「python3-tk」を要求するエラーが表示。
  4. sudo apt-get install python3-tk
  5. 再度F5実行。エラーが出ないことを確認。

こんなもんでしょうか。


日本語キーボードになっていない場合

ターミナル操作(Windows側)では問題なくても、Linuxの方ではしっかりと英字配列になっていることがあります。
で、そういう時どないすんねん、と思って調べていたら
sudo dpkg-reconfigure keyboard-configuration
をしろとのことでした。が、そもそもkeyboard-configurationが入っていないと怒られたので、
apt-get install keyboard-configuration
を実行したら入りました。
dpkg-reconfigure keyboard-configuration は、再起動しないと設定が反映さないぽいです。でもサービスを再起動すればいいのか分からなかったですけん、WIndowsごと再起動しましたばい。



WLinux というかX410の表示を大きくする

 xdpyinfo | grep dimensions
で解像度を見てみたら、ホスト側のWIndowsの解像度そのままだった。細かすぎて見づらい。
で、これに対応すべく解像度を上げる……のではなくスケールを上げて表示する。
最初はgnomeの設定をガチャガチャ弄って対応しようとしていたが、よく考えたら表示を司っているのはX410なのでそっちを変える。


公式情報の場所



やり方

下記コマンドのみ。
export GDK_SCALE=2
これで表示サイズが2倍になる。
わーお簡単。


そもそも表示方法を変える場合

タスクトレイにX410が常駐しているので、これを右クリックして
  • Windowed Apps
  • Floating Desktop
  • Full Desktop
を切り替えられる。
WLinux内でガチャガチャ続ける作業なら、Full Desktopで表示して、nautilus 経由等でターミナルを起動した方が便利かもしれない。
※ターミナルの表示サイズについては、上記本家をご覧ください。




WLinux を入れてみた

面白そうだったので。


概要

WIndows上でLinuxのGUIツールが動くよ!
ソースは公開しているからできる人は無償でいける!
すごいなあ。
ぼくにはとてもできない。


ぼくにはとてもできないので、ストア経由の手順

GithubのWikiに書いてある通りなんで、説明もクソもないのですが

  1. Windows Subsystem for Linux が動くようにする
  2. ストアからWLinuxをインストールhttps://www.microsoft.com/ja-jp/p/wlinux/9nv1gv1pxz6p#activetab=pivot:overviewtab
  3. WLinuxを起動してユーザとパスワード設定
  4. お約束としてsudo apt update && sudo apt upgrade
  5. ストアからX410をインストールhttps://www.microsoft.com/ja-jp/p/x410/9nlp712zmn9q#activetab=pivot:overviewtab
  6. gedit を入れてみるsudo apt-get install gedit -y
  7. X410起動(この時、バックグラウンドで動作しているので、起動しているかどうかはタスクマネージャから確認)
  8. gedit →表示される

こいつ、GUIが動くぞ! でめでたしめでたし。


上記手順後に入っているもの

  • adduser
  • adwaita-icon-theme
  • apt
  • apt-transport-https
  • apt-utils
  • aspell
  • aspell-en
  • at-spi2-core
  • base-files
  • base-passwd
  • bash
  • bc
  • bsdmainutils
  • bsdutils
  • bzip2
  • ca-certificates
  • coreutils
  • cpio
  • cron
  • dash
  • dbus
  • dbus-x11
  • dconf-gsettings-backend:amd64
  • dconf-service
  • debconf
  • debconf-i18n
  • debian-archive-keyring
  • debianutils
  • dh-python
  • dictionaries-common
  • diffutils
  • distro-info-data
  • dpkg
  • e2fslibs:amd64
  • e2fsprogs
  • emacsen-common
  • enchant
  • file
  • findutils
  • fontconfig
  • fontconfig-config
  • fonts-dejavu
  • fonts-dejavu-core
  • fonts-dejavu-extra
  • gcc-6-base:amd64
  • gedit
  • gedit-common
  • gir1.2-atk-1.0:amd64
  • gir1.2-freedesktop:amd64
  • gir1.2-gdkpixbuf-2.0:amd64
  • gir1.2-glib-2.0:amd64
  • gir1.2-gtk-3.0:amd64
  • gir1.2-gtksource-3.0:amd64
  • gir1.2-pango-1.0:amd64
  • gir1.2-peas-1.0:amd64
  • git
  • git-man
  • glib-networking:amd64
  • glib-networking-common
  • glib-networking-services
  • gnome-icon-theme
  • gnome-themes-standard:amd64
  • gnome-themes-standard-data
  • gnome-user-guide
  • gnupg
  • gnupg-agent
  • gpgv
  • grep
  • groff-base
  • gsettings-desktop-schemas
  • gstreamer1.0-plugins-base:amd64
  • gstreamer1.0-plugins-good:amd64
  • gstreamer1.0-pulseaudio:amd64
  • gstreamer1.0-x:amd64
  • gtk-update-icon-cache
  • gtk2-engines-murrine:amd64
  • gzip
  • hicolor-icon-theme
  • hostname
  • hunspell-en-us
  • ifupdown
  • init
  • init-system-helpers
  • initscripts
  • insserv
  • iproute2
  • iptables
  • iputils-ping
  • isc-dhcp-client
  • isc-dhcp-common
  • iso-codes
  • kmod
  • less
  • libaa1:amd64
  • libacl1:amd64
  • libapparmor1:amd64
  • libapt-inst2.0:amd64
  • libapt-pkg5.0:amd64
  • libaspell15:amd64
  • libassuan0:amd64
  • libasyncns0:amd64
  • libatk-bridge2.0-0:amd64
  • libatk1.0-0:amd64
  • libatk1.0-data
  • libatspi2.0-0:amd64
  • libattr1:amd64
  • libaudit-common
  • libaudit1:amd64
  • libavahi-client3:amd64
  • libavahi-common-data:amd64
  • libavahi-common3:amd64
  • libavc1394-0:amd64
  • libblkid1:amd64
  • libbsd0:amd64
  • libbz2-1.0:amd64
  • libc-bin
  • libc-l10n
  • libc6:amd64
  • libcaca0:amd64
  • libcairo-gobject2:amd64
  • libcairo2:amd64
  • libcap-ng0:amd64
  • libcap2:amd64
  • libcap2-bin
  • libcdparanoia0:amd64
  • libcolord2:amd64
  • libcomerr2:amd64
  • libcroco3:amd64
  • libcups2:amd64
  • libcurl3-gnutls:amd64
  • libdatrie1:amd64
  • libdb5.3:amd64
  • libdbus-1-3:amd64
  • libdconf1:amd64
  • libdebconfclient0:amd64
  • libdns-export162
  • libdrm-amdgpu1:amd64
  • libdrm-intel1:amd64
  • libdrm-nouveau2:amd64
  • libdrm-radeon1:amd64
  • libdrm2:amd64
  • libdv4:amd64
  • libedit2:amd64
  • libegl1-mesa:amd64
  • libelf1:amd64
  • libenchant1c2a:amd64
  • libepoxy0:amd64
  • liberror-perl
  • libestr0
  • libexpat1:amd64
  • libfastjson4:amd64
  • libfdisk1:amd64
  • libffi6:amd64
  • libflac8:amd64
  • libfontconfig1:amd64
  • libfreetype6:amd64
  • libgbm1:amd64
  • libgcc1:amd64
  • libgcrypt20:amd64
  • libgdbm3:amd64
  • libgdk-pixbuf2.0-0:amd64
  • libgdk-pixbuf2.0-common
  • libgirepository-1.0-1:amd64
  • libgl1-mesa-dri:amd64
  • libgl1-mesa-glx:amd64
  • libglapi-mesa:amd64
  • libglib2.0-0:amd64
  • libgmp10:amd64
  • libgnutls30:amd64
  • libgpg-error0:amd64
  • libgpm2:amd64
  • libgraphite2-3:amd64
  • libgspell-1-1:amd64
  • libgspell-1-common
  • libgssapi-krb5-2:amd64
  • libgstreamer-plugins-bad1.0-0:amd64
  • libgstreamer-plugins-base1.0-0:amd64
  • libgstreamer1.0-0:amd64
  • libgtk-3-0:amd64
  • libgtk-3-bin
  • libgtk-3-common
  • libgtk2.0-0:amd64
  • libgtk2.0-common
  • libgtksourceview-3.0-1:amd64
  • libgtksourceview-3.0-common
  • libgudev-1.0-0:amd64
  • libharfbuzz-icu0:amd64
  • libharfbuzz0b:amd64
  • libhogweed4:amd64
  • libhunspell-1.4-0:amd64
  • libhyphen0:amd64
  • libice6:amd64
  • libicu57:amd64
  • libidn11:amd64
  • libidn2-0:amd64
  • libiec61883-0:amd64
  • libip4tc0:amd64
  • libip6tc0:amd64
  • libiptc0:amd64
  • libisc-export160
  • libjack-jackd2-0:amd64
  • libjavascriptcoregtk-4.0-18:amd64
  • libjbig0:amd64
  • libjemalloc1
  • libjpeg62-turbo:amd64
  • libjson-glib-1.0-0:amd64
  • libjson-glib-1.0-common
  • libk5crypto3:amd64
  • libkeyutils1:amd64
  • libkmod2:amd64
  • libkrb5-3:amd64
  • libkrb5support0:amd64
  • libksba8:amd64
  • liblcms2-2:amd64
  • libldap-2.4-2:amd64
  • libldap-common
  • libllvm3.9:amd64
  • liblocale-gettext-perl
  • liblogging-stdlog0:amd64
  • liblognorm5:amd64
  • liblz4-1:amd64
  • liblzma5:amd64
  • libmagic-mgc
  • libmagic1:amd64
  • libmnl0:amd64
  • libmount1:amd64
  • libmpdec2:amd64
  • libmsgpackc2:amd64
  • libncurses5:amd64
  • libncursesw5:amd64
  • libncursesw6:amd64
  • libnetfilter-conntrack3:amd64
  • libnettle6:amd64
  • libnewt0.52:amd64
  • libnfnetlink0:amd64
  • libnghttp2-14:amd64
  • libnotify4:amd64
  • libnpth0:amd64
  • libogg0:amd64
  • libopus0:amd64
  • liborc-0.4-0:amd64
  • libp11-kit0:amd64
  • libpam-cap:amd64
  • libpam-modules:amd64
  • libpam-modules-bin
  • libpam-runtime
  • libpam0g:amd64
  • libpango-1.0-0:amd64
  • libpangocairo-1.0-0:amd64
  • libpangoft2-1.0-0:amd64
  • libpangoxft-1.0-0:amd64
  • libpciaccess0:amd64
  • libpcre3:amd64
  • libpeas-1.0-0:amd64
  • libpeas-common
  • libperl5.24:amd64
  • libpipeline1:amd64
  • libpixman-1-0:amd64
  • libpng16-16:amd64
  • libpopt0:amd64
  • libprocps6:amd64
  • libproxy1v5:amd64
  • libpsl5:amd64
  • libpulse0:amd64
  • libpython3-stdlib:amd64
  • libpython3.5:amd64
  • libpython3.5-minimal:amd64
  • libpython3.5-stdlib:amd64
  • libpython3.7-minimal:amd64
  • libpython3.7-stdlib:amd64
  • libraw1394-11:amd64
  • libreadline7:amd64
  • librest-0.7-0:amd64
  • librsvg2-2:amd64
  • librsvg2-common:amd64
  • librtmp1:amd64
  • libsamplerate0:amd64
  • libsasl2-2:amd64
  • libsasl2-modules-db:amd64
  • libsecret-1-0:amd64
  • libsecret-common
  • libselinux1:amd64
  • libsemanage-common
  • libsemanage1:amd64
  • libsensors4:amd64
  • libsepol1:amd64
  • libshout3:amd64
  • libslang2:amd64
  • libsm6:amd64
  • libsmartcols1:amd64
  • libsndfile1:amd64
  • libsoup-gnome2.4-1:amd64
  • libsoup2.4-1:amd64
  • libspeex1:amd64
  • libsqlite3-0:amd64
  • libss2:amd64
  • libssh2-1:amd64
  • libssl1.0.2:amd64
  • libssl1.1:amd64
  • libstdc++6:amd64
  • libsystemd0:amd64
  • libtag1v5:amd64
  • libtag1v5-vanilla:amd64
  • libtasn1-6:amd64
  • libtermkey1:amd64
  • libtext-charwidth-perl
  • libtext-iconv-perl
  • libtext-wrapi18n-perl
  • libthai-data
  • libthai0:amd64
  • libtheora0:amd64
  • libtiff5:amd64
  • libtinfo5:amd64
  • libtinfo6:amd64
  • libtxc-dxtn-s2tc:amd64
  • libudev1:amd64
  • libunibilium0:amd64
  • libunistring0:amd64
  • libustr-1.0-1:amd64
  • libuuid1:amd64
  • libuv1:amd64
  • libv4l-0:amd64
  • libv4lconvert0:amd64
  • libvisual-0.4-0:amd64
  • libvorbis0a:amd64
  • libvorbisenc2:amd64
  • libvpx4:amd64
  • libvterm0:amd64
  • libwavpack1:amd64
  • libwayland-client0:amd64
  • libwayland-cursor0:amd64
  • libwayland-egl1-mesa:amd64
  • libwayland-server0:amd64
  • libwebkit2gtk-4.0-37:amd64
  • libwebp6:amd64
  • libwrap0:amd64
  • libx11-6:amd64
  • libx11-data
  • libx11-xcb1:amd64
  • libxau6:amd64
  • libxcb-dri2-0:amd64
  • libxcb-dri3-0:amd64
  • libxcb-glx0:amd64
  • libxcb-present0:amd64
  • libxcb-render0:amd64
  • libxcb-shm0:amd64
  • libxcb-sync1:amd64
  • libxcb-xfixes0:amd64
  • libxcb1:amd64
  • libxcomposite1:amd64
  • libxcursor1:amd64
  • libxdamage1:amd64
  • libxdmcp6:amd64
  • libxext6:amd64
  • libxfixes3:amd64
  • libxft2:amd64
  • libxi6:amd64
  • libxinerama1:amd64
  • libxkbcommon0:amd64
  • libxml2:amd64
  • libxmu6:amd64
  • libxrandr2:amd64
  • libxrender1:amd64
  • libxshmfence1:amd64
  • libxslt1.1:amd64
  • libxt6:amd64
  • libxtables12:amd64
  • libxtst6:amd64
  • libxv1:amd64
  • libxxf86vm1:amd64
  • libyelp0:amd64
  • locales
  • login
  • logrotate
  • lsb-base
  • lsb-release
  • man-db
  • mawk
  • mime-support
  • mount
  • multiarch-support
  • nano
  • ncurses-base
  • ncurses-bin
  • neovim
  • neovim-runtime
  • netbase
  • notification-daemon
  • openssh-client
  • openssh-server
  • openssh-sftp-server
  • openssl
  • passwd
  • perl
  • perl-base
  • perl-modules-5.24
  • pinentry-curses
  • procps
  • psmisc
  • python3
  • python3-cairo
  • python3-gi
  • python3-gi-cairo
  • python3-minimal
  • python3.5
  • python3.5-minimal
  • python3.7
  • python3.7-minimal
  • readline-common
  • rsyslog
  • sed
  • sensible-utils
  • shared-mime-info
  • ssh
  • startpar
  • sudo
  • systemd
  • sysv-rc
  • sysvinit-core
  • sysvinit-utils
  • tar
  • tzdata
  • ucf
  • udev
  • unzip
  • util-linux
  • vim-common
  • vim-tiny
  • wget
  • whiptail
  • wslu
  • x11-common
  • xclip
  • xkb-data
  • xxd
  • xz-utils
  • yelp
  • yelp-xsl
  • zenity
  • zenity-common
  • zlib1g:amd64
  • zsh
  • zsh-common

で、WIndows上で動いているー、ということがぱっと見で分かりやすいようにnautilusを入れてみた結果がこちら。
Cドライブが/mnt/以下にあり、中のフォルダとファイルが見えています。




最難関だと想像されること

おそらくなんですが、Windowsユーザでbashを叩く人にとっては、上記の手順は余裕なんですよね。
ぼくにもできるくらい。
で、bashを叩く人って、ストアを滅多に使わないと思うんですよね。bashでやりたいことって基本unix系の操作だから、Windows なストアはあまり関係ないので、接点が少ない。
Windows好きなぼくですらあまりつかわない。
そんなわけで、辛いと予想するのが、
「コレ有料やんけ!滅多に使わないであろうストアにクレカ情報とか関連づけんの?」
という点だと思います。
そこで! クレカ情報登録するとかいやだ! という方はこちらをどうぞ。ギフトカードです。
結局amazon利用のためにクレカ使うという


Windows ストアギフトカード 2,000 円 (Windows/Xbox 360で利用可) |オンラインコード版

新品価格
¥2,000から
(2018/9/25 16:14時点)


デスクトップブリッジでストアに提出

これまた「ぷるまど」開発で経験したことまとめ。
2018年7月時点での、WPFアプリをUWP化し、ストアに提出する時のやり方となります。

条件と目的

元のアプリはWPF(WinFormsでも同じはず)
ストアに提出することを目的にする

やらなければならないこと

アプリをUWP化する
UWPにしたら、設定を変更する
runFullTrustが付与されることに注意する
ストアに提出する際、Centennial Program Addendum を承諾する
リジェクトされる場合、一週間程度かかる

アプリをUWP化する

既存アプリのUWP化といえば、Desktop App Converterが有名です。UWPやWindowsストアに提出するアプリを開発しようと検討すると、まずその名前が目につきます。
ストアから入手できるのと、コマンドラインから実行できるので繰り返し実施したい場合に便利です。
ですが。
ぶっちゃけ、UWP化といっても、ストアに提出する直前に一度実行し、あとはちょちょっと設定を加えるだけです。そう何度も繰り返す作業ではありません。
というわけで、GUIで操作しましょう。
Windows アプリケーション パッケージ プロジェクトを追加してUWP化します。
なんと、このプロジェクトを追加すれば、後はマウスでポチポチしていればUWPになります。
UWP化だけなら、実際の作業は
・既存のプロジェクトに「Windows アプリケーション パッケージ プロジェクト」を追加
・ターゲットバージョン指定
・UWP化するプロジェクトを指定
でほぼ完了です。

UWPにしたら、設定を変更する

といっても、これは通常のUWPの作業とほぼ同一です。
異なるのは「.appxupload」ファイルを明示的に作成すること、「runFullTrust」を与える必要がある、ことくらいでしょうが。
他にも、スタートメニュー表示用の画像ファイルを用意する必要があります。
※.appxuploadはWindows アプリケーション パッケージ プロジェクトフォルダ直下の「AppPackages」フォルダ内に作成されます。

Centennial Program Addendum

UWP化したアプリをストアに提出するときは、この契約を結ぶ必要があります。
で、この契約は必須なのですが、なんとアプリ提出の流れの中では結べません。正確には、契約内容を表示することはできるのですが、承諾できないので「あれ? どうやって承諾するの?」となります。
そして正解はパートナーダッシュボードの画面右上の歯車アイコンの「契約」から。「Centennial プログラム補遺」として別個契約する必要があります。
この契約が承諾されていない場合、MSからメールが飛んできます。

リジェクトされる場合

成功すると、普通3営業日以内にパートナーダッシュボードにその旨が表示されます。
逆に、リジェクトされる場合は3営業日を大きく超えて保留中となる場合があります。
(このリジェクトする方が時間がかかるというのがすごくキツイ)
もし3営業日を超えても、保留中の場合は、アプリや契約を見直して、すぐに再提出できるようにしておきましょう。


こんなものですかね。
基本、情報が少ない+手順が変わるので、正攻法である公式ページを都度参照するのがよいと思います。

他のアプリケーションウィンドウを操作する

この前出した「ぷるまど」の内部実装の話。

やっぱWinAPIだよね

他のアプリケーションを操作する場合、基本的にはウィンドウハンドルをどうやって取得するか、という問題に絞られます。
プロセスが分かっている場合はもちろんプロセスから攻めるわけですが、今回は「ウィンドウ」があるものをを取得したい。
というわけで、それを取得するAPIがEnumWindowsです。

    public class WinAPI
    {
        [DllImport("user32")]
        public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, IntPtr lParam);
        [DllImport("user32")]
        public static extern bool IsWindowVisible(IntPtr hWnd);
        [DllImport("USER32.DLL", SetLastError = true)]
        public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
    }

みたいな感じでテキトーに定義して、EnumWindowsを呼び出してくるくる回せば色々できます。

        WinAPI.EnumWindows((h, i) =>
        {
            if (WinAPI.IsWindowVisible(h))
            {
                WinAPI.GetWindowThreadProcessId(h,out int id);
                result.Add((h, Process.GetProcessById(id).ProcessName)); //このresultに結果を蓄えているので、後はご随意に
            }
            return true;//Trueを返すと処理が継続する
        },
        IntPtr.Zero);

「WinAPI.IsWindowVisible」を呼び出して、ウィンドウが表示されているかどうかを判定していますが、「ウィンドウは持っているけど表示されない」みたいな例外動作をするアプリケーションもあります。
代表例がexplorerのProgram Manager。
こういった特殊なアプリケーションをどう扱うかは仕様次第だと思います。
「ぷるまど」は汎用的、かつ雑なアプリということもあり、そのあたりはあまり考えないことにしました。「ぷるまど」には、他のアプリケーションの都合が分からないから、とりあえず表示しておけ、てな動作をしています。


ウィンドウ操作系API等

他にはこの辺りを、こんな感じで定義して使っています。

        [DllImport("user32", CharSet = CharSet.Auto)]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
        [DllImport("user32.dll")]
        public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
        public const int SW_RESTORE = 9;  // 画面を元の大きさに戻す
        public const int SW_SHOWNORMAL = 1;
        [DllImport("User32.dll")]
        public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
        [DllImport("user32.dll")]
        public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, int bRepaint);
        [DllImport("USER32.DLL", CharSet = CharSet.Auto)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

何をするAPIかは、名前を見てもらえば大体わかるかと……

窓断熱シート マジックミラー フィルム ガラス透明断熱フィルム 建築建物ガラスフィルム 目隠しフィルム 窓のサングラス省エネフィルム めかくしシート 窓フィルム マジックミラー 紫外線カット 飛散防止 ミラー(90cm×200cm, シルバー)

新品価格
¥2,378から
(2018/7/20 17:14時点)

アプリ「ぷるまど」 ストアに公開されました

詳細はサイトの方を見ていただくとして。

公開じゃああ

Windows Store 公開にされました。
ああ、審査に2回も落ちたよ……ふんぎゃー。

ストアからダウンロードにはこちらからどうぞ。

※詳細はブログ上部の「公開アプリ」から。


アプリ「ぷるまど」公開

またもやクソアプリ。

アプリ概要

Windows Store 公開。
する予定ですが、審査がなかなか通らないのであぷろだに仮配置。
ふんぎゃー。

※詳細はブログ上部の「公開アプリ」から。

アプリ自体について

WPFで作成しています。
ですので、.NET Frameworkが動作するWIndows デスクトップ環境なら動くかと。
WPFであるため、Windows10以外でも動きます。
裏を返せば、Windows10以外でも動かせるように、ストア以外でもなるべく配布しておきたいと思っています。

De:code2018に参加してきました

今年のお土産類、ショボくないですか?



総括

・開発言語関係のレベルアップ
・Azure機能追加
・.Net技術の展開
・Hololens アプリ開発が各社で進行中
・新デバイスの発表は(たぶん)無し
Galaxyのテスト失敗率は異常


言いたいこと

今年の参加者パーティも、何も当たりませんでした……
と書こうと思ってたら、ブラックサンダー当たりました。(200名様当選のヤツ)



いやあ、微妙……

Python と Teonsorflowの勉強環境構築

全然やる予定の無かったPythonを勉強する環境を慌てて用意している図。
ちなみに私のPythonレベルは、まだ基本構文すら暗記していないレベルです。
だから難しいこと聞かないでね(予防線)

Python環境前準備

絶対に用意するもの:ログインユーザ名が日本語でないユーザ
これは(実質)必須です。
開発者の多くは、面倒を避けるためにWindows のログインユーザは日本語を使用していないと思います。
よって、Pythonを使おうとする大部分の人は問題ないと思いますが、Micorosoftアカウントと紐づけした環境だったりすると、ログインユーザが、つまりはユーザプロファイルのフォルダパスに日本語が混じっていることがあります。
この状態だと、インストールに失敗します。
うまくいっているように見えても途中でコケます。
ええ、私はコケました(泣)
(ユーザプロファイルに日本語が混じっている環境をわざと用意しておいたんだよぅ、本当だよぅ)
そんなわけで、適当なユーザアカウントが無い人はまずそれを作成しましょう。

考えるもの:CPU版かGPU版か
機械学習なので、できればGPU……といきたいところですが、そこはご利用なさっている環境次第。
当記事では、CPU版を使用します。


環境構築手順

1:Anaconda
https://www.anaconda.com/download/#_windowsからAnacondaを拾ってきてインストールします。
特に注意することはありませんが、インストール途中でVSCodeを入れておきます。

2:tensorflow環境
Anacondaのインストールが終わったら、Anaconda Navigatorを起動。
画面左側のペインから「Environments」を選択。
続いて、画面下部にあるCreateボタンから仮想環境を作成します。

ここで「Location」にある場所に仮想環境が作成されます。後で使うので確認しておきます。
仮想環境が作成できたら、仮想環境一覧にある▶から、「Open Terminal」を選択。
pip install --ignore-installed --upgrade tensorflow
をぶちこみます。インストールにちょっと時間がかかりますので待ちます。
これでtensorflow環境自体は完了です。

3:VSCodeの準備
tensorflowの実行自体は、jupyterlabから見るのが手っ取り早いのですが、どうにも慣れないのでVSCode環境も作ります。
拡張として、
・Python
・Anaconda Extension Pack
を入れます。
また、jupyterで作成したファイルを見たい場合は、「VS Code Jupyter Notebook Previewer」を入れておくとよさげです。
さて、PythonをVSCodeで実行するのはF5キーで実行するだけなので簡単です。
ですが、tensorflowの実行環境は「仮想環境」にあるため、そのままではVSCodeはパスを参照できません。
なので、ワークスペースの設定を追加してやります。
[ファイル]-[基本設定]-[設定]から開けるので、
{
    "python.pythonPath": "C:/Users/ユーザ名/Anaconda3/envs/TensorFlow/python.exe"
}
を追加しましょう。ここのパスは仮想環境作成時に作ったパスとなります。
(ここのパスは「スラッシュ区切り」です。「バックスラッシュ」「¥」ではありません。エクスプローラからコピる人は注意)

4:実行確認
ここまできたら、あとはチュートリアルを試して動作確認。
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

そのほかの環境
これは自分メモですね。
グラフが欲しい場合はmatplotlibを入れますが、これも普通に
pip install matplotlib
で可能です。仮想環境に入れるため、Anaconda Navigatorからターミナルを開いた方がよいでしょう。
下記はテストがてら、シグモイド関数をプロットしたものです。




Pythonチュートリアル 第3版

新品価格
¥1,944から
(2018/5/13 14:50時点)