Hatena::ブログ(Diary)

不完全なマシマロ このページをアンテナに追加 RSSフィード Twitter

2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2038 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
ネット上に転がってる情報をおいしく頂きつつお裾分け。
お勉強メモとして始めて早5年、今となってはただ黒歴史を綴るだけの雑記。
ご利用は自己責任でお願いします。

2038-01-19 日付はアレです

INDEX

05:30 |  INDEXを含むブックマーク  INDEXのブックマークコメント

熟々と書いてましたがダイエットしました。

記事一覧 - 不完全なマシマロ (最近50件)

記事一覧 - 不完全なマシマロ (51件目-100件目)

記事一覧 - 不完全なマシマロ (それ以降)

2017-05-04

NEC VersaPro J タイプVS+ウルトラブック プロ キーボード=?

14:51 | NEC VersaPro J タイプVS+ウルトラブック プロ キーボード=?を含むブックマーク NEC VersaPro J タイプVS+ウルトラブック プロ キーボード=?のブックマークコメント

ここに去年3万5千円でポチった*1NECタブレットがあるじゃろ。

f:id:naba_san:20161119143607j:image:w360

ここに3万円でポチった、ThinkPad Helix ウルトラブック プロ キーボードがあるじゃろ。

f:id:naba_san:20170504131735j:image:w360

これと

f:id:naba_san:20170504131743j:image:w360

これを

f:id:naba_san:20170504131728j:image:w360

こうして

f:id:naba_san:20170504131827j:image:w360

こうじゃ!!

f:id:naba_san:20170504131834j:image:w360

【補足】ひっくり返して装着すると…

スタンドモード、テントモードにもなります。まさにYOGA

f:id:naba_san:20170504131929j:image:h240:left

f:id:naba_san:20170503165451j:image:h240:left

f:id:naba_san:20170503162659j:image:h240

装着したままタブレットモードでも利用可能。クラムシェルモードの時、画面が狭いのと、重心が高い事が気になるくらい。

安く入手できるなら、買っておいても悪くないと思います。

製品情報とか

http://www.bizpc.nec.co.jp/pcseek/cgi-bin/cpu_smart.pl?KATA=PC-VK12CSKE56FK

http://amzn.to/2pIakPO

http://akiba-pc.watch.impress.co.jp/docs/wakiba/find/1027916.html

http://akiba-pc.watch.impress.co.jp/docs/wakiba/find/1029376.html

http://www3.lenovo.com/jp/ja/p/4X30G93920

http://amzn.to/2pHJDe7

独り言

あきばおー通販でタブレット買ってから、ここに至るまで、フォリオラップケースとか、2台目の ThinkPad ワイヤレス トラックパッド キーボードとか、色々買い込みました。

総額は結構な出費になってしまってます…

2017-02-26

Bay-Trail M Atomの中華PCにUbuntu 16.04(.2)をインストールしました

| 15:34 | Bay-Trail M Atomの中華PCにUbuntu 16.04(.2)をインストールしましたを含むブックマーク Bay-Trail M Atomの中華PCにUbuntu 16.04(.2)をインストールしましたのブックマークコメント

使い慣れるのでCentOS入れたかったんですが、そのままではKernelがemmc諸々に対応してくれないとの事なので断念。

Ubuntu LTSを下地に、DockerなりKVMなり(動くのか?)何なり使えばいいかと割り切りつつ、Ubuntu Server入れてみました。

方針

メンテナンスが必要なものは増やしたくない*1

参考にしたページ

準備したもの

現物
  • 中華PC

Bay-Trail M なAtomを搭載した3735Fマシン。所謂32bit EFI

まだ円安だった頃に、1万円くらいで買ったやつ。今回、ジャンク箱の奥底から発掘してきました。

FAT32でフォーマットしておく。

インストーラの準備
  • Ubuntu 16.04.2 LTS (Xenial Xerus)

公式 または ftp.riken.jp から、「64-bit PC (AMD64) server install image」(ubuntu-16.04.2-server-amd64.iso

ISOの中身を展開し、そのままUSBメモリにコピーする。

bootia32.efi (jfwells - github)

保存した bootia32.efi を、USBメモリの /BOOT/EFI/ へ配置する。

これでインストーラUSBメモリの準備はOK。

インストール手順

インストーラ起動からインストール完了まで

SecureBootを切った状態でUSBメモリ起動。

幾つかの問題点を避けつつ、一通りインストール

一通りインストールが終わった時、GRUBの設定でコケました。この時点ではIA32 EFIに対応しないようです。

GRUBの手動設定か何かを選び、ガイドインストーラを抜け、インストールの完了操作を行いました。

(LVMルートを示すデバイスパスが表示されるので、予め控えておきます。)

USBメモリから対象環境起動

再度インストーラを入れたUSBを起動し、インストール済みの環境を立ち上げます。

  • GRUBの起動メニューで「c」キーを押下
  • コマンドを叩いて環境起動

ls (hd1,gpt2)

linux (hd1,gpt2)/vmlinuz-4.4.0-62-generic root=【控えておいたデバイスパス(「/dev/mapper/」で始まるやつ)】

initrd (hd1,gpt2)/initrd.img-4.4.0-62-generic

boot

※ hd1, gpt2は、LVMとは別に切られたbootパスを指定するように、適宜に読み替えて下さい。

デバイスパーティション「(hd1,gpt2)」等を指定した後は、tab補完が効きます。

これでインストール済みの環境が起動しました。

(番外編)ネットワーク接続(NIC)の追加、設定

今回の中華PCは、小型PCなので有線NICを搭載しておらず、インストール完了後にUSB NICを追加しました。

少し手間取りましたが、以下の手順でNICを確認し、認識させました。

# lshw -C network

  *-network
       description: Ethernet interface
       physical id: 1
       bus info: usb@1:2.4
       logical name: enx0090******** (控えておく)
       serial: 00:90:**:**:**:**
       size: 1Gbit/s
       capacity: 1Gbit/s
       capabilities: ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=ax88179_178a duplex=full ip=**.***.*.*** link=yes multicast=yes port=MII speed=1Gbit/s
  • 続けて設定追加

# vim /etc/network/interfaces

auto enx0090********
iface enx0090******** inet dhcp

# ifdown enx0090********

# ifup enx0090********

  • 無事疎通

# ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=37.7 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=47 time=37.7 ms

これで apt-get できるようになりました!

EFI環境へのGRUBインストール

# apt-get install grub-efi-ia32

# grub-install --efi-directory=/boot/efi

Installing for i386-efi platform.
Installation finished. No error reported.

※ 他のイメージを間違えて削除しないように注意。

  • GRUBの設定は、修正が必要でしたので、下記の通り書き換えます。

# vim /etc/default/grub

#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX_DEFAULT=""

※ splash オプションが邪魔でした。quiet は、あってもなくても良さそうです。

※ nomodeset の設定が必要というページを散見しましたが、これも設定有無にかかわらず起動しました。

  • GRUB の設定内容を反映します。

# update-grub

Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.4.0-62-generic
Found initrd image: /boot/initrd.img-4.4.0-62-generic
Adding boot menu entry for EFI firmware configuration
done
  • (蛇足)EFIの設定状況確認

# efibootmgr

BootCurrent: 0000
Timeout: 5 seconds
BootOrder: 0000,0003,0001,0002,0004
Boot0000* ubuntu
Boot0001* UEFI:CD/DVD Drive
Boot0002* UEFI:Removable Device
Boot0003  UEFI: Built-in EFI Shell
Boot0004* UEFI:Network Device

# shutdown -r now

EFI上で、起動順が正しく設定されているか確認する。

一通りの作業を終えて、とりあえず起動するようになりました。

*1:NonPAEの時、後々の運用が面倒だったので

*2:たぶんmmcのブロックに異常があって、LVMだからすんなり進んだ?

2016-10-22

Servlet環境構築時の用語メモ

00:58 | Servlet環境構築時の用語メモを含むブックマーク Servlet環境構築時の用語メモのブックマークコメント

Struts1/Struts2のお仕事受けたのはいいけど、まじめにサーブレット環境構築した事なんてないぞ・・

とりあえず用語を並べてみる。設定ファイル大杉。。


Servlet

Javaを使ったサーバサイド処理の仕組みを決めた仕様。エンジンの実装は別で存在する。

コンテキスト

サーブレットエンジン上で動作させる、アプリケーションの単位のこと。

サーブレットエンジン(Tomcat)上では、複数のアプリケーションを同時に起動できる。

このとき、アプリケーション毎にセッションや設定(URL解決等)を行っており、「コンテキスト」として管理する。

コンテキストルート

アプリケーションのルートに当たるディレクトリパス、またはそれに紐づくURL

web.xml / デプロイメント ディスクリプタ(配置記述子)

サーブレットエンジンがコンテキスト初期化する際に必要となる、基本設定を書くところ。

Tomcat の場合、コンテキストルート内の /WEB-INF/web.xml に配置されたファイルを参照する。

デプロイメント ディスクリプタ自体は、Servlet の標準に則って配置するもの。

URLと各クラスのマッピング、メッセージ画面の定義などを記述する。

新しい画面を作成する場合、原則として編集が必要となる(または、WebServlet アノテーションURLパターンを記述する)。

他にフレームワークを組み合わせる場合、ここでフレームワークの指定クラスを全URLパターンに紐づけたりする事も。

WEB-INF, META-INF

Servlet 上、クライアントから見せないディレクトリ

設定ファイルなどを配置する場合、原則としてここに置く。

JVMの動作に必要なものは、原則として WEB-INF 以下に配置する。

[WEB-INF/classes] : コンパイル済み class ファイル (プロパティもここに配置する)

[WEB-INF/lib] 参照ライブラリ(jar)

Tomcat

言わずと知れたサーブレットエンジン。

Tomcatのバージョンにより、準拠しているServletのバージョンが異なる。

server.xml

Tomcat固有のサーバ環境設定ファイル。

原則として、Tomcat の環境毎に1つのみ存在し、待機ポートの指定、読み込むコンテキストなどを記述する。

コネクションプールを利用する場合、ここで Resource 要素を使ってDB資源を記述する。

※ 特定コンテキストのみに紐づく設定は、context.xml としてデプロイ対象に含めることが可能(Tomcat 5.5辺りから)。

context.xml

server.xml 同様、これも Tomcat 固有の設定ファイル。

/META-INF/context.xml に配置されたファイルを参照する。

server.xml から、<context> 要素の中身をデプロイ対象のアプリケーションに吐き出したもの。

つまり対象アプリケーションコンテキスト)固有の Tomcat に対する設定があれば、ここに書く。

(共用環境などでは、server.xml 側で許可されていない事もあるらしい。)

コネクションプールで使用するDB資源も、ここに記述可能。


Eclipse

ここもいろいろハマった。

動的Webプロジェクト

Tomcat と連携させた場合、プロジェクト名がそのままコンテキスト名になる。

WebContent/

Eclipseの動的Web プロジェクトを扱う場合のみ、ドキュメント ルートとなるディレクトリ(初期設定でそのようになっているだけ)。

デプロイの設定

プロジェクトのプロパティから「Web デプロイメント・アセンブリー」で変更可能。

動的にビルドされた、Tomcat が実際に利用するファイルは、

「workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps」

等に展開されるので、設定する際はココと突き合わせるとよい。(多少パスは変わるはず)

2016-08-11

Windows 10 Pro向けのWindows Updateグループポリシー設定メモ

14:55 |  Windows 10 Pro向けのWindows Updateグループポリシー設定メモを含むブックマーク  Windows 10 Pro向けのWindows Updateグループポリシー設定メモのブックマークコメント

自動再起動させたくないので。

コンピュータの構成 > 管理用テンプレート > Windows コンポーネント > Windows Update

自動更新を有効にする
スケジュールされた時刻に常に自動的に更新する
  • 無効
スケジュールされた自動更新のインストールで、ログインしているユーザがいる場合には自動的に更新しない
  • 有効

2016-07-23

2016-07-15

JavaScript 連想配列(オブジェクト)ツリーに対する複合キーのサンプル

00:56 | JavaScript 連想配列(オブジェクト)ツリーに対する複合キーのサンプルを含むブックマーク JavaScript 連想配列(オブジェクト)ツリーに対する複合キーのサンプルのブックマークコメント

単純な話ですが、データ取得にハマったので、備忘録としてサンプルをメモしておきます。

サンプルデータ

var testMap =({
  "depth1-a": {
    "depth2-a": {
        "depth3-x": "1",
        "depth3-y": "2"
    },
    "depth2-b": {
        "depth3-z": "3"
    }
  },
  "depth1-b": "depth1-value"
});

普通に取得しようとすると‥

こんな具合になります。(こうですよね?)

実行結果(正常ケース)
console.log(testMap["depth1-a"]["depth2-a"]["depth3-x"]);
1
実行結果(深さ違い、キー不一致)
console.log(testMap["depth1-b"]["depth2-a"]["depth3-x"]);
VM1132:1 Uncaught TypeError: Cannot read property 'depth3-x' of undefined(…)
実行結果(キー不一致)
console.log(testMap["depth1-X"]["depth2-a"]["depth3-x"]);
VM1133:1 Uncaught TypeError: Cannot read property 'depth2-a' of undefined(…)

内包オブジェクトの深さが異なる、または一部のキーが一致しない場合、途中にundefinedを挟むケースが生じる為、例外が発生して都合が悪いです。

深さに関係なく、一律にundefinedが帰ってくると嬉しいなーと。

探し方が悪いのか、良いサンプルが見つからないので書いてみた。

function getValue(map, keyArray) {
  for (var i = 0; i < keyArray.length; i++) {
    var key = keyArray[i];
    map= map[key];
    if(map == undefined) {
      return undefined;
    }
  }
  return map;
};
実行結果(正常ケース)
getValue(testMap, ["depth1-a","depth2-a","depth3-x"]);
"1"
getValue(testMap, ["depth1-a","depth2-b","depth3-z"]);
"3"
実行結果(異常ケース)
getValue(testMap, ["depth1-b","depth2-a","depth3-x"]);
undefined
getValue(testMap, ["depth1-X","depth2-a","depth3-x"]);
undefined

2016-06-06

【Java クローラ】robots.txt食べてみた

| 22:51 | 【Java クローラ】robots.txt食べてみたを含むブックマーク 【Java クローラ】robots.txt食べてみたのブックマークコメント

bot動かすならrobots.txtも残さず食べましょう。

Javaから(直接的にでも間接的にでも)利用して動かせるものを探して彷徨いました。

Crawler-Commons

探すとGoogle codeとかGitHubとかで公開されてるJava用のライブラリ

jarはMVN Repositoryから入手可能ですが、なぜかGoogle code時代のやつとGitHub時代のやつが別々に登録されてます。

ライブラリcommons-io 2.4httpclient 4.3.5tika-core 1.8slf4j-api 1.7.7/nop 1.7.7で一通り動きました。

BaseRobotsParser parser = new SimpleRobotRulesParser();

String url = "http://www.hatena.ne.jp/robots.txt";
String robotsText = "User-Agent: *\r\n"+
	"Disallow: /prof/search\r\n"+
	"Disallow: /mobile/prof/search\r\n"+
	"Disallow: /faq/report/\r\n"+
	"Disallow: /api/\r\n"+
	"Disallow: /mobile/easylogin\r\n"+
	"Disallow: /hatenatypered\r\n";

String mime = "text/html";
String robotName = "oreoreBot";

BaseRobotRules rules = parser.parseContent(url, robotsText.getBytes(), mime, robotName);

// おk
System.out.println(rules.isAllowed("http://www.hatena.ne.jp/"));

// ダメー
System.out.println(rules.isAllowed("http://www.hatena.ne.jp/mobile/easylogin/"));

// ダメー?
System.out.println(rules.isAllowed("https://www.hatena.ne.jp/mobile/easylogin/"));

実行結果

true
false
false

robots.txtは素のHTTPですが、テストコードの3件目はhttpsでもDisallowに引っかかってますね。

サンプルの状態ではスキーマをうまく認識してない?(ちゃんとソース読んでないけど、そもそも区別してない?)

とりあえず動かすところまでは確認。最低限動いてるかな?

他の候補とか

気が向いたら試してみたいやつとか、そうじゃないやつとか。

RobotParser (Python 2.7)

Python 2.7 標準ライブラリに含まれるrobot parser。

Pythonド素人ですがが、WindowsPython入れて、EclipseにPyDev組み合わせてデバッグモードで立ち上げる所までは持っていけました。

第一関門、プロキシの越え方がわからない。諦めて手元に置いたファイルを食わせ、外からクラス内の値を直接触る強硬手段に出る。

第二関門、エントリーの適用順がおかしい。プロキシ越えらない都合上、#set_url とか #read を馬鹿正直に叩けないので、代替処理をクラスの外から呼び出してました。

そのせいなのか、サンプルのrobots.txtがよろしくないのか分かりませんが、対象パスをdisallow→allowの順に解釈してしまう現象に悩まされ(拒否られてないはずなのに拒否判定され)、うまく動かず。

Javaからの(コンソール経由での)制御諸々にも難点があり、内部処理のデバッグも程々にして利用を諦めました。

WWW-RobotRules-Extended

Perlで動くパーサで、CPANからモジュールとして入手可能とのこと。

Pythonと同じ問題が付きまといそうなのと、あまりシステム汚したくなかったので今回はパス。

jrobotx

同じjava向けのライブラリで、GitHubから入手可能。ずっと更新されてないので今回は見送り。

2016-04-30 GW?なにそれおいしいの?

【自動リロード】abemaTVのコメントヘルパー作った。【ちょっとだけ軽量化】

22:08 | 【自動リロード】abemaTVのコメントヘルパー作った。【ちょっとだけ軽量化】を含むブックマーク 【自動リロード】abemaTVのコメントヘルパー作った。【ちょっとだけ軽量化】のブックマークコメント

二番煎じですみません。気づかずに作りました。

あと超絶作りが雑ですみません。

これはなに?

abemaTVウインドウをコメント専用表示にします。*1

・新着コメント(のボタン)を3秒間隔でチェックし、リロードします。

・[2016-05-02版より] 軽量化対策のため、コメントの表示件数を150件程度に制限します。*2

動作確認は Chrome 49 で行っています。

Firefoxでも動くみたいです(下記のブックマークレットは動きません*3)。

var _jq = null;
document.body.appendChild(
  function(){
    src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js";
    sc = document.createElement("script");
    sc.type="text/javascript";
    sc.src=src;
    sc.onload = function() {
      // jQuery 読込後の処理
      _jq = window.jQuery.noConflict();
      onReady("comment");
    };
    return sc;
  }()
);

function onReady(mode) {
      // 要素フィルタ
      function filter(elms, regExp) {
          var elmArray = [];
          _jq(elms).each(function(index, elm) {
              var matchingElm = _jq(elm).prop("class");
              if(matchingElm != undefined && matchingElm.match(regExp) != undefined) {
                  elmArray.push(elm);
              }
          });
          return elmArray;
      }

      // スクリーン部分除去
      function removeScreen() {
          elements = _jq(filter(_jq("div"), /screen/g)[0]).find("> > div");
          not = filter(elements, /TVContainer/);
          screen = elements.not(not);
          screen.hide();
      }

      // コメント表示
      function showComment() {
          filter(_jq("div"), /right-container/g)[0].click();
          // _jq(filter(_jq("div"), /right-comment-area/g)[0]).width("100%");
          var commentArea = _jq(filter(_jq("div"), /right-comment-area/g)[0]);
          commentArea.width("100%");
          commentArea.css("transform", "initial");
      }

      // 番組詳細表示
      function showDetail() {
          filter(_jq("div"), /view-count/g)[0].click();
          _jq(filter(_jq("div"), /right-slide--shown/g)[0]).width("100%");
      }

      // コメントの自動リロード
      function reloadComment() {
          setTimeout(function(){
              reloadComment();
              if(mode == "detail")  showDetail();
              if(mode == "comment") showComment();
              var newCmtBtn = filter(_jq("button"), /continue-btn/g);
              if(newCmtBtn.length != 0) newCmtBtn[0].click();
              commentLimit();
          }, 3000);
      }

      // commentLimit
      function commentLimit() {
          var count = 0;
          _jq.each(filter(_jq(filter(_jq("div"), /comment-list/g)[0]).find(">div"), /item/g), function(index, elm){
              if(count++ >= 150)
                  _jq(elm).hide();
          });
      }

      reloadComment();
      removeScreen();
}

見た感じ、ウインドウ表示後はコメントAPIだけのやり取りになってるようですが、もし過負荷を与えるようなら(CAさんとかAbemaさんから苦情が入ったら)削除すると思います。

使い方

動作確認程度なら、上記を開発者ツールのコンソールにコピペすると動きます。

または、以下のブックマークレットでも動きます。

javascript:(function(e){e=document.createElement('script');e.src='//dd.naba78.net/abema/commentHelper.js';document.head.appendChild(e);})();

ブックマークに上記をアドレスとして登録し、チャンネル表示後(動画再生開始後)にブックマークを開いてください。

ブックマークレットが置いてあるサーバはとても貧弱なので、なるべく各自の環境に配置してお使いください。気が向いたら性能考えて別の場所に置くかもしれません(機能しなくなったら場所が変わってるかもしれません)。

改訂履歴

2016-04-30 : 初版

2016-05-02 : コメント表示件数を150件程度に制限、リサイズした時にコメント表示が一瞬戻る点を修正

*1:個人的に別ウインドウの方が都合が良かったので。動画用に別ウインドウ立ち上げてください。

*2:表示を隠すだけなので、実態は残りますが、多少マシになると思います。

*3:証明書が引っかかるみたいなので、配置場所を変えて頂いたら動くと思います。

2016-02-14

キャリアオプションのApple Care+(分割支払い)を、アップル直販のApple Care+(一括払い)に切り替える試み、後半

01:30 | キャリアオプションのApple Care+(分割支払い)を、アップル直販のApple Care+(一括払い)に切り替える試み、後半を含むブックマーク キャリアオプションのApple Care+(分割支払い)を、アップル直販のApple Care+(一括払い)に切り替える試み、後半のブックマークコメント

遅くなりましたが、前半の続き。

結論から書くと、問題なく購入できました。

翌日の朝にはAppleの保証ステータス確認にも反映され、当日夕方に電話越しでAP+を購入したい旨伝え、後はアップルらしい対応を経て無事再購入できました。

電話に20分ほど待たされたのが印象的だったかも。(後先3回ほど電話しましたが、ほか2回は3分掛かりませんでした。)