どこかに向かうらしい話

迷走エンジニアの放浪記

Chrome45におけるMacTypeの不具合対策

不具合の具体的な内容

Chromeの文字が一部欠ける。 欠ける箇所は完全なランダムのため、読み取りが困難になるという問題が発生している。

対処法

chrome://flags」にアクセスし、「ラスタースレッドの数」を「既定」から「1」に変更する。 変更後、再起動する。 以下のサイトの情報を参考にさせていただきました。 Google Chrome 45でMacTypeがおかしくなった件 | なんでも独り言

C# をコマンドラインから

やりたいこと

C#をVisual Stadio2013でサンプルで次々にファイルを作りながら、次々にコンパイルしようとしても、

エラー   1   プログラム 'ConsoleApplication1.exe' で、複数のエントリ ポイントが定義されています: 'Ex01_02.Main(string[])'。エントリ ポイントを含む型を指定するには、/main でコンパイルしてください。

といったエラーが出る。

コンパイルオプションが直接指定されず、プログラムを新しく作るたびに『プロジェクトのプロパティ』 → 『アプリケーション』 → 『スタートアップ オブジェクト』をしないといけないみたいだ。

/main (C# コンパイラ オプション)

とりあえずたるいので、コマンドラインからコンパイル→実行をするほうが楽そうだ。
その辺を支援してくれるバッチファイルを書いて、多少の自動化をしたい。

コマンドラインからコンパイル

C#コンパイラ

コンパイラcsc.exeというファイル名で、たぶんどっかにある。
.net Frameworkが入っている環境ならどっかにあるはず。
だいたいC:\Windows\Microsoft.NET\Framework64\以下にあるはず。
自分の環境ではC:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exeに存在した。

個人個人で分かれる部分とかは個人で補完してください。
とりあえずコンパイルのフルパスをCOMPILER_FILEとします。

コンパイル

ソースコードのフルパスをSOURCE_FILEとすると、コマンドプロンプトより、

> %COMPILER_FILE% %SOURCE_FILE%

とすれば、exeファイルがコマンドプロンプトのカレントディレクトリ上に作成されるので、そのexeを実行すればよい。

ちょっとした自動化の手順

コンパイルコンパイルしたファイルの実行までを楽したい。
とりあえず簡単な感じのものを作ってみた。

バッチファイルの作成

コンパイルと実行をするバッチファイルを以下の通り作成する。

ファイル名を「C_Sharp.bat」とする。

echo off

REM +------------------------------+
REM csc.exe を使用したビルドをするバッチファイル
REM +------------------------------+

REM コンパイラの位置を指定
SET COMPILER="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"

REM ソースのあるフォルダに移動
REM %~dp1 : 変数からフォルダ名のみを取り出す
cd %~dp1

REM ソースをコンパイルする。
%COMPILER% %1

REM コンパイルしたプログラムを実行
echo ==[ 出力開始 ]==================================================
echo.

REM %~dp1 : 変数からフォルダ名のみを取り出す
REM %~n1  : 変数からファイル名のみを(拡張子は取り除いて)取り出す
%~dp1%~n1.exe

echo.
echo ==[ 出力終了 ]==================================================

REM 入力があるまでプログラムが終了しないようにする。
pause

このバッチファイルを適当なフォルダに置く。
これで、このバッチファイルにC#のソースファイルをドロップしたら、よしなに動作してくれる。

「送る」への登録

『プログラムとファイルの検索』にshell:sendtoと入力し、することで、「SendTo」フォルダを開くことができる。
この「SendTo」フォルダに先ほど作成したバッチファイルのショートカットを配置することで、右クリックの「送る」に登録ができる。

これで、ソースファイルから右クリックで一通りのことが自動化できる。
とりあえずしばらくはこれでイケるか。

Neutron@CentOS7のはまったところ

備忘録のため、事実のみを簡潔に記載します。

CentOS7でIcehouseに含まれるNeutronの導入を行うと、ルーターゲートウェイを設定しても、正確に反映されない事象が発生する。
どうやらnet-toolsパッケージに依存するっぽい現象が見受けられる感じだ。

net-tools未導入時にルータのルーティング情報を確認したとき、以下のように表示されるとする。

# ip netns exec qrouter-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ip route
172.168.0.0/20 dev qg-xxxxxxxx-xx  proto kernel  scope link  src 172.168.1.1
192.168.1.0/24 dev qr-yyyyyyyy-yy  proto kernel  scope link  src 192.168.1.101

net-toolsを導入した後、L3エージェントの再起動を行い、ルータのルーティング情報を確認すると、デフォルトゲートウェイの設定がなされていることが確認できる。

# yum install net-tools  
# systemctl restart neutron-l3-agent.service  
# ip netns exec qrouter-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ip route  
default via 172.168.0.1 dev qg-xxxxxxxx-xx  
172.168.0.0/20 dev qg-xxxxxxxx-xx  proto kernel  scope link  src 172.168.1.1  
192.168.1.0/24 dev qr-yyyyyyyy-yy  proto kernel  scope link  src 192.168.1.101  

Neutronのコードの問題なのか、Pythonのコマンドの呼び出しの問題なのかの切り分けはついていないが、これでとりあえずは回避できていそうだ。

OpenStackの備忘録いろいろ

OpenStackをいじるときに個人的に利用しているTipsを備忘録として残す。

cloud-initパスワード認証の受け付け

cloud-initが導入されているイメージにおいて、パスワード認証の受付を行うためのTips。 FedoraUbuntuのCloud Imageなどで使用可能。

新しいインスタンス起動時に「作成後」タブの「カスタマイズ・スクリプト」欄に以下のように記述する。

#cloud-config 
password: passpass 
chpasswd: { expire: False } 
ssh_pwauth: True 

なお、『password: passpass』の"passpass"がログインのパスワードに該当する。

bashワンライナー

forによる一括作業

特に利用頻度の多いNovaとNeutronの一括再起動を以下の通り示す。

Nova
for SERVICE in $(systemctl | grep "^openstack-nova" | awk '{ print $1 }') ; do systemctl restart ${SERVICE} ; done 
Neutron
for SERVICE in $(systemctl | grep "^neutron" | awk '{ print $1 }') ; do systemctl restart ${SERVICE} ; done 

whileによる無限ループ

3秒おきに時間の表示とnetnsの状況を表示する。

while : ; do date ; ip netns ; sleep 3 ; done 

viにおける文字置換

以下の通り。

:%s/[置換対象文字列]/[置換後文字列]/gc 

オプションのgはマッチしたテキストすべて対象となるようにし、cは置換前に実行するかを確認を毎回行うようになる。

CentOS7でOpen vSwitchブリッジ化

Open vSwitchのブリッジのポートにIPアドレスを割り振る方法について備忘録。
備忘録のため、ざっくりしか書いていませんことはご了承願います。
また、作業中ネットワークの寸断がなんども起きるため、sshなどによるリモートの設定ではなく、ローカルでの設定を行ってください。

Open vSwitchの導入

Open vSwitchをインストールする。 ここではOpenStackのPackStackを利用してインストールする。

# yum install https://repos.fedorapeople.org/repos/openstack/openstack-icehouse/epel-7/rdo-release-icehouse-4.noarch.rpm
# yum install openvswitch

Open vSwitchを起動する。

# systemctl start openvswitch.service
# systemctl enable openvswitch.service

ブリッジの構成

ブリッジbr-exを作成する。

# ovs-vsctl add-br br-ex

ブリッジbr-exにたいしてポートenp3s0を付与する。

# ovs-vsctl add-port br-ex enp3s0

ネットワーク関連の設定

ifcfg-enp3s0を編集する。

# vi /etc/sysconfig/network-scripts/ifcfg-enp3s0

以下の通り編集する。

DEVICE=enp3s0
NAME=enp3s0
BOOTPROTO=none
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
HWADDR=xx:xx:xx:xx:xx:xx
ONBOOT=yes
NM_CONTROLLED=no
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=br-ex

ifcfg-br-exを編集する。

# vi /etc/sysconfig/network-scripts/ifcfg-br-ex

以下の通り編集する。

DEVICE=br-ex
NAME=br-ex
BOOTPROTO=none
IPADDR0=10.1.0.1
PREFIX0=8
GATEWAY0=10.255.0.1
DNS1=10.255.0.1
DEFROUTE=yes
NM_CONTROLLED=no
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBridge

NetworkManagerの停止、無効化とnetworkの起動、有効化を行う。

# systemctl stop NetworkManager.service
# systemctl disable NetworkManager.service
# systemctl start network.service
# systemctl enable network.service

ちょっとしたTips

この状態でrebootを行うと、br-exにIPアドレスが割り振られない状態で起動される。
原因はSystemdによる起動順序の指定がnetwork.service→openvswitch.serviceの順序になっているために、ブリッジが構成される前にIPの割り振りが行われてしまうことに起因する(と思われる)。

この現象に対する対応の1つとして、br-exインターフェイスの停止→起動を行うことでも対応は可能。
そのため、br-exに対してIPアドレスが割り振られているかをチェックし、割り振られていなければbr-exインターフェイスの停止→起動を行うという処理をcronにて毎分行うという方法で一時的に回避を試みる。
(この方法による回避が妥当かどうかは現段階ではまったく考慮しません)

インターフェイスへのIP割り振りのチェックと再起動のスクリプトを作成する。

# vi /shell/if_check.sh

以下の通り編集する。

#!/bin/bash

INTERFACE_NAME=br-ex
INTERFACE_IP=10.1.0.1

if [[ -z $(/sbin/ip addr show ${INTERFACE_NAME} | grep "inet ${INTERFACE_IP}") ]]; then
        /sbin/ifdown ${INTERFACE_NAME}
        /sbin/ifup ${INTERFACE_NAME}
fi

crontabを編集する。

# crontab -e

以下の通り編集する。

* * * * * /shell/if_check.sh

参考サイト

この記事の内容を構成するにあたって参考にさせていただいたサイトを以下に挙げておきます。

また、参考になるし有益ではあるが、自分の状況と照らし合わせて採用しなかったサイトの情報も挙げておきます。

Ruby 初期セットアップ @CentOS7/Fedora20

Ruby環境の初期セットアップを行うための備忘録。

Rubyのインストール

$ sudo yum install ruby ruby-devel gcc 

Gemのアップデート

rubygems-updateインストール

RubyGems自身のアップデートを行うrubygems-updateパッケージをインストールする。
また、rubygems-updateパッケージを使用するときにjson_pureパッケージも必要になるため、あわせてインストールを行う。

$ sudo gem install rubygems-update json_pure 

RubyGems本体のアップデート

update_rubygemsコマンドを実行する。

$ sudo update_rubygems

Gemにインストールされている全パッケージをアップデート

gem updateを実行する。

$ sudo gem update

依存ライブラリ

Nokogiri
# yum install libxml2 libxml2-devel libxslt libxslt-devel
therubyracer
# yum install gcc-c++

KVM便利コマンド - libguestfs

libguestfs

「libguestfs」パッケージとは、仮想マシンのディスクイメージにアクセスするライブラリです。
ホストマシンのコンソールから仮想マシン上でcatやlsなどのコマンドを発行するのもログインが生じたりとひと手間なことがあったりしますが、そのような手間がなく行うことができるようにするライブラリです。

情報は以下のURLに存在し、このサイトの情報をまとめております。
libguestfs, library for accessing and modifying VM disk images

パッケージに含まれる「virt-edit」コマンドにより、停止した仮想マシンに対するファイルの変更を直接行うことが出来ます。
「libguestfs」パッケージは、以下のコマンドでインストール可能です。

# yum install libguestfs libguestfs-tools libguestfs-tools-c

実際のところはKVMだけでなく、XenVirtualBox VDI, VMWareでも使えるみたいですが、自分がKVM使いなので、KVM以外には言及しません。
特に個人的によく用いている「virt-ls」「virt-cat」「virt-edit」「virt-copy-in」「virt-copy-out」を取り上げます。

virt-ls

単一のディレクトリまたは複数のディレクトリを(再帰的に)一覧表示します。

構文

virt-ls [--options] -d <domain_name> <dir> [<dir> ...]
virt-ls [--options] -a \<img_name\>.img [-a <img_name>.img ...] <dir> [<dir> ...]

ドメインmyDomainの /home配下にあるファイルとディレクトリの一覧を出力します。

# virt-ls -R -d myDomain /home/

ドメインmyDomainの /home配下にあるファイルとディレクトリの一覧の出力を、lessコマンドに引き渡すことにより、ファイルの内容をページ単位で自由に閲覧できるようにします。

# virt-ls -R -d myDomain /home/ | less

ドメインmyDomainのすべてのsetuidまたはsetgidプログラムを一覧表示します。

# virt-ls -lR -d myDomain /home/ | grep '^- [42]'

virt-cat

単一ファイルをダウンロードしてゲストに表示します。

構文

virt-cat [--options] -d <domain_name> <file_name> [<file_name> ...]
virt-cat [--options] -a <img_name>.img [-a <img_name>.img ...] <file_name> [<file_name> ...]

ドメインmyDomainの/etc/fstabファイルの内容を出力します。

# virt-cat -d myDomain /etc/fstab

ディスクイメージdisk.imgのsyslog messagesの末尾を出力します。

# virt-cat -a disk.img /var/log/messages | tail

virt-edit

ゲスト内の単一ファイルをインテラクティブに編集することができます。

構文

virt-edit [--options] -d <domain_name> <file_name> [<file_name> ...]
virt-edit [--options] -a <img_name>.img [-a <img_name>.img ...] <file_name> [<file_name> ...]
virt-edit [-d <domain_name>|-a <img_name>.img] <file_name> -e 'expr'

警告

稼働中の仮想マシンに対して、このコマンドを使用してはいけません。
仮想マシン内のディスクが破損する恐れがあるため、必ず仮想マシンの停止した状態で実行してください。


ドメインmyDomainに対して、対話的にファイル/boot/grub/grub.confを編集します。

# virt-edit -d myDomain /boot/grub/grub.conf

ドメインmyDomainに対して、対話的にファイル/etc/passwdを編集します。

# virt-edit -d myDomain /etc/passwd

ゲストOSがWindowsの場合は、Windowsのパスを指定してください。

# virt-edit -d mywindomain 'c:\autoexec.bat'

virt-edit には、 単一ファイルに一方的に直接変更を加えることができる別モードもあります。
この非インテラクティブなモードで編集を行う場合は -e オプションを使用します。
たとえば、 このコマンドでは Linux ゲストの root パスワードをパスワードなしに変更します。

# virt-edit -d myDomain /etc/inittab -e 's/^id:.*/id:5:initdefault:/'

virt-copy-in

仮想マシンの指定したディレクトリに対し、ホストマシンのファイルやディレクトリをコピーすることができます。

構文

virt-copy-in -a <img_name>.img <file_name>|<dir> [<file_name>|<dir> ...] <dst_dir>
virt-copy-in -d <domain_name> <file_name>|<dir> [<file_name>|<dir> ...] <dst_dir>

警告

稼働中の仮想マシンに対して、このコマンドを使用してはいけません。
仮想マシン内のディスクが破損する恐れがあるため、必ず仮想マシンの停止した状態で実行してください。

ドメインmyDomain内にある/etc/resolv.confを、ホストマシンに存在する/etc/resolv.confを用いてアップデートします。

# virt-copy-in -d myDomain resolv.conf /etc

ドメインmyDomain内にあるhomeディレクトリに、ホストマシンの/homeの情報を展開します。

# virt-copy-in -d myDomain skel /home

virt-copy-out

仮想マシンの指定したディレクトリに存在するファイルやディレクトリを、ホストマシンの指定したディレクトリをコピーすることができます。

構文

virt-copy-out -a <img_name>.img <file_name>|<dir> [<file_name>|<dir> ...] <local_dir>
virt-copy-out -d <domain_name> <file_name>|<dir> [<file_name>|<dir> ...] <local_dir>

警告

稼働中の仮想マシンに対して、このコマンドを使用してはいけません。
仮想マシン内のディスクが破損する恐れがあるため、必ず仮想マシンの停止した状態で実行してください。

ドメインmyDomainの/home以下をホストマシンのhomesディレクトリ以下にコピーします。

# mkdir homes
# virt-copy-out -d myDomain /home homes