つかさのBlog@hatena

技術系ブログのはず

NASにアクセス出来なくなった際の対処方法

事象

Windows7からWindows10にアップグレードしたところ、バッファロー製ルータの「USB外付けHDDのNAS化」機能が突如使えなくなりました。
原因はいつぞやのアップデートでMicrosoftの「Server Message Block」(SMB)プロトコルバージョン1.0をデフォルトで無効化したそうです。
古いルータを使用していたため、SMB1.0にしか対応していない上にファームウェアのアップデータも公開されておらず、渋々SMB1.0を有効化しました。
※セキュリティ上の問題もあるため、自己責任となります

手順

「Windowsの機能」より「SMB1.0/CIFSファイル共有のサポート」にチェックを入れ、再起動すればNASへアクセス可能になります。
f:id:tsukasa-labz:20181129190848p:plain

↓↓↓↓↓

f:id:tsukasa-labz:20181129191244p:plain

一生に一度しか見れないサイト「+LIFE」を何度も開く方法

YouTubeなどで話題になっていた、+LIFEというサイトを何度も開く方法について書いていきます。

f:id:tsukasa-labz:20181108234039p:plain +LIFEへアクセスすると上記の画面が表示されます。
中央部分にある牛のシルエットあたりをクリックするとスタートします。
下記の2択を迫られ、3秒以内に回答する必要があります。

  • 母親を助ける

  • 見ず知らずの子供を助ける


どちらかを選択、またはどちらも選択しない状態で、3秒経過すると結果が表示されます。
再度やり直そうと+LIFEへアクセスしても、下記の画面が表示されます。
f:id:tsukasa-labz:20181108234049p:plain

選び直すためにやったこと

  • ブラウザのキャッシュ、クッキーのクリア

  • ブラウザをプライベートモードで実行

  • IPアドレスを変更

  • アクセスするPCの変更

しかし、上記の方法では選び直すことができませんでした。

選び直すために必要なこと

  1. ブラウザのキャッシュ、クッキーのクリア(もしかしたら不要かも)
  2. IPアドレスを変更
  3. FlashのSharedObjectを削除

解説

1のブラウザキャッシュ、クッキークリアはFirefox終了時、自動的に消えるように設定していたため記載していますが、もしかしたら不要かもしれません。
2はこちらの記事に記載した手順で、IPアドレスを変更しました。

3が盲点でした。サイトがFlashで作られており、SharedObjectというクッキーのようなものに情報が残っていました。

ということで、SharedObjectに記録されている情報を消していきます。
1. 「Windowsキー」 + 「R」で「ファイル名を指定して実行」ウィンドウを表示
2. 「名前」欄に「%APPDATA%\Macromedia\Flash Player#SharedObjects」と入力
3. 「OK」をクリック。

エクスプローラで該当フォルダが表示され、その中に英数字8桁程度のフォルダ(おそらくランダム文字列)が作成されています。
そのフォルダを開くと「kappuku.jp\life\index.swf」という階層でフォルダが作成されています。
その中に「kappuku_life.sol」というファイル(おそらく拡張子はランダム)が作成されています。
f:id:tsukasa-labz:20181109015142p:plain

「kappuku_life.sol」をテキストエディタで開くと、選択した内容のコード値が記載されています。
私は「#SharedObjects」直下にある英数字8桁程度のフォルダ毎削除し、無事に選び直すことができるようになりました。
※上記作業はブラウザを閉じた状態で行ってください。

kappuku_life.solの正体

ファイルをサクラエディタで開いてみたところ「 ソ )TCSO kappuku_life clickNum 1 」という1行が記載されていました。
「clickNum」の後ろにある数字が、選択した内容のコード値で、下記のようになっていました。
1:母親を助ける
2:見ず知らずの子供を助ける
3:何もしなかった場合

0やマイナス値に書き換えてみたところ、1と同様の結果になりました。
4以上に書き換えてみたところ、3と同様の結果になりました。

感想

IPアドレスを変更せず、初めて使用するPCからアクセスしても「2度目はありません」と表示されており、少し驚きました。
ですが、この時点でIPアドレスを記録していることは確定しました。

選択した内容により、「2度目はありません」の画面に出ているシルエットが変わっていました。
この点は後から気がつきましたが、クッキーやキャッシュを消しているのに選択した内容を保持しているということは、別の手段で情報を保持しているというヒントでした。
もう少し注意深くデバッグしていれば、より少ない時間で問題解決できたのかなと少し残念な気分になりました。。。

その他

取り上げていたYouTuber
Fischer's-フィッシャーズ-
水溜りボンド
ヒカル(Hikaru)

Firefoxでプロキシを設定する方法

下記の順に操作することで、Firefoxにプロキシの設定が行えます。

手順

1. メニューをクリック
2. オプションをクリック
3. ネットワーク設定の「接続設定」をクリック
f:id:tsukasa-labz:20181108230203p:plain

4. 「手動でプロキシを設定する」を選択
5. HTTPプロキシに設定するIPアドレスを入力
6. ポートに設定するポート番号を入力
7. 「すべてのプロトコルでこのプロキシを使用する」にチェック
8. 「OK」をクリック
f:id:tsukasa-labz:20181108230212p:plain


設定するプロキシ

Googleで「プロキシ 一覧」などと検索すると、無料で使えるプロキシのリストがでてきます。
ここでは一例を記載しておきます。
CyberSyndromeというサイトでプロキシの一覧が表示されます。
下記画像の赤枠で囲った「213.160.167.238:33952」の部分を上記手順5、6で入力します。
※コロンの左をIPアドレス、右をポート番号にそれぞれ設定します
※表示されるリストは随時更新されるため、当ブログに記載したものではなく、検索されることをオススメします
f:id:tsukasa-labz:20181108231623p:plain

Windows10でIMEで日本語入力切り替え時、「あ」や「A」を表示させない方法

いつからかWindows10で日本語入力を切り替えると、画面中央に「あ」や「A」が表示されるようになったようです。
たいした問題では無いのですが、頻繁に「あ」や「A」が、デカデカと表示されると鬱陶しいので、オフにする方法を紹介します。

1. タスクトレイの「あ」または「A」を右クリック

f:id:tsukasa-labz:20181014221114p:plain

2. メニューから「プロパティ」をクリック

f:id:tsukasa-labz:20181014215526p:plain

3. 「IME入力モード切替の通知」内の「画面中央に表示する」のチェックをはずす

f:id:tsukasa-labz:20181014221726p:plain

4. 「OK」をクリック

特に再起動等は必要なく、即時反映されます。

代替案

会社では上記の方法で標準のIMEを使っていますが、自宅ではATOKを使用しています。
f:id:tsukasa-labz:20181014223511j:plain

ATOKの紹介は別途記事にしたいと思います。

C#におけるLINQの小ネタ3

下記は仕事中に見かけた冗長なソースコードです。

if (list.Where(x => x.IsAlive == true).Count() > 0)


「IsAlive」はbool型なので「== true」の記述は不要です。
そのため下記のように記述できます。

if (list.Where(x => x.IsAlive).Count() > 0)


「Where」で条件を指定した後に「Count()」としていますが、「Count()」内に条件を指定できます。
そのため、下記のように記述できます。

if (list.Count(x => x.IsAlive) > 0)

参考:C#におけるLINQの小ネタ1

条件に合致する要素が1つでもあるかどうかを調べる場合は「Any()」が使用できます。
そのため、下記のように記述できます。

if (list.Any(x => x.IsAlive))

参考:C#におけるLINQの小ネタ2

まとめ

下記の通り、非常にスッキリしました。
どちらも動作は同じで誤りではありませんが、余計な記述は極力しないほうがバグを埋め込まなくて済むかと思います。

Before
if (list.Where(x => x.IsAlive == true).Count() > 0)
After
if (list.Any(x => x.IsAlive))


参考

f:id:tsukasa-labz:20180829231254j:plain:w200
C#ショートコードプログラミング 第3版

C#におけるLINQの小ネタ2

下記は仕事中に見かけたソースコードで、改善の余地がある記述です。

修正前ソースコード

if(users.Count(f => f.Age >= 40) > 0)
{
    Console.WriteLine("40歳以上が存在します!");
}

リスト内で条件に合致するデータが、1件でも存在する場合は「Count() > 0」とするより「Any()」としたほうが簡潔に記述できます。
参考:Qiita

修正後ソースコード

if(users.Any(f => f.Age >= 40))
{
    Console.WriteLine("40歳以上が存在します!");
}


自分でも気を抜くとたまにやってしまうので、戒めの意味を込めてブログに掲載。

ソースコード全体

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // テストデータを取得
            List<UserInfo> users = GetTestData();

            // 年齢が40以上のユーザが1人でもいる場合
            if(users.Count(f => f.Age >= 40) > 0)
            {
                Console.WriteLine("40歳以上が存在します!");
            }

            Console.Read();
        }

        /// <summary>
        /// テストデータを取得
        /// </summary>
        /// <returns>テストデータリスト</returns>
        static List<UserInfo> GetTestData()
        {
            List<UserInfo> list = new List<UserInfo>();
            list.Add(new UserInfo() { UserID = "UserA", UserName = "ユーザA", Age = 18 });
            list.Add(new UserInfo() { UserID = "UserB", UserName = "ユーザB", Age = 34 });
            list.Add(new UserInfo() { UserID = "UserC", UserName = "ユーザC", Age = 30 });
            list.Add(new UserInfo() { UserID = "UserD", UserName = "ユーザD", Age = 38 });
            list.Add(new UserInfo() { UserID = "UserE", UserName = "ユーザE", Age = 45 });
            list.Add(new UserInfo() { UserID = "UserF", UserName = "ユーザF", Age = 24 });
            list.Add(new UserInfo() { UserID = "UserG", UserName = "ユーザG", Age = 32 });
            list.Add(new UserInfo() { UserID = "UserH", UserName = "ユーザH", Age = 19 });
            list.Add(new UserInfo() { UserID = "UserI", UserName = "ユーザI", Age = 23 });

            return list;
        }
    }

    /// <summary>
    /// ユーザ情報を保持するクラス
    /// </summary>
    class UserInfo
    {
        /// <summary>
        /// ユーザID
        /// </summary>
        public string UserID { get; set; }

        /// <summary>
        /// ユーザ名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 年齢
        /// </summary>
        public int Age { get; set; }
    }
}


参考

f:id:tsukasa-labz:20180829231254j:plain:w200
C#ショートコードプログラミング 第3版

C#におけるLINQの小ネタ1

下記は仕事中に見かけたソースコードで、冗長になっている記述です。
「ソースコード抜粋」の①、②は共にListをLINQで絞り込み、件数を取得する処理です。
①は「Where」で条件を指定し、「Count()」で件数を取得しています。
しかし、「Count()」内にカウントする条件を指定することで簡潔に書けるため、②の記述で良いかと思います。
どちらも結果自体は同じになるため、誤りではありません。

といいつつ、自分でも気を抜くとうっかり①の記述をしていることがあるので、戒めの意味を込めてブログに掲載。

ソースコード抜粋

int count = users.Where(f => f.Age >= 20).Count(); // ①
int count = users.Count(f => f.Age >= 20);         // ②


ソースコード全体

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // テストデータを取得
            List<UserInfo> users = GetTestData();

            // 年齢が20以上のユーザ数を取得
            int count = users.Where(f => f.Age >= 20).Count(); // ①
            int count = users.Count(f => f.Age >= 20);         // ②

            Console.WriteLine("件数:{0}", count);
            Console.Read();
        }

        /// <summary>
        /// テストデータを取得
        /// </summary>
        /// <returns>テストデータリスト</returns>
        static List<UserInfo> GetTestData()
        {
            List<UserInfo> list = new List<UserInfo>();
            list.Add(new UserInfo() { UserID = "UserA", UserName = "ユーザA", Age = 18 });
            list.Add(new UserInfo() { UserID = "UserB", UserName = "ユーザB", Age = 34 });
            list.Add(new UserInfo() { UserID = "UserC", UserName = "ユーザC", Age = 30 });
            list.Add(new UserInfo() { UserID = "UserD", UserName = "ユーザD", Age = 38 });
            list.Add(new UserInfo() { UserID = "UserE", UserName = "ユーザE", Age = 45 });
            list.Add(new UserInfo() { UserID = "UserF", UserName = "ユーザF", Age = 24 });
            list.Add(new UserInfo() { UserID = "UserG", UserName = "ユーザG", Age = 32 });
            list.Add(new UserInfo() { UserID = "UserH", UserName = "ユーザH", Age = 19 });
            list.Add(new UserInfo() { UserID = "UserI", UserName = "ユーザI", Age = 23 });

            return list;
        }
    }

    /// <summary>
    /// ユーザ情報を保持するクラス
    /// </summary>
    class UserInfo
    {
        /// <summary>
        /// ユーザID
        /// </summary>
        public string UserID { get; set; }

        /// <summary>
        /// ユーザ名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 年齢
        /// </summary>
        public int Age { get; set; }
    }
}


※上記ソースコードを実行する場合は「int count = ~」となっている①、②のどちらかをコメントアウトしてください

LINQとは

統合言語クエリ (LINQ) は、クエリ機能を C# 言語 (および Visual Basic や場合によってその他の .NET 言語) に直接統合する一連の技術の名前です。 LINQ を使用すると、クエリは、クラス、メソッド、イベントなどと同じように、高度な機能を備えた言語構成要素になります。

クエリを記述する開発者の場合、LINQ で最も違いを認識できる "統合言語" 部分はクエリ式です。 クエリ式は、C# 3.0 で導入された宣言クエリ構文で記述します。 クエリ構文を使用すると、データ ソースに対する複雑なフィルター処理、順序付け、およびグループ化の操作を最小限のコードで実行できます。 同じ基本的なクエリ式のパターンを使用して、SQL データベース、ADO.NET データセット、XML ドキュメントとストリーム、および .NET コレクション内のデータを照会および変換します。

完全なクエリ操作の例を次に示します。 完全な操作には、データ ソースの作成、クエリ式の定義、および foreach ステートメントでのクエリの実行が含まれます。

LINQ クエリ式 (C# プログラミング ガイド)より