Webの業務システムはそろそろ時間がないよという話

前提

IEディスコン。次はedge

サポートライフサイクルの変更

www.microsoft.com

IE11のエンタープライズモードのサポート期限は2020年

Internet Explorer のサポート ライフサイクル ポリシーに関する FAQ



直近でやること

2016年1月12日までにIE11で動くようにする必要あり

ターゲットのOS(Vista、7、8…)でちょっと変わってくるけど、Windows7の場合はIE11でシステムが動くようにしておく必要がある。
Windows7の場合IE11よりも古いブラウザはサポート対象外になるので。
ただし、互換モードが使えるので、まだいくらかマシ

2020年1月14日までにedgeで動くようにする必要あり

IEエンタープライズモードでお茶を濁しても、2020年までで終わるのでそれまでにedge(というか最新ブラウザ)に対応する必要あり。



edge(2020年以降)だと多分こうなる

アップデートのスピードが早くなる

というか、ブラウザ1バージョンの賞味期限がかなり短くなる。

まだ発表がないのでなんとも言えないのだけど、多分ChromeFirefoxと同じと予想すると、6週間に1回のペースでアップデートが掛かることになる。いままでのMicrosoftは過去バージョンのIEについてもサポートしてくれていたが、それも2016年で終わるという話なので、多分サポートについては「n-1(最新版とその一つ前)」サポートになるはず。

ユーザーは変化を受け入れる必要がある

Webって変化上等な世界なので、Web全体が変化していく中、自分たちのWeb(業務システム)だけは変わらないで使える状態を維持するのは骨が折れる(というか割に合わなくなる)。今まではMicrosoftIEの互換モードでその労力を肩代わりしてくれていた部分もあったけど、IEディスコン、edgeはIEとの互換性なしという決断がくだされた今、そのコストは自分たちで払う必要が出てくる。

ユーザーが変わらないことを業務システムに望んでいるなら、Webを止めて、クライアントアプリケーションにしたほうが、まだ変化が緩やかなので維持しやすいと思う。(Webからクライアントアプリケーションに変えることは必要になるけれど。)

その結果

もし、馬鹿正直にやるとなるとブラウザがバージョンアップする度(6週間毎!?)に動作確認(テスト)を実行する必要がある。あまりにも大きな業務システムがWebに乗っかっている場合は、テスト計画だけで6週間過ぎるかもね。



これからのWebの業務システム

そもそも「その業務システムは本当にWebでやる必要があんのか?」ってところから考えたほうが良い。
ブラウザ利用できるのに社外からアクセス出来ないとか、10人ぐらいしか使ってないWebのシステムとかは、この際にクライアントアプリケーションにでもした方が良い。もしくはパッケージとかが利用できるなら利用するとか。

ROI次第とは思うんだけど、コアコンピタンスからは離れているWebの業務システムは、これから自分で維持するのが大変になると思う。



というわけで

そもそもWebでやる必要があるのか? やるなら自作かパッケージ等の導入か? アップデートに追いつくための作戦は? パッケージを使うなら業務とのギャップは? とか考えたら5年なんてあっという間という話でした。

NEC Aterm WG1400HP(HPモデル)がイマイチ過ぎた話

ことの始まり

AirMacExpressが5年目ぐらいを迎えて、流石に限界だろうってことで買い替え。最近ぶら下がる端末も増えてきており、AppleTVでhuluとか見てると、露骨に他の端末の回線スピードが遅くなったりしてたので買い替えを決意

NEC Aterm WG1400HPを選んだ理由

AirMacは高いのだよ…。
うちにはアップル製品が多いので、AirMacを買えば間違いないことは分かっていたけど、いかんせん高いのだよ…。

他のメーカーを調べてみると、バッファロー、IOデータ、NECなんだけど、NECエンタープライズ向けの製品を多く作っているイメージがあったので、家庭用の製品も品質が高いだろうと予想。(←これが悲劇の始まり)
で、購入時のモデルのうち、松竹梅の竹にあたる1400を購入。

購入後に起こったこと…

最初だけは良い、最初だけは…

電源オンの直後とか、再起動直後とかは100MB以上のスピードを出してくれる。でもしばらくすると20〜30MB程度のスピードまで落ちる。 面倒なのは、その”しばらく”がそのタイミングで来るか分からねーってこと。再起動した数時間後に来る時もあれば、1〜2週間は大丈夫だったりする。この現象について調べてみると、現状のAterm系すべてに発生する不具合とのこと(ただし、サポート未確認)。
使ってる人によっては週イチで再起動という涙ぐましいことをしている人もいる様子。

ネットワークが勝手に切れる

iPhone/iPadがネットワークから閉めだされる(切れる)ことが多々あった。wifiのオンオフをすれば再接続してくれるが、毎回やるのは非常にストレスフル。

とは言えコレはルーターのせいではなく、Appleが盛大にやらかしたiOSのせいかもしれない。
とは言えAirMacを利用している時には無かったので、非常にストレスフルな感じ。

3ヶ月後に5GHzに繋がらなくなる

iPhoneMacどちらでも5GHzのネットワークに繋がらなくなってしまった。再起動、初期化、ファームウェアの更新、工場出荷状態に戻すなどしても回復しない。
5GHzが利用できるルータとして買ったのに、5GHzが利用できないってのは意味が無いが、2.4GHzには繋がるので接続先を切り替えて運用。

2.4GHzだけにすると幸せになれるかもと期待したけど…

ルーターの設定を見直し、5GHzの機能を殺すことで、回線速度が落ちたり、接続が切れたりするのを回避できるという情報があったので試してみる。

結果として何も変わらず。
5GHzは使えないし、再起動しないとトロくさくなるのは相変わらず。

遅い…遅すぎる…

5GHzを殺して数週間程度たったころには、数メガ程度の回線速度しか出ず、LTEの方が全然快適に使える状態に…。 ここまで来るとサスガに体感でも分かるぐらいにもっさりし始め、画像の多いサイトでは表示されずにイライラする。 保証期間内なので交換してもらうことも考えたけど、これまでの状態から、このルーターに対しても信用(と愛情)が0に近い状態なので、買い換えることにした。

ちなみに有線だと

まともに動作するかと思いきや、全くそんなことはなく。
無線と有線でスピードに大差がないというよく分からんことに。
電波が届く届かない、電波の状態がどうとかの問題以前に、有線無線関係ないルーターとしての部分に不具合があると思う。

結局AirMac Extremeに買い替えました

2014/12/20にAterm1400を注文して、2015/04/05に新しいAirMacを買っているので、4ヶ月程度の利用でした。 あれから3ヶ月程度AirMacを利用していますが、非常に安定して利用できています。今のところ何ら不満はありません。

結論

  • 今の時代ネットって電気水道ガスと変わりませんよね。
  • だから無線LANで不安定なのはクソだと痛感した
  • Amazonのレビューでは高評価の人もいるので、初期不良、またはウチの環境(Apple製品多し)と合わなかった可能性もあるにはある。
  • Apple最高

参考までにウチの環境

C#プログラマからみたPython 内包表記編

内包表記

C#でいうところのLINQに近いイメージ。 Pythonではリストの初期化(宣言)時にブロックを利用せずにインラインで記載することが出来る。

#内包表記。
sp2 = [x ** 2 for x in range(1,10)]
print(sp2)
#内包表記を利用しない書き方
sp = []
for x in range(1,10):
    sp.append(x ** 2)
print(sp)

C#だとこんな感じ。

//C#
var ten = Enumerable.Range(1, 9);
var sp2 = from n in ten select n * n;

ただし、PythonにはC#のクエリ式にあるような強力な構文(orderとか)はないっぽい。

リスト内包表記はリストを返却する式のため、式を記述できる場所にはどこでも記述することができる。したがって以下のようなことも可能。

sp3 = [(x, [y for y in range(1, x) if x % y == 0]) for x in range(1, 11)]

なお、これは数と公約数を調べるリスト。 この時点で脳がこんがらがってくるし、コメントも打ちづらいので過剰に利用するのは禁物かな。 LINQなどでも一緒だけど。

ちなみにPython3からはディクショナリとsetに対しても内包表記が追加されている。 多少構文が異なる程度で、考え方はリストの内包表記と同様。

イテレータ(ジェネレータ関数)

C#イテレータPythonイテレータ(ジェネレータ)はよく似ている。

イテレータはそもそも”順番をともなった複数の要素を抽象的に扱うための仕組み”を指すことだと考えており、Pythonの場合はイテレータとジェネレータという形に分けられている。

対してC#の場合は、イテレータブロックというような表現がされており、イテレータが仕組みではなく構文のような扱いになっていることから、Pythonイテレータ(ジェネレータ)という書き方にした次第。。。

#python
def get_primes(x = 2):
    while True:
        for i in range(2,x):
            if x % i == 0:
                break
        else:
            yield x
        x += 1

C#のコードは面倒なので割愛( ー`дー´)
どのみち構文は全く似とらんし。

ただし、役割としては似ていて、どちらもフィボナッチ数列素数やらを求めるようなものや、予めループの回数が決まっていないようなものに対して強力。

ジェネレータ式

Python3からはジェネレータ式も導入されており、リスト内包表記と同じような書き方で、ジェネレーターを定義することが可能。

gen = (ord(s) for s in "python")


グーグルドライブを手動で同期する方法

クライアントアプリのグーグルドライブの同期が遅い…というか、やってるのか不安になるので、手動での同期方法を調べてみた。

やり方

  • 手順
    1. メニューから一時停止を選択する。
    2. メニューから再開を選択する。
    3. 同期が実行される

Evernoteみたいに同期のボタンがあれば良いのだが、グーグルドライブにはないようで、手動で一時停止と再開を選択するしかない様子。

C#プログラマからみたPython 基本の制御構文

if文

#python
if year == 1986:
    print('明治元年')
elif year == 1912:
    print('大正元年')
else:
    print('その他')
// C#
if (year == 1986)
{
    System.Console.WriteLine("明治元年");
}
else if (year == 1912)
{
    System.Console.WriteLine("大正元年");
}
else
{
    System.Console.WriteLine("その他");
}

このように、インデントでif文の処理を表現する。
C系の言語のように{}で表現はしないので、書き方としてはVB系の言語と似ているが、VBとは異なり条件の中で自由に改行を入れることが可能なので融通が効く。個人的にVBの条件式中で改行できない点は地味にイラッとしていた点なので、Pythonの条件式の融通はかなり嬉しい。
(とは言え、つい最近のVisualStudioでは自由に改行できるようになったが…。)

なおelse ifPythonではelifと表現する。 また、Pythonにはswitchに相当する制御が存在しない。 switchを利用したいときには、if〜elifを利用することになる。

for文

#python
for i in range(10):
    print(i)
foreach(int i in array)
{
  System.Console.Write(i);
}

インデントで表現するのはif文と同様。
rangeでループ回数を制御している。なお、rangeは引数で与えられた数の分だけリストを作成する関数。
構文こそforとなっているが、動作としては…

シーケンスの要素を1つずつ繰り返し変数に代入していき、要素が無くなるまでループを実行します。

みんなのPython 112ページより

というものなので、C#foreachと同じ。
Pythonでもループ中にはbreakcontinueを置くことができ、動作はC#と変わらない。

ループカウンタ

Pythonのループ処理では基本的にループカウンタは利用しないとのことだが(確かに最近はC#でもforeachの方がよく使っている)、ループカウンタを利用したい場合は、enumerate()関数を利用する。

#python
for i, cnt in enumerate([1,2,3]):
    print(i)
// C#
for(int i = 0; i < 3; i++)
{
  System.Console.Write(i);  
}

enumerate()関数は2つの要素をタプルにして返却する。
最初の要素はループカウンタに該当する数値で0から順番に増えていく。

while文

#python
while cnt < 10:
    print(cnt)
    cnt += 1
// C#
while(cnt < 10)
{
    System.Console.Write(cnt);
    cnt++;
}

C#などのwhileと同様。 ただし、VBなどであったwhile〜doのような制御構文は存在しない。 アレ使うと、脳がこんがらがって死ぬので歓迎。

なお、whileでもループ中にはbreakやcontinueを置くことができる。動作もいっしょ。

C#プログラマからみたPython 関数の基本編

基本の呼び出し方

# Python
len('hello')

このように、関数名の後ろに「()」を付与することがPythonで関数を呼び出すためのルール。


関数定義の方法

# Python
def funcSum(args1, args2):
    return args1 + args2
// C#
int FuncSum(int args1,int args2)
{
    return args1 + args2;
}

関数を定義するには「def文」を利用する。
defの後に関数名を置き、引数を()で囲む。 Pythonではあらかじめ型を定義することができない(動的に決まる)ので、関数や引数に型を指定しなくて良い。
なお、C系の言語でよく利用される{}は、Pythonではインデントで表現される。

ところでC#のコードからはあえて省いちゃったんだけど、Pythonってアクセス修飾子がないの? → あとで調べる。


引数

前述のとおり、関数名の後に続く()に引数を指定する。
Pythonでは型を指定せずとも呼び出すことが可能になっているため、どんな型のオブジェクトであっても渡すことが可能。

ただし、引き換えとしてコンパイル時の静的チェックの恩恵も受けることが出来ないため、型が合わない場合は実行時エラーとなる。従ってPythonでは引数で受け取った型が何であるかをよく確認する必要があるはず。

引数のデフォルト値

Pythonでも省略可能引数を定義することが可能。
関数の定義で、引数を受け取る変数を指定する時に値を導入しておくと、デフォルト値を指定できる。

# Python
def funcSum(args1, args2=100):

引数のキーワード指定

C#では名前付き引数と呼ばれていたもの。
C#ではあんまり使ったことがないのだけど、名前付きで引数を指定してやると、引数の順序を自由に書くことが出来る。

# Python
foo = funcSum(args1=22, args2=33)
// C#
var foo = FuncSum(args1:1,args2:4);

違いは「:」か「=」かってぐらい。通常と同じように書けるPythonの方が便利かな。


参照渡しと値渡し

参照渡し値渡しについて、C#では「ref」キーワードを使って区別していたが、Pythonではキーワードでは区別しない。
書き換え可能オブジェクトを関数の引数として渡した場合に、参照渡しと同じように扱われるとのこと。

えーぶっちゃけ今のPythonレベルだとよくわからないので、ここは後で調べようと思います。


東プレ キーボード REALFORCE91UBK-S インプレッション

1年半ほどRealforceを使ってきたのでインプレを。

大雑把な印象

キーボードの基本的で最も大事な部分をひたすら極めていったキーボードというような感じ。
基本的で最も大事な部分というのは、"文字を早く、正確に、疲れずに打てる"という部分。
なのでキーボードが入ってる箱はもろダンボールのまんまだし、キーバックライトはないし、それどころかCaps Lockのランプすらないし、アプリケーションを起動させるようなギミック的なボタンもないしで、人によっては「2万円もするのにこの程度?」と思うかもしれないので、そういうゴテゴテしたのが好きな人にはおすすめしない。

静音モデルについて

このREALFORCE91UBK-Sは静音モデルということで、通常の製品より打鍵音が小さめに作られている。
別のREALFORCEとくらべてみたこともあるが、確かに多少(2〜3割ぐらいかな)音が小さくなっていることが確認できた。
とは言え通常モデルよりも3000円ほど高いので、キーボードは静かじゃなきゃイヤだという人以外は、通常のREALFORCE91UBKを購入しても良いと思う。FILCOなどのメカニカルキーボードと比べると、普通のREALFORCEでもだいぶ静かなので。

なお、通常のモデルと静音モデルの差は型番に「S」が付いているか否か。Sが付いている方が静音モデル。付いてないのが通常モデル。

ここがいい

打ち心地が良い

これの前に使っていたアーキサイトのメカニカルキーボードと比べて打ちやすさに遜色はなし。キーの荷重が低いのに加え、一番下までストロークせずに打てるので、アーキサイトの茶軸キーボードよりも楽かもしれない。
ただし、メカニカルキーボードが打鍵時に指へのクリック感があるのに対し、Realforceはストンという感じでクリック感はやや鈍い感じがする。
このあたりは人の好みとしか言えないけれど、私の場合はクリック感はわりとどうでもいいので気にしていない。

打鍵音が静か

茶軸のメカニカルキーボードと比べ非常に静か。 割りと強めにタイプしてもパンタグラフのよくあるキーボードと同じか、もっと静かといっても良いぐらい。
このモデルは静音モデルということもあり、深夜や早朝にガタガタ打っても周りに気を使うことはないはず。

カナ表記がない

キーボードがカナ表記でごちゃごちゃせずにシンプルで良い。好みの問題だけども。

テンキーがない

テンキーなどいらぬ! 優先するはホームポジションとマウスの移動量だ!
という私みたいな人にはおすすめ。

変態配列じゃない

このRealforceはフルサイズキーボードからテンキーをぶった切ってそのままという具合なので、フルサイズのキーボードと何ら変わらない。テンキーがないだけ。
テンキーレスになった途端に、HomeとかDeleteとかがよく分からんレイアウトに飛ばされるようなこともない。


もうちょっとがんばってほしい

Caps Lockのランプがほしい

高いキーボードによくあるようなギミックのようなものは何一つとしてない。
せめてCaps Lockのランプぐらいは欲しいというのが本音。
というか、Caps Lockのランプがないのでキーボードを見てもOnOffの判別ができないので、パスワードとかの打ち間違いに注意。

USBケーブルが取り外せない

あんまり取り外すこともないかもだけど、USBケーブルを取り外すことができない。
ちょっと短いケーブルに変えるとか、断線した時にケーブルだけ買って対応するというようなことは無理。
とは言え、かなり太いUSBケーブルなので余程のことがなければ断線しないと思うけど。

お値段が…

高級キーボードの代名詞のRealforce、しかも静音モデルということでかなり良いお値段がする…。値段分の価値はあるし、10年ぐらい使えるらしいので十分元は取れると思うけど、やっぱりちょっと高いよね。

個人差かもだけどポジションがシビア(な気がする)

他のキーボードと比べて、ポジションがシビアな気がする。 キーボードと身体の位置がずれていたり、キーボードに対して斜めに座ってたりすると、とたんにミスタイプが増える。なんとなく、ポジションのスイートスポットが狭い印象。

まとめ

こんな人におすすめ

  • 最高峰のキーボードを使ってみたい人
  • 文章作成やコーディングを快適に行いたい人
  • テンキーなどいらない人
  • キーボードにタイピング以外の機能は求めていない人