2018年12月14日金曜日

文字コード変換はコマンド一発で解決!



こんにちは。よっしーです。

今日は文字コードについてのお話しをしたいと思います。


今まで、いろいろなプロジェクトに携わってきましたが、

開発環境、実行環境などによって、ソースファイルの文字コードが決まっており、

開発者が文字コードを「意識する」という場面がよくあります。


使用するテキストエディタ、ツール等によるところがありますが、

新規作成したソースファイルを保存する際、デフォルトの文字コードが決まっており、

そのデフォルトの文字コードが、期待する文字コードになっていないと、

知らず知らずのうちに、プロジェクトに沿わない文字コードで

ソースファイルを生成してしまうこととなります。


チームで開発をしていると、ソースファイルを集約したときに、

ファイル毎に文字コードがばらばら。。。なんてことも、よくありますよね。


で、そういったとき、ソースファイルの文字コードを正しいものに「変換」するのですが、

Windows でいろいろと文字コード変換ツールを使ってはみたものの、

あまりしっくりくるものがなく、いろいろと試した結果、Linuxコマンドを

使用して変換する。というスタイルに落ち着きました。


なので、今回は文字コード変換の方法についてご紹介したいと思います。

(例のごとく、Ubuntu環境でのやり方となります)




はじめに、nkf というコマンドを使用しますので、インストールします。

nkf コマンドをインストール
$ apt-get install nkf


あとは、いろいろなコマンドとを組み合わせて使います。

まずは、現在のファイルがどのような文字コードになっているかを確認してみましょう。


複数ファイルの文字コードをコマンド一発で確認
$ find . -type f | xargs nkf --guess | column -s: -t

出力結果
↓ファイル文字コード
./inc/client_recv.hUTF-8 (BOM) (LF)
./inc/client_send.hUTF-8 (BOM) (LF)
./inc/main.h       UTF-8 (BOM) (CRLF)
./inc/svc_recv.h   Shift_JIS (CRLF)
./inc/svc_send.h   Shift_JIS (CRLF)
./src/client_recv.cUTF-8 (LF)
./src/client_send.cUTF-8 (LF)
./src/main.c       UTF-8 (BOM) (CRLF)
./src/svc_recv.c   Shift_JIS (CRLF)
./src/svc_send.c   Shift_JIS (CRLF)

ファイルによって文字コードや改行コードがバラバラですね。。。


で、これを1つの文字コードに統一するため、変換をかけます。

複数ファイルの文字コードをコマンド一発で変換

※ Shift-JIS、改行コード=CR+LF にする場合
$ find . -type f | xargs nkf --overwrite -s -Lw

※ UTF-8、改行コード=LF にする場合
$ find . -type f | xargs nkf --overwrite --oc=UTF-8 -Lu

※ UTF-8(BOM付)、改行コード=LF にする場合
find . -type f | xargs nkf --overwrite --oc=UTF-8-BOM -Lu



UTF-8、改行コード=LF の変換をかけた後、文字コード確認をしてみると、、、

出力結果
./src/client_recv.cUTF-8 (LF)
./src/client_send.cUTF-8 (LF)
./src/main.c       UTF-8 (LF)
./src/svc_recv.c   UTF-8 (LF)
./src/svc_send.c   UTF-8 (LF)
./inc/client_recv.hUTF-8 (LF)
./inc/client_send.hUTF-8 (LF)
./inc/main.h       UTF-8 (LF)
./inc/svc_recv.h   UTF-8 (LF)
./inc/svc_send.h   UTF-8 (LF)
キレイに文字コードがそろってますね!


ファイルをテキストエディタで開いて、文字コードを指定し保存する。

というやり方でもよいですが、ファイルの数が多くなってくると、

かなり手間になってしまうので、そんな時はコマンド一発で一気にやってしまいましょう!


ではまた~。

2018年12月7日金曜日

ExcelでF1を押してもヘルプが出ないように



こんにちは、ふじかーです。

先日「Excelがもっと捗る小技」をいくつか紹介しましたが
ひとつ大事なのを忘れてました。


誤って F1 を押したときに出るヘルプがうざい


もっとも不要と思われるキー「F1」

大人気の主要キーである「F2」「ESC」の間に隠れて、自分も押下されるのを待ち続け
ついブラインドタッチミスで押されようもんなら

お前は必要ない

と見たくもないのに最前面に姿を現し、しかも重くイラッとさせられる。
そんな経験、誰しもあるんじゃないでしょうか。

このF1ヘルプ、周りで使っている人見たことありません。
私も活用したこと無いですし、あなたもおそらく無いでしょう。

皆これには辟易としているようで、
こいつを出なくする方法を検索するとたくさん出てきます。

 キーボードのF1キーを抜く
 F1ブレイカーというアプリを入れておく
 レジストリを書き換える
 マクロを利用する

などなど。
①②③ はちょっと過激なので をチョイスします。

マクロでの対処方法をググってみると
「個人用マクロブックを使う」という記事が多いようです。


「個人用マクロブック」とは
マクロの記録画面で選択できる保存先の一つなんですが

これは、一度使うと「PERSONAL.XLSB」というブックが生成され、それ以降
Excelの起動と同時に、こいつも背後でこっそりと自動的に開かれるようになります。

一応これを使っても実現可能なんですが、
これだとExcelを同時に複数、別ウィンドウで開いた時に

と出るようになり、これはこれでイラッとするので却下。


私は「アドインとしてマクロを組み込んでやる」方向で対応しました。


対策方法


対応の流れは
 1.ExcelファイルOpen時にF1を無効にするVBAマクロを書く
 2.マクロをアドインとして保存する
 3.アドインを有効化
という感じ。


1.ExcelファイルOpen時にF1を無効にするVBAマクロを書く
・Excelを新規に開き、
・Alt+F11を押下してVBEditorを開いて、
・ThisWorkbookをダブルクリックして開き
・下記のコードを貼り付ける

Private Sub Workbook_Open()

    Application.OnKey "{F1}", ""

End Sub
・VBEditorを閉じる



2.マクロをアドインとして保存する
・「名前を付けて保存」画面を開き、
・ファイルの種類で「Excelアドイン(*.xlam)」を選択
・勝手にアドインフォルダが開かれるので
・適当に名前を付けて保存(ここでは 「F1ヘルプ無効化」 にします)





3.アドインを有効化
・Excelを表示した状態で 「Alt」「T」「O」 と順番に押下し、Excelのオプション画面を開く
・アドイン → 設定(G) をクリック
・上で作成した F1ヘルプ無効化 にチェックをいれて、OKで閉じる
・Excelを一度閉じる






以上、終了です。これでもう、あの大嫌いだったF1ヘルプは
どれだけプッシュしようが出てこなくなりました。少し寂しいくらい。

同じようなストレスを抱えてる方がいれば、参考にして下さいな。

2018年11月30日金曜日

Googleレンズが意外と便利!? 風景から場所を特定したり、画像に写ったモノの名前を教えてくれたりするぞ!!



こんにちは。よっしーです。

私が使っているスマホ、zenfone5 なんですが

「Googleレンズ」に対応。というニュースを最近見つけたので、

これは!?と思い、さっそく使ってみました。

面白くて便利なので、紹介したいと思います。


「Googleレンズ」の起動はカメラアプリ上から行えます。

zenfone5だと、カメラを起動すると左下に「Googleレンズ」の
アイコンが追加されていました。


アイコンを選択すると、画面タップを促すメッセージが出力され・・・


タップすると、カメラに写った画像から、その被写体が何かを解析してくれます。


Googleレンズで出来ることは以下になります。

1.画面に写っている文字を認識し、テキストデータとしてコピー
2.画面に写っている被写体の類似商品の検索
3.画面に写っている動物や植物の特定
4.画面に写っている本、メディアの特定
5.バーコードのスキャン

これらは、写ったものによって自動的に判断されるようです。
どんな結果になるか、いろいろと写して試してみました。


神戸の夜景で試したところ、ポートタワーをちゃんと認識しました。


似たような形なんていっぱいありそうな神社でしたが、
ちゃんと湊川神社と認識してくれました。すごい!!


そこらへんに生えてた花も、名前がちゃんと出てきました。


スナック菓子もちゃんと出てきますし、多少でこぼこしていても、英語をテキストと認識しています。


ちょっと特定の難しいものだったりすると、こんな感じで候補がいくつか出てきます。


見当違いの結果が出てくることもあったりで、

精度はそこまで高くないのですが、なかなか面白い機能ですよね。

また、画像を指定して解析することもできるので、

例えば、先日行った城崎の社員旅行の画像なんかを指定してみると、、、


類似画像で「城崎」という地名が出てきていることも確認できました。


撮りためている写真なんかをみて、これどこ行ったときの写真だっけ???

というようなことがあれば、一度Googleレンズに解析させてみると、

案外特定してくれたりするかもしれませんよ。


ではまた~。

2018年11月23日金曜日

DNSを「1.1.1.1」にして、更にネットをセキュア&高速化・・・!


こんにちは、ふじかーです。

先週の記事で「寝室でも快適にインターネット」できるようにしましたが
それに引き続き、ネットのアクセス速度の改善ネタ をもう一件。

DNSを変えて高速化を図る


「1.1.1.1」というサービスをご存知でしょうか。
Cloudflare という企業が提供する DNSサービス です。

  • DNS(DomainNameSystem)
ご存知、URLとIPアドレスを変換する仕組ですね。
例えば、yahooを開く場合「www.yahoo.co.jp」というURLを入力しますが
ネット上では「183.79.135.206」というグローバルIPアドレスでアクセスされています。
(実際、http://183.79.135.206 と入力しても正しく表示できる。)

このアドレス変換をするサーバが DNSサーバ。
ここの応答速度もパフォーマンスに影響があるようです。
IPアドレスの設定画面の下の方にあるアレ。

  •  DNSサービス提供企業
「そんなとこ自動設定だよ。気にしたことねーよ。」
という方が多いかも知れませんが、

Google や Cloudflare など、いくつかの企業がDNSサービスを展開しており
設定変更すると「レスポンス速度の向上」「セキュリティの向上」などが期待できるようです。
■Cloudflare
優先DNSサーバのアドレス 1.1.1.1
代替DNSサーバのアドレス 1.0.0.1

■Google
優先DNSサーバのアドレス 8.8.8.8
代替DNSサーバのアドレス 8.8.4.4
覚えやすいですね。


  • セキュリティ
自動取得だと、たぶんネット回線を提供しているプロバイダが用意した
DNSサーバが利用されると思います。

まぁおそらく日本のプロバイダは大丈夫と思うんですが、
フリーwifi や 安心できない国のプロバイダ では
インターネット閲覧状況に関するデータを販売したり、
そのデータを基に広告を送りつけてきたりする事もあるとか。

上記の企業のDNSは「そんな心配は無く安心ですよ」と言っているようです。


  • アクセス速度
またGoogle / Cloudflare ともに「レスポンス速度」も売りにしているようですが
現状は Cloudflare の「1.1.1.1」が圧勝の模様。


この「1.1.1.1」、2018年の4月くらいにサービス開始しましたが
 DNS設定するだけで、インターネットのセキュリティーが向上し、
 さらにインターネットの速度が爆速になる!
と話題になっていたようです。


1.1.1.1アプリがリリース


そんなCloudflareから、1.1.1.1のスマホアプリが
2018/11/11 にリリースされたとの事。

1.1.1.1: Faster Internet
1.1.1.1: Faster Internet
開発元:Cloudflare
 無料 posted withアプリーチ

さっそく試してみました。

インストールは簡単。
「どれどれ、爆速なったかな?」
と、wifi-on状態でスピードテストサイトで速度比較したところ
1.1.1.1 設定OFF・・・ダウンロード170Mbps アップロード220Mbps
1.1.1.1 設定ON ・・・ダウンロード170Mbps アップロード200Mbps
あれ・・・全然変わんない。 wifi-offにしても高速化は見られない。
「効いてんのかコレ?」と思い調べた所、それもその筈。

DNSの変更は
「Webページの表示を高速化」
とは言うものの、
「ファイルのダウンロードが早くなるというものでは無い」
のでした。

Webページ内に画像などが多数あり、たくさんのURLが振られていれば
それぞれ高速にアドレス変換してアクセスできるので
「ちりつも」でページの表示速度が早くなるようです。

確かに1ファイルのダウンロード、「URL→IPアドレスの変換」は1回したら終わりですもんね。
その後のダウンロード速度を上げたければ、回線を高速化するしかありません。

ちょっと今回のは爆速を体感できるものではありませんでしたが
フリーwifiとか「少しセキュリティ気を付けたいな」てな時に良いかも知れません。

興味がある方は、試してみて下さいな。

2018年11月16日金曜日

どの階でも快適無線LAN・・・!


こんにちは、ふじかーです。

我が家では二階のリビングに無線LANルータを置いているのですが

寝室は三階にあるため
「寝ながらスマホ」する時に電波が悪くてイラッとします。
さっきまで辛うじて繋がっていたのに
ふとしたタイミングで、ロード中の くるくるくるくる が止まらない。

仕方ないのでスマホのWifiをOFFにしてLTE回線で更新したり・・・
そんな地味なストレスに限界がきて、対策した時のお話。


ルータ設置の注意


繋がりにくい場合、下記のような点に気を付ければよいそうです。

  • 電波の強いルータを選ぶ
  • 障害物を避ける
  • 水槽など、水の近くは避ける
  • ルータは高い位置に置く
  • 電子機器の近くは避ける

障害物があると入りにくい、なんてことは誰でも想像つきますが

「電波は水が苦手」
「電波はアンテナから横下方向に飛ぶ」

てのはあまり知られてないかもしれません。

基本的に水平方向へ飛んでいくようです
なので同一階の高い位置に・・・
ってルータが下の階にある時点で無理(´・ω・`)


使用する電波を選ぶ


最近のルータの電波帯域には「2.4GHz」「5GHz」の二種類があり
どちらでつなぐか、接続端末側から選べるようになってます。
  • 2.4GHz
○ 障害物(壁や床など)に強く、電波が遠くまで届きやすい
× 無線LAN以外の多種多様な製品で使われており、干渉しやすい
× 通信速度は遅め

  • 5GHz
○ 通信速度が速い
○ 基本的に無線LANにしか使われていないので干渉しにくい
× 障害物に弱く、距離が遠くなると電波が弱くなる
× 古いルータは対応していなかったりする

という特徴があります。

階が違うため 5GHz は期待できないので、2.4GHz を選択してみたものの・・・

冒頭に書いているように
繋がったり途切れたりで安定しません(´・ω・`)


中継器をつかう


無線LANの電波が届きにくいとき、
改善手段として「中継器」というのがあります。

無線LANルータからの電波をうけて、中継器自体から増幅して発信する というもので
安いもので3000円くらいから売っているみたいです。
BUFFALO の 中継機 WEX-733DHP 
設置位置は当然「ルータからの電波が充分に届く」必要があります。
あと、コンセントも必要。

廊下とか階段とか? そんな都合の良い場所あるかな・・(´・ω・`)

とりあえず、試しに購入して設置場所探してみるか~ と思ってたのですが・・・


無線LANルータを増やす


これまで何度かルータを買い替えてきたので
あまっている無線LANルータが家にありました。

これ使えないのかなーと調べると、いっぱい出てきました。

気を付ける点としては・・
  • アクセスポイントモード設定
ブリッジモードと言われたりもしますが、最近の無線LANルータには
大体こんな設定があるようです。家に余っているルータにもありました。

ルータとしての機能(ネット接続やIP割り当て等)を殺して、
無線LAN電波塔としてのみ使うわけですね。

  • 有線でつなぐ必要がある
上の階までLANケーブルを配線する必要があります。


通常なら「配線はちょっと面倒くさいなぁ~」と思うところですが、以前
上の階にサーバ機を置くため、階段の天井沿いにLANケーブルを這わせていたのでした。

これに旧機種ルータをつないで、アクセスポイントモードに切り替えることで
寝室も 快適無線LAN環境 となりました。

同じようなストレスを抱えてる方がいれば、参考にして下さいな。

2018年11月9日金曜日

C#(.NET Framework)で作ったコンソールアプリを .NET Core を使ってLinuxで動かしてみる!【後編】


こんにちは。よっしーです。

今回は、Visual Studio 2017 の C#(.NET Framework)で作ったコンソールアプリを
.NET Core を使ってLinux上で動かす。という前回からの続きです。

まず、Linux(Ubuntu)へ .NET Core をインストールします。
(現在最新バージョンの .NET Core 2.1 を入れます)

公式サイト(https://dotnet.github.io/)にディストリビューションごとの
インストール手順が記載されていますので参考にして下さい。

私の手元には Ubuntu14.04 があったので、今回はそこへインストールしました。

Microsoftのキーとフィードを登録

$ wget -q https://packages.microsoft.com/config/ubuntu/14.04/packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb

.NET Core をインストール
※ 公式サイトの手順は、sdkをインストールしていますが、
今回は実行環境のみインストールしたいので、runtimeをインストールしています。

$ sudo apt-get install apt-transport-https
$ sudo apt-get update
$ sudo apt-get install dotnet-runtime-2.1

これで実行環境が用意できました。

あとは、前回 Visual Studio で作成した、
実行ファイル一式を、Linux上へ配置します。

$ tree
.
|-- dotnet_sample.deps.json
|-- dotnet_sample.dll
|-- dotnet_sample.pdb
`-- dotnet_sample.runtimeconfig.json

これで準備完了です。さっそく実行してみましょう。
dotnet コマンドにDLLファイルをパラメータとして渡して実行します。

$ dotnet dotnet_sample.dll コマンドライン引数A コマンドライン引数B
コマンドライン引数A, コマンドライン引数B
/home/yossy/dotnet_sample

コマンドライン引数とカレントディレクトリのパスを表示し、
text.txt を出力しています。内容を覗いてみると。。。

$ cat test.txt
コマンドライン引数A
コマンドライン引数B

コマンドライン引数として渡した文字列が正しく格納されています。

Windowsで確認した動作と同じ結果となりましたね。
Linux上で.NET Framework を用いたプログラムが動作していることがわかります。




今回、簡単なサンプルプログラムを作ってみましたが、注意する点として、
WindowsとLinuxではパスの扱いが異なる。ということが挙げられます。

例えばディレクトリ階層を "¥¥" で連結しているようなプログラムは、
Windows側だと正しく動きますが、Linux側ではパス異常となります。

× Windows側でしか正しいパスにならない。
string path = Directory.GetCurrentDirectory() + "\\" + "test.txt";

 パス結合するライブラリを用いることでWindows/Linux共通で動作する
string path = Path.Combine(Directory.GetCurrentDirectory(),"test.txt")



OSに依存するような所はライブラリが吸収してくれるはずですので、
上手くそれらを使うようなプログラミングを心がけましょう。

ではまた~。

2018年11月3日土曜日

C#(.NET Framework)で作ったコンソールアプリを .NET Core を使ってLinuxで動かしてみる!【前編】


こんにちは。よっしーです。


さて今回は、タイトルにもある通り、

C#(.NET Framework)で作ったコンソールアプリをLinux上で動かす。

ということをご紹介したいと思います。


.NET Framework って Microsoft が提供してるから、

.NET Framework = Windows というイメージがありますが、

最近ではLinux上でも動作することが出来るんです。


さっそく Visual Studio 2017 Community でチャレンジしてみましょう。


プロジェクトの作成画面から以下を選択します。
 → Visual C#
  → .NET Core
   → コンソール アプリ(.NET Core)


実行すると 「Hello World!」 と出力されるテンプレートが作成されます。


今回は、.NET Framework が Linux上で動作するかを確かめたいので、
Systemのクラスライブラリを使って簡単なサンプルを組んでみました。

<内容>
・カレントディレクトリパスを取得
・コマンドライン引数とカレントディレクトリ名をコンソール出力
・カレントディレクトリにtest.txtを作成し、コマンドライン引数の内容をそのファイルへ出力


あとは、適当に Visual Studio 上から実行する際のコマンドライン引数と、
作業するディレクトリ(カレントディレクトリ)を情報として設定します。


Visual Studio上で実行してみましょう。もちろんWindows上で動作します。

動作結果として、
設定したコマンドライン引数とカレントディレクトリパスがターミナル上に出力され、
出力された test.txt にはコマンドライン引数の内容が出力されます。

まぁ、実装通りですね。。。


下準備はここまでです。

で、このプログラムを Linux 上で動作させるのが今回の目的となりますので、

次に進めていきましょう。


ビルドメニューから、○○○○(プロジェクト名) の発行 というのがあるので選択します。


次の画面に進むので、続けて 発行 を選択します。


すると、対象のディレクトリに以下のような生成物が出力されます。


DLLファイルが出力されていることがわかりますが、これが Linux上 で動作する
プログラムファイルとなります。

DLLなのに実行ファイル?と、Windows脳だとちょっとシックリこないのですが、
Linux で動作させる場合は、dotnet という実行ファイルに このDLLファイルを
指定して動作させるので、そんなに違和感は感じなくなります。

次は Linux 側での操作となりますが、ちょっと説明も長くなってきたので、
今回はここまでとさせてもらいます。

ではまた~。