C# ショートコードプログラミング・Effective C#

C# ショートコードプログラミングをサラっと読んでみて気になった部分のみメモしておく。

・使っていない引数を削除する。

・少ない利用ならusing宣言を削除する。

・不要な改行を削除し1行にまとめる。

・メソッドを式化する。

・オーバーロードを引数のデフォルト値で置き換える。

・TryParseと三項演算子
int.TryParse(“a”, out int result) ? result : 99)

・null合体演算子を複数使う。
a ?? b ?? c ?? d

・null合体演算子
左辺がnullでない場合は左辺を返す。
左辺がnullである場合は右辺を返す。
??

・null条件演算子
左辺がnullである場合はnullを返す。
左辺がnullでない場合は右辺を評価する。
?.
?[]

・null合体演算子と条件演算子
string n = user?.Name ?? “名無し”

・型判定と型変換を同時に行う。パターンマッチング。
キャストが可能か判断し可能なら右辺の変数に代入される。
if(x is int y){}
switch(x) {case int i}

・配列の縮小・拡大
Where().ToArray()
Concat().ToArray()
Append().ToArray()
Prepend().ToArray()

・コレクションの間に挿入
x.Take().Append().Concat(x.Skip())

・例外フィルタ
try{} catch() when(){}

・名前が必要ない型はタプル

・string.Formatから文字列補完式
$”{}”

Effective C#の第一章(C#言語イディオム)を読んで一言。

・ローカル変数でvarを利用

・constよりreadonlyを利用

・キャストは()よりisかasを利用

・string.Format()より補完文字列を利用

・シンボルの文字列リテラルはnameofで取得

・クラス間のやりとりにデリゲートを利用

・null条件演算子を利用

・ボックス化、ボックス化解除を避ける。値型>参照型(ボックス化)

・継承したメソッドを再定義しない

C# Linqメモ

定番なものだけ

 

LINE WORKSインストール

有料版と無料版で同じプログラムなのか不明だが、手抜きなのか?と思うほど不安定。直近でPC数台にインストールして発生した問題。

・連絡先から新規トーク送信時(トークルーム作成時)によく落ちる。ほんと頻繁に落ちる。クラッシュレポートを呼んでストンと落ちて固まったりしないからいいんだけど。

・連絡先から新規トーク送信時に出てくる新しいウィンドウと本体のウィンドウのサイズが違う。まぁ、サイズの違いはいいとしても…本体をデスクトップの下側に置いておくと新しいウィンドウがデスクトップからはみ出る。新しいウィンドウが画面からはみ出るのはどうかと。

・インストール完了後、起動しない。エラーレポートを見るとig75icd32.dllが原因と出てるので、Intelグラフィックドライバーをメーカーサイトから落として更新すると起動できた。この程度軽量のアプリでドライバーの影響で落ちるのはどうなんだろう。

・インストール時にパスを選べるがアンインストールは選んだパスでアンインストールの処理をしないっぽい。それにインストールのパスを変えると、全ての文字が化けて動作がおかしくなる。

最後の2つはライブラリの影響かと思うけど、ビジネスユースでこのクオリティは酷い。導入実績がすごい数あるけど、絶対問題出ているだろうと思う。

追記

PC版の更新が来て、落ちることはほぼなくなった。

iOS/Androidスマホ、Androidタブレットにも数台インストールしてみた。

・スマホは特に大きな問題は発生していない。

・Androidタブレットは酷い。トークや通話については様々。通知がでない。忘れたころに通知される、最悪通知されない…こりゃ酷い。

・同じアカウントの、PC、スマホ、タブレットのトークがしっかり同期しない。アプリで更新のボタンをおしたり、端末を再起動しても同期しない。

何というか、全体的に不安定。同期しないとか通知がでないとか。導入実績がすごい数あるんだから、絶対クオリティについて把握してると思うんだけど、まぁアプリのコメントを読んでみると問題がないという評価は多いけど、一定数通知が出ないとか不安定という評価があるし、現時点でも放置ということは対応するつもりがないんだろうな。

これはオススメできないな。こういうサービスは一度導入すると他への移行も大変だし止めたほうがいい。

 

MariaDB(Arch Linux on VirtualBox)

・先ずソースから挑戦

入ってなければ
pacman -S cmake
pacman -S ncurses

ソースをダウロードして解凍
tar zxvf mariadb-10.3.12.tar.gz
cd mariadb-10.3.12

cmake . -DCMAKE_INSTALL_PREFIX=/root/share/mariadb -DCMAKE_PREFIX_PATH=/var/lib/pacman/local/ncurses-6.1-6/ -DPLUGIN_TOKUDB=NO

(.はソースディレクトリでCMakeLists.txtが必要)
(DCMAKE_INSTALL_PREFIXはmake installしたときの配置先)

make -j 1
make -j install

パッと調べるとこんな感じのようだかエラーが出るので要調査。

・パッケージにて

pacman -S mariadb
mysql_install_db –user=mysql –basedir=/usr –datadir=/var/lib/mysql

カーネルのコンパイル(Arch Linux on VirtualBox)

・カーネルバージョン確認

uname -r

・カーネルソース保存

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.99.tar.gz

・シンボリックリンク

ln -s linux-4.9.99 linux

・コンフィグ作成

make clean && make mrproper
今までconfigで設定した内容の消去を行う。初期化。

Archのデフォルト設定を利用する場合。
zcat /proc/config.gz > .config

あるいは、

make localmodconfig
ゲストOS内で現在ロードされているカーネルモジュール情報から
カーネルに読みこまれていないmoduleを無効にした設定をおこなう。

・その他コンフィグ

必要な場合。

make oldconfig
今あるconfig使って、新しい設定だけを問い合わせてくるというものがある。

make config
対話型のコンフィギュレータ

make menuconfig
メニューベースのコンフィギュレータ

make xconfig
Xベースのコンフィギュレータ

・コンパイル

make

今回はbcが無いとエラーがでた。

pacman -S bc

makeは時間がかかる。

・カーネルモジュールのコンパイル

make modules_install

以下にコピーされる。

/lib/modules/xxx

・bootディレクトリにカーネルをコピー

名前の前にvmlinuz-をつけるのは必須。
cp -v /usr/src/linux-4.9.99/arch/x86_64/boot/bzImage /boot/vmlinuz-linux49

・initramfs生成

mkinitcpioを利用。

mkinitcpio -k 4.9.99 -g /boot/initramfs-linux49.img

/lib/modules/xxxのソースディレクトリ名を使う。

・ブートローダーの設定

/boot/grub/grub.cfg

linux /vmlinuz-linux …
initrd /initramfs-linux.img
この部分を変更。

これで完了。

・カーネルモジュール

一覧
lsmod

内容確認
modinfo

ロード
insmod

アンロード
rmmod

ロード・アンロードの依存関係を自分で処理。
(lsmodのUsed byにて分かる)

依存関係を自動で処理する場合のロード・アンロード
modprobe xxx
modprobe -r xxx

Arch Linux on VirtualBox ディスクサイズ変更

・VirtualBox

cd C:\Program Files\Oracle\VirtualBox
VBoxManage.exe modifyhd “G:\VirtualBox VMs\Arch Linux\arch.vdi” –resize 20480

・ブートメディアで起動

・パーティーションサイズの変更
parted
p
resizepart xxx 100%

・デバイス名チェック
fdisk -l

・整合性チェック
fsck -f /dev/sda2

・ファイル
resize2fs /dev/sda2 [size]

Arch Linuxインストール

今回はVirtualBoxにて実験

インストールメディアからブート

基本インストール

・キーボードレイアウト

loadkeys jp106

・パーティション確認

fdisk -l

・起動モード確認

ls /sys/firmware/efi/efivars

ディレクトリがあればUEFI

・パーティション作成

parted /dev/sda
mklabel msdos
mkpart primary ext4 1MiB 100MiB
mkpart primary ext4 100MiB 100%
q

・partedコマンド

p
確認

q
終了

rm
削除

・パーティションフォーマット

mkfs.ext4 /dev/sda1
mkfs.ext4 /dev/sda2

・マウント

mount /dev/sda2 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

・リポジトリ変更

/etc/pacman.d/mirrorlist
日本のリポジトリを一番上に移動。

・ベースシステムインストール

pacstrap /mnt base base-devel

・fstab

genfstab -U /mnt >> /mnt/etc/fstab

・chroot

arch-chroot /mnt /bin/bash

・ロケール設定

/etc/locale.gen
コメントを解除
en_US.UTF UTF-8
ja_JP.UTF UTF-8

実行
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf

・キーマップ設定

/etc/vconsole.conf
追加
KEYMAP=jp106
FONT=lat9w-16

・タイムゾーン設定

ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

・ハードウェアとシステムの日時同期

hwclock –systohc –utc

・ホストネーム設定

echo vm > /etc/hostname

/etc/hosts
追加
127.0.0.1 localhost.localdomain localhost vm
::1 localhost.localdomain localhost vm

・DHCP有効化

systemctl enable dhcpcd

・rootパスワード設定

passwd
123

・GRUBインストール

pacman -S os-prober grub
grub-install –target=i386-pc –recheck /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

・起動

exit
umount -R /mnt
reboot

・復旧する場合

起動メディアでブート

mount /dev/sda1 /mnt/boot
mount /dev/sda2 /mnt
arch-chroot /mnt

・VirtualBoxを含めネットワークの設定

VirtualBoxの設定でネットワークをブリッジに。
ncpa.cplからVirtualBoxのNICを192.168.11.200に。

・WiFiオン

wifi-menu -o

有線は自動でつながる

・IPアドレス確認

networkctl status

・DHCP停止

systemctl disable dhcpcd

・IPアドレス指定

/etc/systemd/network/static.network

[Match]
Name=enp0s3

[Address]
Address=192.168.11.201/24

[Network]
DNS=192.168.11.1

[Route]
Gateway=192.168.11.1

systemctl start systemd-networkd
systemctl start systemd-resolved
必要ならenable

・SSHインストール

pacman -S openssh
systemctl start sshd

/etc/ssh/sshd_config
追加
PermitRootLogin yes
AllowUsers root

・iptables設定

この段階では特に編集しなくてもつながる。

確認
iptables -L

/etc/iptables/iptables.rules
追加
-A INPUT -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT

再起動
systemctl restart iptables

・vim

pacman -S vim

・samba

必要ならユーザー追加。今回はrootで処理。

useradd -c “Guest User” -d /dev/null -s /bin/false pcguest
chown pcguest:pcguest share

作成したユーザがパスにアクセスできること。

LAN向けなので、最低限

pacman -S samba

mkdir share
chmod ugo+rwx share

設定ファイル
vim /etc/samba/smb.conf

作成されない場合ArchLinuxのサイトにサンプルがあるので写す。
あるいは直接作成。

[global]
unix charset=UTF-8
dos charset=CP932
security = user
guest account = root
map to guest = bad user

[share]
path = /root/share
writable = yes
guest ok = yes
force create mode = 0777
force directory mode = 0777
share modes = yes
vfs objects = recycle

起動
systemctl start smb
systemctl start nmb
必要ならenable

動作確認
ss -ltnp

・dotnet

pacman -S dotnet-runtime
pacman -S dotnet-sdk
pacman -S aspnet-runtime

・pacmanコマンド

レポジトリ最新
-Syy

ソフト更新
-Syyu

レポジトリ検索
-Ss

ローカル検索
-Qs

インストール済みリスト
-Q

-S
インストール

-R
アンインストール

-Rs
依存も含みアンインストール

-Rns
アンイントール時のバックアップ削除

-Scc
インストール時のキャッシュ削除

-Sg
グループに含まれるパッケージ。

GUIの設定

・GUIとCUIの切り替え

Ctrl + Alt + F1,F2~

・グラフィックドライバ

環境にあわせて選択。
pacman -S xf86-video-intel
pacman -S xf86-video-amdgpu
pacman -S xf86-video-ati
pacman -S nvidia nvidia-utils

・調べ方

lspci | grep VGA

・xserver

pacman -S xorg-server
pacman -S xorg-xinit
pacman -S xorg-apps(必要なら)
pacman -S mesa(必要なら)

・キーコンフィグ

/etc/X11/xorg.conf.d/10-keyboard.conf
追加
Section “InputClass”
Identifier “Keyboard Defaults”
MatchIsKeyboard “yes”
Option “XkbLayout” “jp”
EndSection

・デスクトップインストール

pacman -S xfce4

echo “exec startxfce4” >> ~/.xinitrc

startx

・ロケール設定

/etc/locale.conf
追加(あるいは置換)
LANG=ja_JP.UTF-8

・フォントインストール

pacman -S otf-ipafont

Synergyインストール

現在Input Directorを利用中。
Linuxの端末も含めたいとなると、Synergyが有力なので試してみた。

・インストール時に聞かれる自動設定はしない。
・サーバー側、メイン画面でServerにチェック。
・サーバーを設定を開いて、ディスプレイの絵をドラッグし、クライアントのPC名を入力。
・クライアント側、メイン画面でClientにチェック。
・サーバーIPのところに入力。

これだけ。

Winパーティションについて

基本的な操作は、
compmgmt.msc
か、直接、
diskmgmt.msc
から

パーティションサイズをピッタリにしたい場合、
例えば100GBにしたい場合、
102404MB(1024*100+4)
でピッタリ。

回復パーティーションの削除
diskpart
list disk
select disk n
list partition
select partition n
delete partition override

SRT100でIPv6の設定、サブセグメント構築

初期化

シリアルケーブルつないでTeraTermで接続できる。
漢字コードはShift-Jisに変更

初期IPアドレス
192.168.100.1

初期パスワード
doremi

非常用パスワード
w,lXlma

administrator
管理者切り替え

cold start
初期化

quit
終了

show config
設定一覧

save
保存

サブセグメント追加

試しに既存セグメント(192.168.11.0/24)に追加。

IPアドレスの設定は、
LAN2(192.168.11.100)
LAN1(192.168.12.1)

デフォルトゲートウェイは、
192.168.11.1

NAT(IPマスカレード)は、
LAN2に外側(192.168.11.100)、内側(自動)

DHCPは中止しておく。

IPv6設定

設定
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
dns server dhcp lan2

確認
show ipv6 address lan1
show status ipv6 dhcp

繋がったけど安定しなかったので中止。