2013/12/08

CentOS に rbenv で ruby2 と Rails4 の環境を構築する

最近、立て続けに似たような環境を構築したので、まとめます。キモは CentOS 6.4 に rbenv で ruby 2 の Rails 4 、 PostgresqL9 環境の構築です。

CentOS 6.4 のインストール

仮想マシン上に構築します。ホストOSは、Windows7 です。VMware で、32bit 版です。
OS のインストールは、特にこれといって特別なことはありません。ただ、後でいろいろなものを追加インストールするのが面倒なので、インストールタイプは Software Development Workstation にしています。

ひと通りインストールが済んだら、作業ユーザを sudo に追加します。

# visudo

workuser  ALL=(ALL)  ALL

あとで必要になるパッケージをインストール

$ sudo yum install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel

PostgreSQL のインストール

既に古いバージョンの PostgreSQL がインストールされていますので、削除します。

# yum list installed | grep postgres

見つかったものを削除

yum remove postgresql.i686 postgresql-libs.i686

最新版を取ってきます。

# wget -P /tmp http://yum.postgresql.org/9.3/redhat/rhel-6-i386/pgdg-centos93-9.3-1.noarch.rpm

ここでは 32bit 版をインストールしています。

# rpm -ivh /tmp/pgdg-centos93-9.3-1.noarch.rpm

# yum install -y postgresql93-server postgresql93-devel postgresql93-contrib

データベースの初期化

# /etc/rc.d/init.d/postgresql-9.3 initdb

サービスの開始

# /etc/rc.d/init.d/postgresql-9.3 start

自動起動に登録

# chkconfig postgresql-9.3 on

確認します

# su - postgres

$ psql

psql (9.3.2)
"help" でヘルプを表示します.

postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権      
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres          +
           |          |                  |             |                   | postgres=CTc/postgres
(3 行)

postgres=#

rbenv のインストール

インストール用のスクリプトを作ります。

※この方法、ググって調べて真似しています。どこのサイトだったか失念してしまいました。元作者の方、ごめんなさい、そしてありがとうございます。

 $ vi rbenv-install.sh

内容は

 MY_GROUP="workuser"
if [ "$MY_GROUP" = "" ] ; then
    echo '!!! undefined variable MY_GROUP.'
    echo '!!!'
    echo '!!! ex.) MY_GROUP=staff'
    echo '!!!'
    exit 1
fi

cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
mkdir rbenv/shims rbenv/versions
chgrp -R $MY_GROUP rbenv
chmod -R g+rwxX rbenv

git clone git://github.com/sstephenson/ruby-build.git ruby-build
cd ruby-build
./install.sh

echo 'export RBENV_ROOT="/usr/local/rbenv"'     >> /etc/profile.d/rbenv.sh
echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"'                   >> /etc/profile.d/rbenv.sh


ファイルのパーミッションの変更

$ chmod 755 rbenv-install.sh

実行

$ sudo ./rbenv-install.sh

これ一発でインストールは完了します。

$ rbenv -v
rbenv 0.4.0-75-gbe5e1a4

インストール可能な ruby を一覧表示

$ rbenv install -l

$ sudo yum install openssl.i686 openssl-devel.i686 openssl-static.i686

rbenv 経由で ruby をインストール

$ rbenv install 2.0.0-p353

このマシンで使用できるように設定

$ rbenv global 2.0.0-p353
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [i686-linux]

$ gem update --system
$ gem install bundler
$ gem update

httpd のインストール


$ sudo yum install httpd httpd-devel curl-devel

$ chkconfig /etc/init.d/httpd
$ sudo chkconfig httpd on
$ chkconfig --list httpd
httpd              0:off    1:off    2:on    3:on    4:on    5:on    6:off

 $ sudo /etc/rc.d/init.d/httpd start

iptables で 80 番を許可する

$ sudo vi /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

$ sudo /etc/init.d/iptables restart

ブラウザでアクセスすると Apache の初期画面が表示される。

Passenger のインストール

# gem install passenger
# passenger-install-apache2-module

設定ファイルを作成
# vi /etc/httpd/conf.d/passenger.conf

内容はいかの3行
LoadModule passenger_module /usr/local/...
PassengerRoot /usr/local/rbenv/...
PassengerDefaultRuby /usr/local/rbenv/...


同様に
# vi /etc/httpd/conf.d/rails.conf

以下の文字列
   <VirtualHost *:80>
      ServerName www.example.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public   
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

作業ユーザに戻って

$ mkdir www
$ cd www

ここに Rails の環境を構築します。

$ bundle init

$ vi Gemfile
rails のコメントを外す。

rails の環境をインストール
$ bundle install --path vendor/bundle --without production

$ bundle exec rails new . --skip-bundle --database=postgresql

$ vi Gemfile
gem 'therubyracer' のコメントを外す。

$ bundle config build.pg --with-pg-config=/usr/pgsql-9.3/bin/pg_config
$ bundle install --path vendor/bundle

一旦、SELinux を解除します。最後に設定します。
$ sudo setenforce 0

$ sudo /etc/rc.d/init.d/httpd restart

$ chmod 755 /home/workuser/

データベースの設定をします。

$ vi config/database.yml

 データベースの生成権を与えます。
$ su - postgres
$ createuser -d workuser

本来のユーザに戻って
$ createdb

SELinux の設定変更

必要なパッケージをインストールします。
# yum install policycoreutils-python

# grep httpd /var/log/audit/audit.log | audit2allow -M passenger

# semodule -i passenger.pp

SELinux を有効にします。
# setenforce 1

# /etc/init.d/httpd restart

長い・・・

書き足します。

実行モードが production になっているので development に変更

 $ sudo vi /etc/httpd/conf.d/rails.conf

 <VirtualHost *:80>
   ServerName www.example.com
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /somewhere/public
   <Directory /somewhere/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
   </Directory>
   RailsEnv development
</VirtualHost>

ページをひとつ、作ってみる

$ bundle exec rails g controller welcome index

$ touch tmp/restart.txt

ブラウザでアクセスしてみる
http://192.168.xxx.xxx/welcome/index


走らなかったら、SELinux を一旦切ってみる。で、走れば SELinux の再設定。

# setenforce 0

ブラウザでアクセスして走ることを確認

再設定
# grep httpd /var/log/audit/audit.log | audit2allow -M passenger
# semodule -i passenger.pp
# /etc/init.d/httpd restart
# setenforce 1

これで終了。

2013/11/02

paperclip の、サイズの指定方法

paperclip を使って画像を扱っているのですが、サイズ指定でこんがらがってきたのでまとめ。

環境

CentOS 6.4
ruby 2.0.0p247
Rails 4.0.0
rbenv 0.4.0-67-g3300587

">" を使った時は、縦横比が崩れずに指定枠内に全部が収まる。
"#" を使った時は、縦横比が崩れずに指定枠内に収めるが、はみ出た部分はカットされる。

2013/07/20

年齢計算

普段は PostgreSQL を使っています。自前のアプリケーション「個人データ管理システム Zebra 」でも使用しています。で、よく年齢計算なんかをしたりします。

通常は、何歳ということで「年」だけを取ってくればいいのですが、よくばって「月」まで計算しようとしています。PostgreSQL の場合は以下。

年をとるには
select extract(year from age(now(), '1960-8-22'))
月をとるには
select extract(month from age(now(), '1960-8-22'))

と、PostgreSQL の age() 関数にバリバリ、頼っているわけです。

で、ここからが本題。SQLite3 だったらどうしよう。


残念ながら age() 関数はありません。できることなら SQL 文一発で解決したいものです。そこで次のような SQL 文をいろいろググりながら作り上げました。

SELECT
  ((strftime('%Y%m%d', 'now')-strftime('%Y%m%d', birthday))/10000) AS Age,
  case
    when (strftime('%m', 'now') - strftime('%m', birthday)) < 0 then 12 + (strftime('%m', 'now') -   strftime('%m', birthday))
    else (strftime('%m', 'now') - strftime('%m', birthday))
  end as Month
from
  members

ちょっと「月」の部分の出方が違っていますが、解釈の違いということで。

2012/09/04

CentOS で Rails など

いよいよ Ruby on Rails


やっとここまで来た。
まずは rvm で ruby と rails を入れる。
$ curl -L https://get.rvm.io | bash -s stable --ruby

このまま gem してもいいのかなぁと思いながらも
$ curl -L https://get.rvm.io | bash -s stable --rails

などとしてしまった。

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]

$ rails -v
Rails 3.2.8

ちょっと、作ってみる。
$ rails new foo --database=postgresql

最後のほうでエラー、pg を入れろといってくるので
$ gem install pg -v '0.14.1'

とするも、やっぱりエラー。--with-pg-config で指定しろといってくる。そこで、
$ gem install pg -v '0.14.1' --with-pg-config=/usr/pgsql-9.1/bin/pg_config

としてもエラー!! えーっと思いながらググったら
$ gem install pg -v '0.14.1' -- --with-pg-config=/usr/pgsql-9.1/bin/pg_config

ハイフンが要るんだそうで。

このあと、vi Gemfile で therubyracer を有効にして
$ bundle install

$ rails server
ブラウザから http://localhost:3000 で無事アクセスできた。

CentOS データベースなど

PostgreSQL9.1 をインストールしてみる

yum標準でインストールされるのが 8.4.12 だったので 9 シリーズを入れてみる。

ここにいって wget する。
http://yum.pgrpms.org/reporpms/
目的の CentOS6 用 9.1

# wget http://yum.pgrpms.org/9.1/redhat/rhel-6-i386/pgdg-centos91-9.1-4.noarch.rpm

とってきたら rpm する。
# rpm -ivh pgdg-centos91-9.1-4.noarch.rpm

設定ファイルの修正
# vi /etc/yum.repos.d/CentOS-Base.repo

 [updates] のセクションに追記
exclude=postgres*

yum でインストール
# yum install postgresql91-server

postgresユーザにスイッチして、PostgreSQL の初期化
$  /usr/pgsql-9.1/bin/initdb

サーバの起動
$ /usr/pgsql-9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l logfile start


今のところ、覚え書きレベルのエントリーでした。

<追記>

付属する機能も入れたほうが後々引っかからない。

# yum install postgresql91-devel
# yum install postgresql91-contrib

適当なデータベースを作って psql で入る。
=> select version();
--------------------------------------------------------------
PostgreSQL 9.1.5 on i686-pc-linux-gnu, ........

でも psql は 8.4.12 で「psql の機能の中で、動作しないものがあるかもしれません。」なんて言われてしまっている…

CentOS ネットワークなど

CentOS 6.3 をインストールして起動するけど、その度にネットワークが接続されてない。


で、設定を見てみると。

メニューから、システム/設定/ネットワーク接続

 リストから System eth0 を選択して「編集...」

「自動接続する」のチェックボックスを「ON」にする

再起動して確認。

これをコマンドラインでどうやって設定するかは・・・まだ調べてません。

2012/08/30

DataGridView など

はじめに

C# と PostgreSQL であれこれとやっています。DataGridView が便利そうなのですが、なかなか使いこなせません。で、いままでは ListView なんかを使って誤魔化していたのですが、やっぱりちゃんと DataGridView 使いたいよねということで、気合を入れて頑張ってみました。

住所録アプリです。


メイン画面はこんな感じ。DataGridView がどーんと表示されています。

「行を追加」ボタンで、カーソルがある行の下に空白行が表示されます。
「行を削除」で、カーソルがある行が削除されます。
「保存」で、画面上のデータがデータベースに反映されます。

PostgreSQL との接続には Npgsql を使用しています。ADO 経由の接続もあるのですが、ドライバを別途インストールしないといけないので Npgsql にしました。

 プログラムの起動

起動時にデータベースに接続にいって、該当テーブルを DataGridView に紐付けします。

接続はこんな感じ。
接続に必要な情報は app.config に入れています。


        public static NpgsqlConnection conn;
        public static bool connect_db()
        {
            Properties.Settings.Default.Reload();
            string connection_string = "Server=" + Properties.Settings.Default.Server + ";"
                + "Port=" + Properties.Settings.Default.Port + ";"
                + "User Id=" + Properties.Settings.Default.User_Id + ";"
                + "Password=" + Properties.Settings.Default.Password + ";"
                + "Database=" + Properties.Settings.Default.Database + ";";
            conn = new NpgsqlConnection(connection_string);
            try
            {
                conn.Open();
                return true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("DataBase Open Error:" + ex.Message);
                return false;
            }
        }

Form の OnLoad のタイミングでデータを取ってきます。

            Database.GetData();
            dataGridView1.DataSource = Database.dataSet;
            dataGridView1.DataMember = "address";

Database.GetData() は、こんな感じ。
ちょっと、ゴチャゴチャしてますね。

        public static void GetData()
        {
            dataSet = new System.Data.DataSet();
            dataAdapter = new NpgsqlDataAdapter();
            string sql = "select * from address";

            dataAdapter.SelectCommand = new NpgsqlCommand(sql, Database.conn);

            sql = "insert into address (name, birthday, zipcode, addr, tel) values (:name, :birthday, :zipcode, :addr, :tel)";
            dataAdapter.InsertCommand = new NpgsqlCommand(sql, Database.conn);
            dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("name", NpgsqlTypes.NpgsqlDbType.Text, 0, "name", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("birthday", NpgsqlTypes.NpgsqlDbType.Timestamp, 0, "birthday", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("zipcode", NpgsqlTypes.NpgsqlDbType.Text, 0, "zipcode", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("addr", NpgsqlTypes.NpgsqlDbType.Text, 0, "addr", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("tel", NpgsqlTypes.NpgsqlDbType.Text, 0, "tel", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));

            sql = "update address set name = :name, birthday = :birthday, zipcode = :zipcode, addr = :addr, tel = :tel where id = :id";
            dataAdapter.UpdateCommand = new NpgsqlCommand(sql, Database.conn);
            dataAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("name", NpgsqlTypes.NpgsqlDbType.Text, 0, "name", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("birthday", NpgsqlTypes.NpgsqlDbType.Timestamp, 0, "birthday", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("zipcode", NpgsqlTypes.NpgsqlDbType.Text, 0, "zipcode", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("addr", NpgsqlTypes.NpgsqlDbType.Text, 0, "addr", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("tel", NpgsqlTypes.NpgsqlDbType.Text, 0, "tel", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Current, DBNull.Value));
            dataAdapter.UpdateCommand.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer, 0, "id", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Original, DBNull.Value));

            sql = "delete from address where id = :id";
            dataAdapter.DeleteCommand = new NpgsqlCommand(sql, Database.conn);
            dataAdapter.DeleteCommand.Parameters.Add(new NpgsqlParameter("id", NpgsqlTypes.NpgsqlDbType.Integer, 0, "id", System.Data.ParameterDirection.Input, false, 0, 0, System.Data.DataRowVersion.Original, DBNull.Value));

            dataAdapter.Fill(dataSet, "address");
        }

これで表示はできますが、項目見出しが英語のままです。データベースには comment で日本語の情報を登録していますのでこれを使って項目見出しを日本語にします。

            Utils.SetHeaderString(dataGridView1, Database.GetComment("address"));

Database.GetComment() が、コメントを取ってくる部分。
Utils.SetHeaderString() が、コメントを DataGridView の HeaderText に当てはめる部分です。

        public static Hashtable GetComment(string table_name)
        {
            Hashtable ht = new Hashtable();
            NpgsqlCommand command = new NpgsqlCommand("select "
                + "  attr.attname as column_name, "
                + "  des2.description as column_comment "
                + "from "
                + "  pg_catalog.pg_class a "
                + "    inner join pg_catalog.pg_namespace ns on a.relnamespace = ns.oid "
                + "    inner join pg_catalog.pg_attribute attr on a.oid = attr.attrelid and attr.attnum > 0 "
                + "    left join pg_catalog.pg_description des2 on a.oid = des2.objoid and attr.attnum = des2.objsubid "
                + "where "
                + "  a.relkind IN ('r', 'v') "
                + "  and a.relname = :table_name "
                + "  and ns.nspname IN ('public') "
                , conn);
            command.Parameters.Add(new NpgsqlParameter("table_name", NpgsqlTypes.NpgsqlDbType.Text));
            command.Parameters["table_name"].Value = table_name;

            NpgsqlDataReader dr = command.ExecuteReader();
            while (dr.Read())
            {
                ht.Add(dr["column_name"], dr["column_comment"]);
            }

            return ht;
        }


        public static void SetHeaderString(System.Windows.Forms.DataGridView grid, System.Collections.Hashtable hash)
        {
            for (int ii = 0; ii < grid.Columns.Count; ii++)
            {
                if (grid.Columns[ii].HeaderText == "id")
                {
                    grid.Columns[ii].Visible = false;
                }
                if (hash[grid.Columns[ii].HeaderText] != null)
                {
                    grid.Columns[ii].HeaderText = hash[grid.Columns[ii].HeaderText].ToString();
                }
            }
        }


行を追加

このボタンをクリックすると、カーソルがある行の下に空白行を挿入します。最終行が選択されている場合、データがない場合は、行が追加されます。

        private void buttonAdd_Click(object sender, EventArgs e)
        {
            int insert_pos = 0;

            if (dataGridView1.Rows.Count > 0)
            {
                if (dataGridView1.CurrentRow == null)
                {
                    MessageBox.Show("一覧から選択して下さい");
                    return;
                }
                insert_pos = dataGridView1.CurrentRow.Index + 1;
            }

            //  挿入する行の生成
            DataRow newRow = Database.dataSet.Tables[0].NewRow();

            //  選択行の下に追加
            Database.dataSet.Tables[0].Rows.InsertAt(newRow, insert_pos);
        }

行を削除

このボタンをクリックすると、カーソルがある行が削除されます。DataGridView からです。まだデータベースからは削除されません。

        private void buttonDel_Click(object sender, EventArgs e)
        {
            if (dataGridView1.CurrentRow == null)
            {
                MessageBox.Show("一覧から選択して下さい");
                return;
            }
            DataRow myRow = Database.dataSet.Tables[0].Rows[dataGridView1.CurrentRow.Index];
            myRow.Delete();
        }

保存

DagaGridView の内容がデータベースに反映されます。

        private void buttonSave_Click(object sender, EventArgs e)
        {
            try
            {
                Database.dataAdapter.Update(Database.dataSet, "address");
                MessageBox.Show("保存しました");
            }
            catch (Exception ex)
            {
                MessageBox.Show("失敗しました。" + ex.Message);
            }
        }

まとめ

今回苦労したところは、DagaGridView への操作と、実際のデータとの連携の部分でした。DataSet を無視して DataGridView への追加、削除は簡単に出来たのですが、いざそれを保存しようというところではまってしまいました。

あと、このプログラムで連続して追加や削除を行なって「保存」しようとするとエラーが出る場合があります。DataSet 内の Status の関係だと思うのですが追求してません ^^;)

ソース一式をあげておきます。 -> ここ

2010/07/23

SQLServer compact 3.5

Visual Studio 2008 で開発するとき、何も考えずにホイホイとテーブル作って、データの読み書きしてと、便利な機能。でも VS2008 からだとデータベースのバックアップやリカバリが出来なくて、「なんじゃ、やっぱり使えないじゃん」となりかけていたところ、ありました。世の中にはちゃんとありました。探し方が悪かっただけです。

http://exportsqlce.codeplex.com/
とか、
http://erikej.blogspot.com/2009/04/sqlcecmd-tutorial-part-one-managing.html
とか。

えーごですが、簡単な表現です。ちゃんと読んでいくと色々なツールが用意されていて、便利この上なし。

コマンドラインツールなんか、普通のデータベースと同じような感覚で使うことができます。これで精神的にゆとりが出来ました。じっくりと使いこなしていこうかな。

こんな感じ

MyDatabase.sdf からエクスポート。スキーマとデータの sql 文が db.sql に書き出されます。
>ExportSqlCE.exe "Data Source=C:\tmp\MyDatabase.sdf;" db.sql

別のデータベース abc.sdf を作成
>SqlCeCmd.exe -d "Data Source=C:\tmp\abc.sdf" -e create

そこへ、さっき書き出した sql 文を流し込みます。
>SqlCeCmd.exe -d "Data Source=C:\tmp\abc.sdf" -i db.sql

2010/07/12

Windows のシリアルポートで、はまりまくり

Windows のシリアルポートは、機器を接続すると自動的に番号を割り当ててくれます。USBシリアル変換ケーブルなどを使用すると、USBのソケットを代えただけで別の新しい機器が接続されたと認識されて、またまた、番号を割り当ててくれます。

これが本当にありがた迷惑。

ついには30番を突破することに。どうも20番あたりから接続が怪しかったのですが、ここに来てどうにもこうにもならなくなりました。デバイスマネージャには、何も繋がっていないのに「COM○ 使用中」などと表示されてしまいます。

プロパティで、強制的に違う番号に変更できるのですが、それにも限界がありました。

で、悩むこと半日。

やっと見つけました。
http://social.answers.microsoft.com/Forums/ja-JP/xphardwareja/thread/32cd879a-a2e8-46d8-a877-6751792990f1/

----------引用ここから----------
「マイコンピュータ」を右クリック⇒「プロパティ」を選択⇒「詳細設定」タブ⇒「環境変数」ボタン⇒「システム環境変数」の「新規」ボタンとクリックし、変数名に「DEVMGR_SHOW_NONPRESENT_DEVICES」と入力。変数値欄に「1」と入力して再起動します。

デバイスマネージャにて「表示」⇒「非表示のデバイスの表示」と選択すると、過去にインストールした全てのドライバが灰色表示されます。ここで USBの灰色部分を右クリック⇒「削除」を選択して1つずつ削除します。
----------引用ここまで----------

これですっきりしました。

【追記】

と思っていたら、たいした解決に至っていませんでした。デバイスマネージャから、特定のシリアルポートのデバイスを選択して、プロパティでCOMポート番号を変更しようと、ドロップダウンリストを開いてみたら「キャーッ」なんと、「使用中」の表示がズラズラ。

根本解決していません。

レジストリはいじりたくないよーっ。