2024年7月21日日曜日

[ThinkPad] タッチパッド(trackpoint)の中央ボタンをマウスの中ボタンにアサインする方法

ThinkPadでタッチパッド(trackpoint)の中央ボタンをマウスの中ボタンにアサインする方法です。忘れそうなのでメモ。

「設定」→「マウス」を開き「ELAN TrackPoint for ThinkTrackPoint」の「TrackPoint settings」を開く。


開いた「ELAN TrackPoint for ThinkTrackPoint」の「中央ボタン」のリストボックすのデフォルトが「スクロール」になっている。これを「中ボタン」に変更すると、中ボタンクリック挙動になる。



※ 公式ページ(リンク)では、「その他のマウスオプション」で表示されるダイアログに「ThankPad」タブが表示される、とあるが、2024.07.19現在、Windows10 22H2では表示されないので注意が必要。


2023年12月5日火曜日

[ATOK] 候補ウィンドウがカーソル位置ではなく、画面中央に固定表示されるようになってしまった

 [ATOK] 候補ウィンドウがカーソル位置ではなく、画面中央に固定表示されるようになってしまった


Windows10上で、特に設定を変更したつもりはないのだが、変換候補ウィンドウ、及び、推測候補ウィンドウが画面中央に固定表示される状態になった。


JUST SYSTEMSのサポートページに以下のページがあり、ウィンドウをドラッグ&ドロップすることで位置を変更できることが分かったが、肝心の「左上のピン」が表示されておらず、カーソル位置表示に戻すことができない。

[サポートFAQ] 候補ウィンドウの表示位置を変更する


ATOKプロパティ設定の中を確認しても、表示・非表示の切り替えはあるが、表示位置の切り替えが見つからない・・・(FAQは2007年記載なので、古いバージョンの挙動っぽい)。




困っていた中、ふと候補ウィンドウ右下の画面の「候補メニュー」の存在に気がつき、表示してみると「表示位置を固定」にチェックが入っていることに気がついた。このチェックを外すことで、カーソル位置表示に無事に戻った。


ちなみに自環境のATOKのバージョンは2017です。


2023年2月8日水曜日

[windows] Windows11セットアップ・設定項目のメモ

スタートメニュー・タスクバーの設定

  • 個人用設定 > タスク バー
    • タスクバー項目
      • 検索: 「非表示」
      • タスクビュー: オフ
      • ウィジェット: オフ
    • タスクバーの動作
      • タスクバーの配置: 左揃え
      • タスクバーをすべてのディスプレイに表示する: アンチェック
        • (拡張ディスプレイ接続状態で設定)
      • タスクバーのボタンをまとめラベルを非表示にする: 常時
      • タスクバーのボタンをまとめほかのタスクバーでラベルを非表示にする:常時
      • タスクバーボタンを表示する: タスクバーに入りきらない場合
  • スタートメニューにコントロールパネルを表示する
  • スタートメニューにピン止めするアプリ:
    • (下記以外は「スタートからピン留めをはずす」)
    • Windowsシステムツール
      • コントロールパネル
    • Windowsアクセサリ
      • ペイント
    • パワーポイント
    • エクセル
    • Acrobat Reader
    • VisualStudio
    • KeyPass (exeファイルを選択して「スタートにピン留めする」を選択

  • <<以下、未了 or 正し駆動させず・・・>>
  •  タスクバーの表示位置を「下」から「右」に変更する
    •  Quick Launcherを表示する


    エクスプローラー

    • フォルダオプションを開く
    • 表示タブ
      • ナビゲーションウィンドウ
        • このPCを表示:チェック
        • 全てのフォルダーを表示:外す
          • クイックアクセスの一覧を「ナビゲーション」の中でなく、トップレイヤに表示されるようにする
        • ネットワークを表示:チェック
        • 開いているフォルダーまで展開:チェック
      • ファイルおよびフォルダー
        • タイトルバーに完全なパスを表示する :外す
          • タスクバーもすべてc:\xxxで始まり見分けがつかなくなる
        • ファイルとフォルダーの表示:「隠しファイル、隠しフォルダー、および隠しドライブを表示する」を選択
        • フォルダーとデスクトップの項目の説明をポップアップで表示する:外す
        • フォルダーのヒントにファイルサイズ情報を表示する:外す
        • フォルダーの結合の競合を非表示にする:外す 
          • (移動・コピー時のマージ前の確認ダイアログ)参考
        • ログオン時に以前のフォルダーウィンドウを表示する:チェック
        • 暗号化や圧縮されたNTFSファイルをカラーで表示する:チェック
        • 空のドライブは表示しない:チェックを外す
        • 項目間のスペースを減らす(コンパクト ビュー):チェック
        • 縮小版にファイルアイコンを利用する:チェックを外す
        • 常にアイコンを表示し、縮小版は表示しない:チェック
        • 登録されている拡張子は表示しない:チェックを外す
        • 別のプロセスでフォルダーウィンドウを開く:チェックを外す
        • 保護されたオペレーティングシステムファイルを表示しない:チェックを外す
    • コンテキストメニューをwindows10以前の仕様に戻す(「送る」とか)

    デスクトップの設定

    • デスクトップ
      • 設定→個人用設定→テーマ→デスクトップアイコンの設定
        • (以下にチェック)
        • コンピュータ
        • ゴミ箱
        • ユーザーのファイル
        • コントロールパネル
      • ゴミ箱

    ウィンドウズ設定(スタートメニュー→設定)

    • 更新とセキュリティ→Windows Update
      • 更新を完了するために再起動が必要な場合に通知を受け取る: オン
      • アクティブ時間の変更
        • アクティブ時間を調整する:「手動」
        • 8:00~2:00
      • 詳細オプション
        • Windowsの更新時に他のMicrosoft製品の更新プログラムも入手します:チェック
      • ※更新プログラムのインストールにおいて、自分で再起動の時刻を指定する(勝手に再起動されないようにする)
      • 個人用設定 
          • モードを選ぶ:「カスタム」
            • 規定のWindowsモードを選択してください:「ダーク」
            • 規定のアプリモードを選択します:「ライト」
          • 透明効果:オフ
        • ロック画面
          • ロック画面を個人用に設定
            • ロック画面にトリビアやヒントなどの情報を表示する:アンチェック
          • ロック画面の状態:「なし」
          • スクリーンセーバー設定
        • スタート
          • <<以下win10設定>>
          • スタートにタイルを縮小して表示:オン
          • スタート画面またはタスクバーのジャンプリストに最近開いた項目を表示する:オン
      •  システム
        • マルチタスク
          • スナップ(Windows10 - スナップ機能のオン/オフ
            • ウィンドウを画面の横または隅にドラッグしたときに自動的に整列する:オフ
            • ※ウィンドウが画面の端に移動されたとき自動的に整列されないようにする
          • スナップまたはAlt+Tabキーを押したときに、Microsoft Edgeタブを表示する:タブを表示しない
        • 電源
          • 電源とスリープ
            • 画面:1時間
            • スリープ:なし
        • バージョン情報
          • デバイスの仕様
            • 関連リンク→
            • システムの詳細設定(別ダイアログ)
              • 詳細設定タブ:(パフォーマンス)で以下のチェックを外す
              • ----
              • Windows内のアニメーションコントロールと要素(説明へのリンク
              • アイコンの代わりに縮小版を表示する
              • ウィンドウの下に影を表示する
                • チェック外してはだめ。ウィンドウの境目が見づらい。
              • ウィンドウを最大化や最小化するときにアニメーションで表示する
              • コンボボックスをスライドして開く
              • スクリーンフォントの縁を滑らかにする  
                • ★これはチェック外してはだめ!!!
                • フォントがガタガタになる
              • タスクバーでアニメーションを表示する
              • デスクトップのアイコン名に影をつける
              • ヒントをフェードまたはスライドで表示する
              • メニューをフェードまたはスライドして表示する
              • メニュー項目をクリック後にフェードアウトする
              • リストボックスを滑らかにスクロールする
              • 半透明の[選択]ツールを表示する
              • (※ 以下のみ、チェックを付ける)
              • マウスポインターの下に影を表示する
                • これも外さない方が良い。影があった方がマウスを発見しやすい。
      • Bluetoothとデバイス
        • モバイル デバイス
          • Windowsでモバイル デバイスを使用するための提案を表示する:オフ
        • 自動再生
        • マウス
          • マウスの追加設定(別ダイアログ)
            •  ポインターオプションタブ
              • ポインターを自動的に規定のボタンの上に移動する:チェック
              • CTRLキーを押すとボタンの位置を表示する:アンチェック 

       コントロールパネルの設定

      • コンピューターの簡単操作
      • システム
        • システムの詳細設定 

      • ハードウェアとサウンド
        • デバイスとプリンター
          • マウス
            •  ポインターオプションタブ
              • ポインターを自動的に規定のボタンの上に移動する:チェック
              • CTRLキーを押すとボタンの位置を表示する:アンチェック 
        • サウンド / システムサウンドの変更
          • サウンド設定: 「サウンドなし」
      • コントロール パネル\時計、言語、および地域
      • デバイス→入力→キーボードの詳細設定→言語バーのオプション
        • 言語
          • 詳細設定 
            • 既定の入力方式の上書き:ATOK
            • 入力言語の切り替えー言語バーのホットキーの変更
              • 「キーの詳細設定」 タブ
                • 言語バーのホットキーの変更
                  • 入力言語を切り替える:(なし)へ
              • 「言語バー」タブ
                • 言語バー:「表示しない」を選択
                • 以下は全て案チェック
                  • 言語バーがアクティブでないときは透明で表示する
                  • 言語バーアイコンをタスクバーで表示する
                  • 言語バーのテキストラベルを表示する
                • (その他対処方法?)
                  • 「タスクバーの設定→システムアイコンのオン/オフの切り替え」で「入力インジケーター」をoffにすることで、常時非表示になる
                  • https://itojisan.xyz/trouble/12211/
              • →→
              •  「設定」→「時刻と言語」→「入力」→「キーボードの詳細設定」
                • <入力方式の切り替え>
                  • 使用可能な場合にデスクトップ言語バーを使用する:  チェック
                • <規定の入力方式の上書き>
                  • ATOKを選択


      キーボードマッピング

      その他


      インストールするアプリ

      • ATOK
        • 「ATOKツール」から「プロパティ(環境設定)」を起動し、ウィンドウ右上の「プロパティ登録編集」→「ファイルを指定して登録」を選択して下記ファイルを読み込む
        • ATOKとIMEの切り替えショートカットを無効化する
          • 設定→時刻と言語→キーボードの詳細設定
            • 「入力言語のホットキー」で割り当てを無効化
        • ATOKプロパティ
          • 入力補助
            • テンキーからの入力を必ず半角にする:チェック
          • 表示
            • カーソル位置に入力モードを表示:「しない」
        • ★入力1文字目だけ勝手に確定されてしまう問題への対応
          • 以下の2箇所の設定でOneNoteの挙動は改善した
            • 設定 → [MS IME] → [全般] の予測入力をOFF
            • 「ATOKの内部状態を優先する」をOFF
          • (参考) https://www.yukkun20.com/index.php/pc/58959/
          • google spreadsheet上では問題が発生し続けている・・・
      • 秀丸
      • keyhac
      • PowerToys
        • 全般
          • 管理者モード
            • 常に管理者として実行する:オン
          • 常に手前に表示:オフ
        • オフ:
          • Advanced Pase: オフ
          • Awake:オフ
            • 電源プランでスリープしない設定にしているので、意味なし
          • Color Picker:オフ
          • トリミングとロック: オフ
          • FancyZones:オフ
          • マウスユーティリティ
            • マウスの検索:オフ
            • ※ オンにしているとCTRLキー連打で発動。画面前提がグレーアウトしマウス位置のみ円形で通常色が表示される
            • アクティブ化の方法: マウスをシェイクする
          • マウス ジャンプ: オフ
          • マウス ポインターの十字線: オフ
          • 境界線のないマウス: オフ
          • New+: オフ
          • プレビュー: オフ
          • PowerToys Run:オフ
          • スクリーンルーラー:オフ
          • Shortcut Guide: オフ
          • ワークスペース: オフ
          • ZoomIt: オフ
        • オン:
          • コマンド パレット
          • 環境変数
          • File Locksmith
          • マウスの検索
          • ホスト ファイル エディター
          • Image Resizer
          • マウス蛍光ペン
          • Power Rename
          • レジストリ プレビュー
          • Text Extractor
          • ビデオ会議のミュート
          • 以下の手順でグレーアウトされた「ビデオ会議のミュートを友好にする」をオンにできる
            • 常駐トレイからいったんPowerToysを終了
            • 管理者としてPowerToysを起動
          • カメラとマイクをミュートにする: Win+Shift+C
          • マイクをミュートにする: Win+Shift+M
      • 二刀流宛名印刷
        • 年賀状住所印刷用
      • 7-Zip
        • 設定
          • ".."を表示: チェック
      • WSL2
        • パッケージインストール(sudo apt install)
          • emacs
          • git
          • lv
          • tcsh
          • unzip
        • ログインtcshに変更する
          • chsh -s /user/bin/tcsh kurokawa
      • outlook (ファイル→オプション)
        • 予定表
          • 開始時刻: 8:00
          • 終了時刻: 19:00
          • --
          • タイムゾーン
            • 予定表に別のタイムゾーンを追加表示する
            • タイトル: PST
            • タイムゾーン: UTC-8:00 太平洋標準時
        • 詳細設定
          • outlookからハイパーリンクを開く場所: 「規定のブラウザー」に変更
          • 音を鳴らす: アンチェック
      • Office365各アプリ(outlook, PowerPoint, Excel, Word, OneNote)
        • 文書校正 / メール - 編集オプション
          • オートコレクト
            • 文の先頭文字を大文字にする:外す
            • 表のセルの先頭文字を大文字にする:外す 
          • 入力オートフォーマット
            • 左右の区別がない引用符を、区別がある引用符に変更する:外す 
            • 序数(1st, 2nd, 3rd, ...)を上付き文字に変更する :外す
            • ハイフンをダッシュに変更する:外す
            • *, _で囲んだ文字列を太字、斜体に書式設定する:外す
            • 長音とダッシュを正しく使い分ける:外す
            • ------
            • 箇条書き(行頭文字&段落番号):外す ←outlookのみ
            • ------
            • Tab/Space/BackSpaceキーでインデントとタブの設定を変更する:外す  ←outlookのみ
            • '記'などに対応する'以上'を挿入する:外す
            • 頭語に対応する結語を挿入する:外す
            • 参考)「入力オートフォーマット」は入力時の変換。「オートフォーマット」は入力後の一括変換機能。
      • PowerToys
        • PowerToys Run
          • アクティブ化のショートカット: Alt + Shift + Space (or 無効化)
            • デフォルトの Alt + Space だと、コマンドプロンプトのペースト(Alt + F  → E → P)と競合してしまう


      2021年4月18日日曜日

      [emacs][cygwin] Visual Studioのemacs / emacsclient 連携設定

      Visual Studioの外部ツール機能を利用して、Visual Studioで開いているファイルをショートカットキー一発で(orメニューから)emacs/emacsclientで開くことができる設定を紹介します。カーソル位置がemacsに引き継がれるのが地味に便利です。職場の都合などでビルド環境がVisual Studioだが、ビルド以外の作業は使い慣れたemacsを利用したい、という方にお勧めです。

      今の時代になぜWSLでなくcygwinなのか?という疑問をもたれる方がいると思いますが、このエントリはWSLがリリース前にメモを作って、ずっと公開しないまま眠っていたものです。せっかくの情報なので時代遅れを承知の上公開します。

       

      前提:

      "C:\cygwin64"以下にcygwinをインストールし、cygwin上でemacs/emacsclientを利用している、自分の環境を前提に設定を紹介します。cygwinのインストールディレクトリ、及び、NTEmacs、gnupackなど異なる環境のemacsを利用している方は適宜ディレクトリやexeのパス設定を変更して下さい。

      設定:

      メニューの「ツール」-「外部ツール」にemacs/emacsclientを登録する。
      • emacsを起動するための設定
        • Title: emacs
        • Command: C:\cygwin64\bin\run.exe
        • Arguments: /usr/bin/emacs +$(CurLine):$(CurCol) $(ItemFileName)$(ItemExt) \+$(CurLine):$(CurCol)
        • Initial directory: $(ItemDir)
      • emacsclientを起動するための設定
        • Title: emacsclient
        • Command: C:\cygwin64\bin\run.exe
        • Arguments: /usr/bin/emacsclient +$(CurLine):$(CurCol) $(ItemFileName)$(ItemExt) \+$(CurLine):$(CurCol)
        • Initial directory: $(ItemDir)

      • (2021.04.18追記)cygwinのアップデートにより(?)、Argumentのコマンドをemacsclientからemacsclient-X11に変更しない起動できない状態になった。
        • Arguments: /usr/bin/emacsclient-X11 +$(CurLine):$(CurCol) $(ItemFileName)$(ItemExt)


      余談:

      この設定はTortoiseSVNのVisualStudio連携設定ページの情報を参照したときに、emacsも同じように設定できるのでは、と思いついたものです。emacs, svnに限らずいろいろと使い道がありそうです。
      話がそれますが、Windows上の全てのキー操作をemacsのキーバインドに変更する方法を、以下のエントリで紹介しています。emacs使いの方にとっては便利な設定なのでこちらも是非参照してみてください。
    • [windows][emacs] Windows 8.1上で(特定ユーザーログイン時に)任意のアプリの操作をemacsキーバインドにする方法


    • 参考:

      2020年5月6日水曜日

      [linux] gnupgによる暗号化処理時の確認プロンプトを抑制する方法

      gnupgを用いてファイルを暗号化する際、予めインポートした公開鍵に対してtrust設定をしておかないと、指定した公開鍵毎に以下のような警告が発せられます。

      % gpg -e -r abc@test.org a.txt 
      gpg: AAAA4C0DD6F2ZZZZ: この鍵が本当に本人のものである、という兆候が、ありません
      
      sub  elg2048/AAAA4C0DD6F2ZZZZ 2020-05-06 Hiroyuki Kurokawa <abc@test.org>
        主鍵フィンガープリント: <snip>
        副鍵フィンガープリント: <snip>
      
      この鍵は、このユーザIDをなのる本人のものかどうか確信でき
      ません。今から行うことを*本当に*理解していない場合には、
      次の質問にはnoと答えてください。
      
      それでもこの鍵を使いますか? (y/N)
      
      以下のオプションを指定することで、指定した公開鍵がすべてtrust済みと見なされて処理されます。
      --trust-model always
      

      ※マニュアルには、以下のように説明されているので、利用時には注意が必要です。
      always
      Skip key validation and assume that used keys are always fully valid. You generally won’t use this unless you are using some external validation scheme. This option also suppresses the "[uncertain]" tag printed with signature checks when there is no evidence that the user ID is bound to the key. Note that this trust model still does not allow the use of expired, revoked, or disabled keys.

      (参考)

      2019年11月9日土曜日

      [mac] Mojavaクリーンインストール

      Mojavaへのアップデートを契機にmac book airを初期化して環境をクリーンセットアップしました。
      自分にとって使いやすい環境の設定手順および、インストールしたアプリ群の情報をメモがわりに残しておきます。


      システム環境設定

      • トラックパッド
        • 軌跡の速さを速くする
        • 「スクロールとズーム」内の「スクロールの方向」を「ナチュラル」にする
        • 「その他のジェスチャー」内の全てのチェックを外す
      • アクセシビリティ
        • マウスとトラックパッド
            • トラックパッドオプション
              • 「ドラッグを有効にする」にチェック
                • →ダブルタップでドラッグできるようになる
              • 「ドラッグロックなし」を選択
                • →トラックパッドから手を離すとドラッグ解除
      • キーボード
        • キーボード
          • F1, F2などのキーを標準のファンクションキーとして利用する:チェック
          • 修飾キー:ControlとOptionを入れ替える
        • ショートカット
        • 入力ソース
          • "¥"で入力する文字: バックスラッシュ
      • Dock
        • 最近使ったアプリケーションをDock に追加する:チェックを外す


      システムアプリケーション

      その他のアプリケーション

      2019年7月13日土曜日

      [mac] El Capitanへのアップグレード関連作業まとめ

      YosemiteからEl Capitan(10.11.2)へアップグレードしました。旧環境で起動できていたアプリケーションが起動できなくなったり、コマンドが見つからなくなる、といった問題が発生しましたが一通り解決できたので、その内容をまとめておきます。

      #ポストし忘れてた・・・。今更な情報ですが自分の備忘録の意味もあるので公開。

      El Capitanの新機能に伴う問題・設定の修正

      • OS X El Capitan:日本語入力のライブ変換モードをオフにする
        1. [システム環境設定] - [キーボード]を開く
        2. [入力ソース]タブを選択
        3. 「ライブ変換」のチェックを外す

      MacPortsのアップデート

      • Yosemite環境でインストールしたMacPortsはそのままでは利用できない。以下のようなエラーメッセージが表示される。
      • % port qv installed
        Error: Current platform "darwin 15" does not match expected platform "darwin 14"
        Error: If you upgraded your OS, please follow the migration instructions: https://trac.macports.org/wiki/Migration
        OS platform mismatch
            while executing
        "mportinit ui_options global_options global_variations"
        Error: /opt/local/bin/port: Failed to initialize MacPorts, OS platform mismatch
        
      • 解決手順:Migration手順に沿って、以下の手順を実行する。
        • XcodeとXcode command line toolをインストールする。以前にインストールしたことがある環境では以下のコマンドを実行して表示されるダイアログで[インストール]ボタンを押下するだけでよい。
          • % xcode-select --install
            
        • プロジェクトサイトからEl Capitan版のインストーラをダウンロードして、インストールする。
        • インストール済みのportsパッケージを再インストールする
          1. インストール済みportsリストをテキストファイルに保存する
          2. % port -qv installed > myports.txt
            
          3. (オプショナル)必要portsリストを保存する
          4. % port echo requested | cut -d ' ' -f 1 > requested.txt
            
          5. 全てのインストール済みportsパッケージをアンインストールする
          6. % sudo port -f uninstall installed
            
          7. buildディレクトリ以下をクリーンアップする
          8. % sudo rm -rf /opt/local/var/macports/build/*
            
          9. restore_ports.tclスクリプトをダウンロードして実行する
          10. % curl -O https://svn.macports.org/repository/macports/contrib/restore_ports/restore_ports.tcl
            % chmod +x restore_ports.tcl
            % sudo ./restore_ports.tcl myports.txt
            
          11. (オプショナル:2の手順を実行した場合のみ)必要portsリストをリストアする
          12. % port echo requested | cut -d ' ' -f 1 > requested.txt
            


      アプリケーション関連の問題の修正

      • wiresharkを起動しようとすると「Initialization Error / Error loading MenuBar.nib」というエラーメッセージが表示される
      • ghcコマンドが見つからなくなった
        • ターミナルでghcコマンドを実行すると、以下のようなエラーになる。
        • % ghc
          ghc: Command not found.
          
        • 原因
          • アップグレード時に/usr以下のghc関連コマンドのシンボリックリンクが削除されてしまった模様。
        • 対応

      参考:

      2018年6月6日水曜日

      [linux][cygwin] unzipコマンドで "error: invalid compressed data to inflate" というエラーメッセージがでたら?

      zipアーカイブの中に長さが0のファイルが含まれていると、unzipコマンドでは以下のようなエラーメッセージが表示されて、解凍することができません。アーカイブが壊れていなくてもエラーになります。
      % unzip hoge.zip
        error:  invalid compressed data to inflate
      
      このような場合には、-tzipオプションを指定して7zコマンドを実行することで、エラーを回避して解凍できます。パスワード保護されているzipアーカイブも問題なく解凍できました。
      % 7z x -tzip hoge.zip
      

      manページによると、以下のフォーマットがサポートされていて、デフォルトは7zとのこと。
      The program supports 7z (that implements  LZMA  compression  algorithm),  
      ZIP, CAB,  ARJ,  GZIP,  BZIP2,  TAR,  CPIO, RPM and DEB formats.
      

      xはディレクトリ階層つきで解凍することを意味しています。eを指定するとディレクトリ階層なしで解凍されます。
      % 7z --help
      
      7-Zip [64] 15.14 : Copyright (c) 1999-2015 Igor Pavlov : 2015-12-31
      p7zip Version 15.14.1 (locale=ja_JP.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i3-4130 CPU @ 3.40GHz (306C3),ASM,AES-NI)
      
      Usage: 7z  [...]  [...]
             [<@listfiles...>]
      
      
        a : Add files to archive
        b : Benchmark
        d : Delete files from archive
        e : Extract files from archive (without using directory names)
        h : Calculate hash values for files
        i : Show information about supported formats
        l : List contents of archive
        rn : Rename files in archive
        t : Test integrity of archive
        u : Update files to archive
        x : eXtract files with full paths
      
      
        -- : Stop switches parsing
        -ai[r[-|0]]{@listfile|!wildcard} : Include archives
        -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives
        -ao{a|s|t|u} : set Overwrite mode
        -an : disable archive_name field
        -bb[0-3] : set output log level
        -bd : disable progress indicator
        -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
        -bt : show execution time statistics
        -i[r[-|0]]{@listfile|!wildcard} : Include filenames
        -m{Parameters} : set compression Method
          -mmt[N] : set number of CPU threads
        -o{Directory} : set Output directory
        -p{Password} : set Password
        -r[-|0] : Recurse subdirectories
        -sa{a|e|s} : set Archive name mode
        -scc{UTF-8|WIN|DOS} : set charset for for console input/output
        -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
        -scrc[CRC32|CRC64|SHA1|SHA256|*] : set hash function for x, e, h commands
        -sdel : delete files after compression
        -seml[.] : send archive by email
        -sfx[{name}] : Create SFX archive
        -si[{name}] : read data from stdin
        -slp : set Large Pages mode
        -slt : show technical information for l (List) command
        -snh : store hard links as links
        -snl : store symbolic links as links
        -sni : store NT security information
        -sns[-] : store NTFS alternate streams
        -so : write data to stdout
        -spd : disable wildcard matching for file names
        -spe : eliminate duplication of root folder for extract command
        -spf : use fully qualified file paths
        -ssc[-] : set sensitive case mode
        -ssw : compress shared files
        -stl : set archive timestamp from the most recently modified file
        -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
        -stx{Type} : exclude archive type
        -t{Type} : Set type of archive
        -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
        -v{Size}[b|k|m|g] : Create volumes
        -w[{path}] : assign Work directory. Empty path means a temporary directory
        -x[r[-|0]]{@listfile|!wildcard} : eXclude filenames
        -y : assume Yes on all queries
      
      

      参考:

      2018年3月5日月曜日

      [haskell] http-clientライブラリを利用してHaskellでHTTPクライアント機能を実装する

      Haskellでは、http-clientライブラリを用いることで、HTTPクライアント機能を簡単に実装できます。http-client以外にも何種類かライブラリがありますが、今回はhttp-client, http-client-tlsの機能と使い方をまとめておきます。

      本エントリで紹介するhttp-client, http-client-tlsライブラリの機能:
      • 単純なHTTP GETリクエスト
        • 主要な型の説明
      • Managerのカスタマイズ 
        • https
        • proxy設定
        • タイムアウト値の設定
      • Requestのカスタマイズ
        • ベーシック認証
        • リクエストヘッダ
      • Responseの操作
        • ストリーミング受信
        • レスポンスヘッダの参照
      • エラーハンドリング


      単純なHTTP GETリクエスト

      {-# LANGUAGE OverloadedStrings #-}
      import Network.HTTP.Client
      import Network.HTTP.Types.Status (statusCode)
      
      main :: IO ()
      main = do
        manager <- newManager defaultManagerSettings
      
        request <- parseRequest "http://httpbin.org/get"
        response <- httpLbs request manager
      
        putStrLn $ "The status code was: " ++ (show $ statusCode $ responseStatus response)
        print $ responseBody response
      

      デフォルトManagerと、"http://httpbin/org/get"へのRequestを生成し、それらを引数にhttpLbsを呼び出して、サーバーからのResponseを得てその内容を表示するサンプルです。
      文字列リテラルをRequest, ByteStringに変換する目的でOverloadedStrings言語拡張を利用しています。

      主要な型の説明:

      • Manager
        • Managerはサーバーとの間に生成するコネクションの管理するもの。
        • 複数サーバーのコネクションを管理する前提で実装されており、クライアントの中では1つのインスタンスを共有することが推奨されている。 
        • Managerに対しては以下のような設定ができる。デフォルト設定を併記。
          • プロキシ設定:環境変数(http_proxy)の値を利用
          • TLS(https):サポートなし
          • 1サーバーあたりのkeep-aliveコネクション維持数: 10
          • 最大同時オープンコネクション数: 512
          • 受信タイムアウト: 30秒
      • Request
        • 特定サーバーに対して送信する1つのリクエストを表す型。
        • parseRequest関数などでHTTP METHOD, URIを指定してインスタンスを生成する。
        • Request単位の細かい設定ができる
          • ベーシック認証情報(アカウント&パスワード) 
          • プロキシ設定、プロキシ認証情報
          • クエリストリング、bodyなどの送信データ
        • HTTPメソッド(GET, POST, DELETEなど)、ヘッダ は生成したRequestインスタンスに対して、record構文で設定する
          • メソッドのデフォルトはGET
          • Content-Length, Transfer-Encoding, Accept-Encodingが自動で設定される
      • Response 
        • サーバーに送信したRequestに対応するサーバーからのレスポンスを表す型。HTTPステータスコード、レスポンスヘッダ、レスポンスボディなどを取り出すことができます。


      Managerのカスタマイズ

      defaultManagerSettingsの代わりにtlsManagerSettingsを用いてManagerを生成することでhttps通信が可能になります。 以下のサンプルではhttps対応に加えて、プロキシサーバーとして"127.0.0.1:8080"をManagerに設定しています。
      {-# LANGUAGE OverloadedStrings #-}
      import Network.HTTP.Client
      import Network.HTTP.Types.Status (statusCode)
      import Network.HTTP.Client.TLS (tlsManagerSettings) -- 新たにimport文を追加
      
      main :: IO ()
      main = do
        -- manageSetProxyでデフォルトのプロキシ設定を上書く。
        -- tlsManagerSettingsを利用するとこでhttps通信が可能になる。
        manager <- newManager $ managerSetProxy (useProxy $ Proxy "127.0.0.1" 8080) tlsManagerSettings
      
        request <- parseRequest "https://httpbin.org/get" -- https通信に変更
        response <- httpLbs request manager
      
        putStrLn $ "The status code was: " ++ (show $ statusCode $ responseStatus response)
        print $ responseBody response
      

      プロキシの設定:

      • デフォルトの挙動。環境変数(http_proxy/https_proxy) を参照する。
        • defaultProxy :: ProxyOverride
      • プロキシサーバーの設定を無視して通信する。
        • noProxy :: ProxyOverride
      • コードで明示的にプロキシサーバーを設定する。
        • useProxy :: Proxy -> ProxyOverride

      レコード構文でManagerSettings値を生成する方法:

      非公開APIを利用するため、オススメの方法ではありませんが以下のようにレコード構文を用いることで、Managerの細かい設定をカスタマイズすることができます。
      import Network.HTTP.Client.Internal
      -- tlsManagerSettingsをベースにmanagerResponseTimeoutを30→5秒に、
      -- managerConnCountを10→3に変更
      mySettings :: ManagerSettings
      mySettings = tlsManagerSettings
                   { managerResponseTimeout = responseTimeoutMicro 5000000
                   , managerConnCount = 3
                   }
      


      Requestのカスタマイズ

      以下のコードはRequestに対して、リクエストヘッダ、クエリーパラメタ、ベーシック認証情報を設定するサンプルです。Requestに対して設定できる項目の詳細は、Request type and fieldsを参照してください。
      {-# LANGUAGE OverloadedStrings #-}
      import Network.HTTP.Client
      import Network.HTTP.Types.Status (statusCode)
      
      main :: IO ()
      main = do
        manager <- newManager defaultManagerSettings
      
        initialRequest <- parseRequest "http://httpbin.org/anything"
        let request = initialRequest
                { method = "POST"   -- "GET", "PUT", "DELETE"などのメソッドを指定
                , queryString = "foo=bar&xxx=yyy" -- parseRequestのuriに記述してもよい
                , requestHeaders =  -- ヘッダはタプル(名前、値)のリストで指定
                    [ ("User-Agent", "New Agent!")
                    , ("Content-Type", "text/plain")
                    , ("Added-Header", "hoge")
                    ]
                , requestBody = "body string."
                }
        let authRequest = applyBasicAuth "user" "pass" request -- ベーシック認証情報付与
        response <- httpLbs authRequest manager
      
        putStrLn $ "The status code was: " ++ (show $ statusCode $ responseStatus response)
        print $ responseBody response
      



      Responseの操作

      httpLbs関数はRequestとManagerを引数にとり、IO (Response ByteString)を返します。Response型クラスの関数で、Responseからステータスコード、レスポンスヘッダなどの情報を取り出すことができます。ResonseのAPIリファレンスはこちら
      httpLbsは全データを受信しますが、大きなデータをレスポンスとして受信する場合はhttpLbsの代わりに、withResponseとbrReadを利用して逐次受信することが推奨されています。以下にそのサンプルを記載します。
      {-# LANGUAGE OverloadedStrings #-}
      import Network.HTTP.Client
      import Network.HTTP.Types.Status (statusCode)
      import qualified Data.ByteString as B
      
      main :: IO ()
      main = do
        manager <- newManager defaultManagerSettings
      
        request <- parseRequest "http://httpbin.org/get"
        withResponse request manager receiveResponse
      
      
      receiveResponse :: Response BodyReader -> IO ()
      receiveResponse response = do
        putStrLn $ "response version: " ++ (show $ responseVersion response)
        putStrLn $ "status code: " ++ (show $ statusCode $ responseStatus response)
        putStrLn $ "response header: " ++ (show $ responseHeaders response)
      
        -- receive body data block by block
        let loop = do
              bs <- brRead $ responseBody response
              if B.null bs
                then putStrLn "\nFinished response body"
                else do
                  print bs
                  loop
        loop
      



      エラーハンドリング

      以下は、urlのパース(parseRequest)、及び、サーバーとの通信(httpLbs)のエラーハンドリングを行うサンプルです。これらの関数はエラー時にはHttpExceptionをスローします。サンプルではtry関数を用い、Left eでスローされたHttpExceptionの情報を表示しています。
      {-# LANGUAGE OverloadedStrings #-}
      import Network.HTTP.Client
      import Network.HTTP.Types.Status (statusCode)
      import Control.Exception (try)
      import System.Environment (getArgs)
      
      
      createRequest :: [String] -> IO Request
      createRequest [] = do
        putStrLn "NOTE: no argument is given. so use not existing url."
        parseRequest "http://unknown-host:80/" -- valid but not exists
      createRequest args = do
        let url = head args
        eRequest <- try $ parseRequest url
        case eRequest of
          Left e -> do
            print (e :: HttpException)
            putStrLn $ "given url (1st argument) is invalid: " ++ url
            error "error!"
          Right request -> return $ request
      
      
      main :: IO ()
      main = do
        args <- getArgs
        manager <- newManager defaultManagerSettings
        request <- createRequest args
      
        eResponse <- try $ httpLbs request manager
        case eResponse of
          Left e -> do
            print (e :: HttpException)
            putStrLn $ "cannot reach server with given url: " ++ (head args)
          Right response -> do
            putStrLn $ "The status code was: " ++ (show $ statusCode $ responseStatus response)
            print $ responseBody response
      


      他のライブラリ:

      このエントリではhttp-clientの使い方を紹介していますが、これ以外にも以下のようなライブラリがあるようです。これらのライブラリも利用する機会があれば比較などを含めて記事にしたいと思います。

      参考:

      2018年2月25日日曜日

      [haskell] stack install cryptoniteがno such instruction: `rdrand %r8'エラーで失敗する問題の対処方法

      手許の環境(mac)で、cryptoniteライブラリのビルドがエラーになる問題が発生したが、ネットの情報を元に解決できたので、その症状と手順をblogに残しておく。


      エラーの症状:

      stack install cryptoniteで以下のようなエラーが発生。
      % stack install cryptonite
      --  While building custom Setup.hs for package cryptonite-0.24 using:
            /Users/xxx/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_2.0.1.0_ghc-8.2.2 --builddir=.stack-work/dist/x86_64-osx/Cabal-2.0.1.0 build --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
          Process exited with code: ExitFailure 1
          Logs have been written to: /Users/kurokawa/.stack/script/lts-10.4/.stack-work/logs/cryptonite-0.24.log
      
          Configuring cryptonite-0.24...
          Preprocessing library for cryptonite-0.24..
          Building library for cryptonite-0.24..
          [  1 of 120] Compiling Crypto.Cipher.DES.Primitive ( Crypto/Cipher/DES/Primitive.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/Crypto/Cipher/DES/Primitive.o )
      
      ... snip ...
      
          [120 of 120] Compiling Crypto.Tutorial  ( Crypto/Tutorial.hs, .stack-work/dist/x86_64-osx/Cabal-2.0.1.0/build/Crypto/Tutorial.o )
          
          /private/var/folders/3f/7fg601f92_33t43jhn2p0v0w0000gn/T/stack47334/cryptonite-0.24/cbits/cryptonite_rdrand.c:89:0: error:
              no such instruction: `rdrand %r8'
             |
          89 |         asm volatile ("rdrand %0; setc %1" : "=r" (*buffer), "=qm" (err));
             | ^
          
          /private/var/folders/3f/7fg601f92_33t43jhn2p0v0w0000gn/T/stack47334/cryptonite-0.24/cbits/cryptonite_rdrand.c:89:0: error:
              no such instruction: `rdrand %r8'
             |
          89 |         asm volatile ("rdrand %0; setc %1" : "=r" (*buffer), "=qm" (err));
             | ^
          
          /private/var/folders/3f/7fg601f92_33t43jhn2p0v0w0000gn/T/stack47334/cryptonite-0.24/cbits/cryptonite_rdrand.c:89:0: error:
              no such instruction: `rdrand %r8'
             |
          89 |         asm volatile ("rdrand %0; setc %1" : "=r" (*buffer), "=qm" (err));
             | ^
          `gcc' failed in phase `Assembler'. (Exit code: 1)
      
      
      

      原因:

      ビルド環境のbinutil (or gcc)でrdrandインストラクションがサポートされていないと、このエラーが発生する。


      解決方法:

      cryptoniteのデフォルトはrdrandインストラクションを利用する設定になっているため、-support_rdrandを指定してrdrand利用コードを無効化する。
      % stack install cryptonite --flag cryptonite:-support_rdrand
      cryptonite-0.24: configure
      cryptonite-0.24: build
      cryptonite-0.24: copy/register
      
      --flag cryptonite:-support_rdrandは、crptoniteパッケージのビルド処理において-support_rdrandフラグを適用することを意味する。
      cabalをを利用 している環境では、以下の指定で同様の効果が得られるはず(未確認)。
      % cabal configure --flag='-support_rdrand'
      OR
      % cabal install --constraint="cryptonite -support_rdrand"
      


      参考:

      2018年2月18日日曜日

      [windows] Windows10セットアップ・設定項目のメモ

      Windows10セットアップ時の設定項目、インストールアプリの備忘録。

      スタートメニュー・タスクバーの設定

      • タスクバーの設定 
        • 小さいタスクバーボタンを使う:オン
        • [スタート]ボタンを右クリックするかWindowsキー+Xキーを押したときに表示されるメニューで、コマンドプロンプトをWindows PowerShellに置き換える:オフ
        • タスクバーボタンを結合する
          • 「タスクバーに入りきらない場合」を選択
        • タスクバーをすべての ディスプレイに表示する:オフ
        • システムアイコンのオン/オフの切り替え
          • 入力インジケーター: オフ
      •  Quick Launcherを表示する
      • スタートメニューにコントロールパネルを表示する
      • スタートメニューにピン止めするアプリ:
        • Windowsシステムツール
          • コントロールパネル
        • Windowsアクセサリ
          • ペイント
        • パワーポイント
        • エクセル
        • Acrobat Reader
        • VisualStudio
        • Astah

      エクスプローラの設定

      • フォルダーオプション
        • 表示タブ
          • ナビゲーションウィンドウ
            • 開いているフォルダーまで展開にチェック
          • ファイルおよびフォルダー
            • タイトルバーに完全なパスを表示する :外す
              • タスクバーもすべてc:\xxxで始まり見分けがつかなくなる
            • ファイルとフォルダーの表示:「隠しファイル、隠しフォルダー、および隠しドライブを表示する」を選択
            • フォルダーとデスクトップの項目の説明をポップアップで表示する:外す
            • フォルダーのヒントにファイルサイズ情報を表示する:外す
            • フォルダーの結合の競合を非表示にする:外す 
              • (移動・コピー時のマージ前の確認ダイアログ)参考
            • ログオン時に以前のフォルダーウィンドウを表示する:チェック
            • 暗号化や圧縮されたNTFSファイルをカラーで表示する:チェック
            • 空のドライブは表示しない:チェックを外す
            • 縮小版にファイルアイコンを利用する:チェックを外す
            • 常にアイコンを表示し、縮小版は表示しない:チェック
            • 登録されている拡張子は表示しない:チェックを外す
            • 別のプロセスでフォルダーウィンドウを開く:チェックを外す
            • 保護されたオペレーティングシステムファイルを表示しない:チェックを外す

      デスクトップの設定

      • デスクトップ

      ウィンドウズ設定(スタートメニュー→設定)

      • 更新とセキュリティ→Windows Update
        • アクティブ時間の変更
          • 8:00~2:00
        • 詳細オプション
          • Windowsの更新時に他のMicrosoft製品の更新プログラムも入手します:チェック
        • ※更新プログラムのインストールにおいて、自分で再起動の時刻を指定する(勝手に再起動されないようにする)
      • 個人用設定 
          • 透明効果:オフ
        • ロック画面
          • スクリーンセーバー設定
        • スタート
          • スタートにタイルを縮小して表示:オン
          • スタート画面またはタスクバーのジャンプリストに最近開いた項目を表示する:オン
      •  システム
        • マルチタスク
          • スナップ(Windows10 - スナップ機能のオン/オフ
            • ウィンドウを画面の横または隅にドラッグしたときに自動的に整列する:オフ
            • ※ウィンドウが画面の端に移動されたとき自動的に整列されないようにする
        • 電源とスリープ
          • 画面:1時間
          • スリープ:なし
      • デバイス

       コントロールパネルの設定

      • コンピューターの簡単操作
      • システム
        • システムの詳細設定 
          • 詳細設定タブ:以下のチェックを外す
            • アイコンの代わりに縮小版を表示する
            • ウィンドウを最大化や最小化するときにアニメーションで表示する
            • コンボボックスをスライドして開く
            • タスクバーでアニメーションを表示する
            • デスクトップのアイコン名に影をつける
            • ヒントをフェードまたはスライドで表示する
            • メニューをフェードまたはスライドして表示する
            • メニュー項目をクリック後にフェードアウトする
            • リストボックスを滑らかにスクロールする
            • 半透明の[選択]ツールを表示する
      • ハードウェアとサウンド
        • デバイスとプリンター
          • マウス
            •  ポインターオプションタブ
              • ポインターを自動的に規定のボタンの上に移動する:チェック
              • CTRLキーを押すとボタンの位置を表示する:アンチェック 
      • コントロール パネル\時計、言語、および地域
      • デバイス→入力→キーボードの詳細設定→言語バーのオプション
        • 言語
          • 詳細設定 
            • 既定の入力方式の上書き:ATOK
            • 入力言語の切り替えー言語バーのホットキーの変更
              • 「キーの詳細設定」 タブ
                • 言語バーのホットキーの変更
                  • 入力言語を切り替える:(なし)へ
              • 「言語バー」タブ
                • 言語バー:タスクバーに固定する
                  • ↑に設定しても、アクティブなアプリによって表示・非表示が切り替わることがある・・・
                • (対処方法)
                  • 「タスクバーの設定→システムアイコンのオン/オフの切り替え」で「入力インジケーター」をoffにすることで、常時非表示になる
                  • https://itojisan.xyz/trouble/12211/

      その他




      アプリケーションのインストール

      • FireFox
      • KeySwap
        • 以下の3項目の設定で幸せになれる。
          • 「caps lock」→「左ctrl(1D)」
          • 「変換」→「全角/半角(29)」
          • 「全角/半角」→「Esc(01)」
          • 「変換」 →「ひらがな(70)」
            • ※firefox上でjiraのコメント入力で「変換」を押下するとフォーカスを失ってしまうのでワークアラウンド・・・。 (ATOK参照)
        • ※ユーザーごとの設定はできない模様・・・。システム共通設定になります。
      • keyhac
      • ATOK(2017)
        • 環境設定
          •  入力補助
            • テンキーからの入力を必ず半角にする:チェック
            • キー操作でのカナロックON/OFFを無効とする:チェック
            • カナ入力時に自動的にカナロックを行う:アンチェック
            • スペースで入力する空白文字:半角
              • Sheft+スペース:スペースの逆
          • 表示
            • カーソル位置に入力モードを表示:しない
          • 半角全角変換
            • 入力中の文字に対しても有効にする:アンチェック
        • キーバインドの変更
          • 「変換」「無変換」「ひらがな」をATOKの起動・終了にバインド
        • ATOKイミクルの停止
      • TortoiseSVN
        • Settings
          • General
            • Context Menu
              • Checkout
              • Commit
              • Update to revision
              • Revert
      • powerpoint2016
        • 拡張ディスプレイでスライドを表示した再に発表者ビューをオフにする
        • オプション
          • 詳細設定
            • (編集オプション)
              • 文字列の選択時に、単語単位で選択する:チェックを外す
            • (切り取り、コピー、貼り付け)
              • スペースを自動的に削除または挿入する:チェックを外す
      • outlook2016/2013
        • ファイル ー オプション
          • 基本設定
            • ユーザー名
            • 頭文字
          • メール
            • <メッセージの作成>
            • メッセージ作成形式:テキスト
            • 編集オプション
              • オートコレクト
                • 文の先頭文字を大文字にする:外す
                • 表のセルの先頭文字を大文字にする:外す 
              • 入力オートフォーマット
                • 左右の区別がない引用符を、区別がある引用符に変更する:外す 
                • 序数(1st, 2nd, 3rd, ...)を上付き文字に変更する :外す
                • ハイフンをダッシュに変更する:外す
                • *, _で囲んだ文字列を太字、斜体に書式設定する:外す
                • 長音とダッシュを正しく使い分ける:外す
                • ------
                • 箇条書き(行頭文字&段落番号):外す
                • ------
                • Tab/Space/BackSpaceキーでインデントとタブの設定を変更する:外す
                • '記'などに対応する'以上'を挿入する:外す
                • 頭語に対応する結語を挿入する:外す
                • 参考)「入力オートフォーマット」は入力時の変換。「オートフォーマット」は入力後の一括変換機能。
            • 詳細設定
              • 切り取り、コピー、貼り付け
                • 貼り付け時に自動調整する:設定
                  • 文と単語の感覚を自動的に調整する:外す
            •  署名
            • ひな形およびフォント
              • テキスト形式のメッセージの作成と読み込み:「MSゴシック」
            • <outlookウィンドウ>
            • 閲覧ウィンドウ
              • 次の時間ウィンドウで表示するとアイテムを開封済みにする:チェック
                • 0秒
              • 常にメッセージのプレビューを表示:チェック
                • (参考) https://pcclick.seesaa.net/article/467714241.html
            • <メッセージ受信>
              • マウスポインターを変更する:チェックを外す
            • <返信・転送>
              • 返信と転送を新しいウィンドウで開く:チェック
              • メッセージに返信するとき:元のメッセージの行頭にインデント記号を挿入する
            • <メッセージ送信>
              • 返信後、受信トレイの会議出席依頼と通知を自動的に削除する:外す
            • <メッセージ形式>
              • インターネットメールの受信者にリッチテキスト形式のメッセージを送信する際、以下の形式を使用する:テキスト形式に変換
              • 指定の文字数で自動的に文字列を折り返す: 132
            • <その他>
              • メッセージにアイテムを貼り付けるときに「貼り付けオプション」ボタンを表示する:外す
          • 検索 
            • 検索対象範囲
              • 「現在のフォルダー」にチェック
                • ※受信トレイのとき「現在のメールボックス」にならないようにする
        • ビューの設定
          • 「コンパクト」
            • 列の順序:「送信者」を「件名」の後ろにすると、メッセージ一覧で件名の方が大きいフォントで表示されるようになる
        • Outlook2013・2016でメール本文が表示されて見にくい場合の対処事例。Outlook2010以前のように差出人・件名の下に本文を表示させたくない。
      • DF
        • ファイル比較ソフト
      • Stirling
        • バイナリエディタ
      • 秀丸
      • Kindle for PC
        • インストール後「ネットワークに接続できません。ネットワークの設定とプロキシの構成を確認をしてください…」 というエラーが出る場合
          • 「ツール」-「オプション」-「コンテンツ」より「現在のコンテンツフォルダ」の場所を確認し、エクスプローラーからフォルダの中を空にするとよい
          •  VPN回線だとダメで、いったんVPNを切断してアプリを起動(amazonへ機器登録)すると接続でき、その後VPNにつないでもOKという情報あり。自分の環境でもドメインに接続した状態だと機器登録できなかったが、ドメインの外でインターネットにつなぐと機器登録できた。
      • Acrobat Reader
      • IObit Unlocker
      • ConEmu
        • Settings
          • Main - Task bar
            • Show overlay icon:  アンチェック
        • (iconの変更)
          • https://github.com/Maximus5/ConEmu/blob/master/PortableApps/App/AppInfo/appicon.ico
          • 上記ファイルをDLし、起動時に -icon オプションで icon ファイルを指定する
            •  "ConEmu.exe -icon appinfo.ico"


      Q&A

      • PCのシャットダウン時にすべてのアプリを終了している状態にもかかわらず「起動中のアプリケーションがあります」 という警告が出る
        • Windows8以前の環境では問題なかったが、以下のアプリ をインストールしているのが原因だった。アンインストールしたところ、正常にシャットダウンできるようになった。

      2018年1月17日水曜日

      [cygwin] cygwinセットアップ・環境構築手順メモ

      主に自分向けの防備録です。windows10上で確認。インストーラーはここからDLする。

      <<設定>>



      <<環境変数>>

      • HOME
        • ホームディレクトリを切り替えられる
      • SHELL
        • "/bin/tcsh"とすることでデフォルトのシェルが切り替わる
        • ※/etc/passwdの設定を変えても反映されないので注意
      • DISPLAY
        • ":0.0"を設定


      <<インストールするパッケージ>>

      • Admin
        • shutdown
      • Archive
        • bzip2
        • p7zip
        • unzip
        • zip
      • Database
        • libsqlite3-devel
        • libsqlite3_0
        • mysql
        • postgresql-client
        • sqlite3
        • sqliteman
      • Devel
        • autoconf
        • automake
        • bashdb
        • binutils
        • clang
        • clang-analyzer 
        • cmake
        • cppunit
        • ctags
        • dmalloc
        • doxygen
        • gcc
        • gdb
        • git
        • gitk
        • jlint
        • libiconv-devel 
        • libtool
        • make
        • mercurial
        • ocaml
        • patch
        • patchutils
        • subversion
      • Doc
        • cygwin-doc (libc関連man page)
      • Editors
        • emacs
        • emacs-anthy
        • emacs-w32
        • emacs-X11
        • vim
      • Libs
        • libcurl
        • libiconv
        • libncurses-devel
      • Net
        • curl
        • httperf
        • inetutils  (telnet)
        • iperf
        • openldap (ldapsearch)
        • openssh
        • openssl
        • ssh-pagent
      • Python
        • pylint 
        • python2-pip
        • python3-pip
      • Ruby
        • ruby
        • ruby-devel
        • ruby-sqlite3
      • Shells
        • fish
        • rxvt-unicode
        • tcsh
        • xterm
      • System
        • ping
      • Text
        • aspell
        • aspell-en
        • enscript
      • Utils
        • cloc
          • 簡易LOCカウンタ(perlスクリプト)。先頭の "perl"を削除しないとエラーになる?
        • cppcheck
        • gnupg
        • keychain
        • lv
      • Web
        • ping Systemに移動?
        • wget
        • wput
      • X11
        • xhost
        • xinit
        • xlaunch
        • xmodmap
        • xorg-server
        • xwininfo
          • font-util   X.Org font utilities and font maps
            fontconfig  Font configuration utilities
            showfont    X.Org font server font information utility
            xfd         Displays all characters in an X font
            xfontsel    X font selector
            xfs         X.Org Font Server
            xfsinfo     X.Org font server information utility
            xorg-x11-fonts-*   X11 core fonts
      • =================================
      • gitビルド用に追加
        • glib2.0-openssl
        • subversion-perl
        • gettext
        • gettext-devel
        • expat
        • expat-devel
        • zlib
        • zlib-devel


      手動インストール



      その他、はまった問題

      Q: windows10上でcygwin-xを新規インストールしたが、スタートメニューにCygwin-Xフォルダ、XWin Serverアイコンが表示されず、xwin-xdg-menuを起動できない

      A:
      なぜか、以下のフォルダのアクセス権設定がインストールした自分のアカウントからアクセスできない状態になっていた。アクセス権を変更してやると、スタートメニュー上に表示されるようになりました。
        C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Cygwin-X
      参考にしたページ:Install Cygwin On Windows 10

      Q: windows10上でcygwinを新規インストールした際、/etc/group, /etc/passwdが自動生成されなかった。どうすればよいか?

      A: mkpasswd/mkgroup -c -lで再生成する。-cオプションを指定することで、ドメインないの全情報を取得しないで、自分のアカウントの情報だけが追加される。
      参考にしたページ:巨大ドメインに参加している PC での /etc/passwd, /etc/group ファイルのつくりかた

      Q: ~/.ssh/configの設定が読まれない。

      A: パーミッションを600に設定していても、読み出してくれない現象に遭遇(-Fで明示的にファイルを指定すると読み出してくれるのだが・・・)。/etc/ssh_configにコピーすると正しくロードしてくれた。
      参考:[ssh] OpenSSHのアップデートでssh-agentがパスワードを覚えてくれなくなった問題への対処


      過去の手順

      不要:pingのエラー回避

      2018.1.17現在、最新版のcygwinでは管理者権限がない状態でもpingが正しくどうさするようになっている。

      2016年12月6日火曜日

      [haskell][yesod] TypedContentを利用してクライアントが要求するフォーマットでレスポンスを返す

      Yesod Advent Calendar 2016の6日目の記事です。

      RESTfulなAPIを提供する場合、クライアントの都合にあわせて、フォーマットを変えてレスポンスを返したいケースがあります。サーバー上で管理しているDBから、表現だけをHTML, JSON, XML, CSVなどに変更して返すイメージです。例えば、人物情報(名前、年齢、性別など)の一覧を返す際には以下のようなデータが返されることになります。
      • HTML
      • <table border>
          <tr>
            <th>name</th>    <th>sex</th>    <th>age</th>
          </tr>
          <tr>
            <td>Taro Yamada</td>    <td>Male</td>    <td>18</td>
          </tr>
          <tr>
            <td>Hanako Yamada</td>    <td>Female</td>    <td>25</td>
          </tr>
          <tr>
            <td>Ichiro Suzuki</td>    <td>Male</td>    <td>43</td>
          </tr>
        </table>
        
      • JSON
      •  [
          {"name":"Taro Yamada", "sex":"Male", "age":18},
          {"name":"Hanako Yamada", "sex":"Female", "age":25},
          {"name":"Ichiro Suzuki", "sex":"Male", "age":43}
         ]
        
      • CSV
      •  Taro Yamada,Male,18
         Hanako Yamada,Female,25
         Ichiro Suzuki,Male,43
        

      通常はフォーマット毎に別のURLを割り当てますが、Yesodでは1つのURLで複数フォーマットのレスポンスを返す実装が簡単にできます。
      このエントリでは、http://localhost:3000/に対応する一つのハンドラの中でTypedContentを利用して複数のフォーマットを扱う方法を紹介します。クライアントが送信するリクエストに記載されるAcceptヘッダによって、サーバーの挙動を変えます。


      準備:

      まず、素のYesodのscaffolding siteを起動できる環境を作ります。stackが利用できる環境を前提にしています。
      1. yesod-simpleを指定して空の"typedcontent"プロジェクトを生成
      2. % stack new typedcontent yesod-simple
        
        yesod-simpleは最も単純なyesodテンプレートでDB関連ライブラリへの依存がありません。
      3. 生成したプロジェクトディレクトリに移動し、依存ツールをビルド
      4. % cd typedcontent
        % stack build yesod-bin cabal-install
      5. 生成したtypedcontentプロジェクトをビルド
      6. % stack build
      7. develサーバーを起動
      8. % stack exec -- yesod devel
        ブラウザからhttp://localhost:3000/を開いてdevelサーバーにアクセスできることを確認してください。


      基礎1:Home.hsを修正してHTMLを返すシンプルなハンドラを作ってみる

      1. Handler/Home.hsに人物情報データ定義を追加
      2. yesod-simpleテンプレートではDBを利用しないプロジェクトが生成されます。プロジェクト内のHandlerディレクトリにHome.hsとCommon.hsが存在しているので、Home.hsをエディタで開いて、以下のコードを追加してください。
        -- サーバー上で管理するデータ定義。
        data Sex = Male | Female
            deriving (Show)
        data Person = Person
            { name :: Text
            , age  :: Int
            , sex  :: Sex
            }
            deriving (Show)
        
        -- サーバー上のサンプルデータ。3人分の情報を保持。
        samplePersonList :: [Person]
        samplePersonList = [ (Person "Taro Yamada" 18 Male)
                           , (Person "Hanako Yamada" 25 Female)
                           , (Person "Ichiro Suzuki" 41 Male) ]
        
        
      3. Handler/Home.hsのgetHomeRの定義を更新
      4. 既存のgetHomeRの実装を削除し、toTableHtmlで置き換えて下さい。
        -- HTML tableフォーマットでレスポンスを生成。
        toTableHtml :: Handler Html
        toTableHtml = withUrlRenderer [hamlet|
                     <table border>
                         <tr>                                                         
                           <th>name                                                   
                           <th>age                                                    
                           <th>sex                                                    
                       $forall person <- samplePersonList                             
                         <tr>                                                         
                           <td>#{name person}                                         
                           <td>#{age person}                                          
                           <td>#{show $ sex person}                            
                     |]
        
        getHomeR :: Handler Html
        getHomeR = toTableHtml
        
        
      5. 動作確認
      6. ブラウザでhttp://localhost:3000/にアクセスし、以下のようなテーブルが表示されていればOKです。

        curlコマンドを実行すると実際にサーバーから返されているHTMLフォーマットデータを確認することができます。
        % curl http://localhost:3000/
        


      基礎2:クライアント要求に応じてHTMLとplain textのどちらかを返す

      いよいよ、クライアントからの要求に応じて異なるフォーマットを返すよう、getHomeRを改変します。ここでは"text/html"が要求されている場合にはHTMLを、"text/plain"が要求されている場合にはshow関数の実行結果を返すようにします。
      1. getHomeRの型をHandler HtmlからHandler TypedContentに変更し、"text/html"と"text/plain"に対応する
      2. getHomeRの実装をselectRep/provideRepを用いて以下のように変更します。
        getHomeR :: Handler TypedContent
        getHomeR = selectRep $ do
            provideRep $ toTableHtml
            provideRep $ return $ repPlain $ show samplePersonList
        
        selectRepはdoブロックの中でprovidRepによって提供される複数のフォーマットから、クライアントの要求に適合するものを選択します。provideRepの引数で渡されているHtml, RepPlainはHasContentTypeのインスタンスであり、hasContentTypeが実装されています。この関数によりmime typeが比較され適切なContentが選択されます。マッチするものがない場合にはクライアントには406 Not Acceptableが返されます。
      3. 動作確認
      4. curlコマンドで-HでAcceptヘッダを指定することで、HTMLとplain textの2種類の結果が得られることが確認できます。
        % curl -H "Accept: text/plain" http://localhost:3000/
        [Person {name = "Taro Yamada", age = 18, sex = Male},Person {name = "Hanako Yamada", age = 25, sex = Female},Person {name = "Ichiro Suzuki", age = 41, sex = Male}]
        % curl -H "Accept: text/html" http://localhost:3000/
        <table border><tr><th>name</th>
        <th>age</th>
        <th>sex</th>
        ...
        
        Yesodにはquery string parameterからAcceptヘッダを自動生成する便利機能が実装されています。 この仕組みを利用することで、Acceptヘッダを入力できないブラウザ上でも(URL入力だけで)動作を確認できます。
        % curl http://localhost:3000/?_accept=text/plain
        [Person {name = "Taro Yamada", age = 18, sex = Male},Person {name = "Hanako Yamada", age = 25, sex = Female},Person {name = "Ichiro Suzuki", age = 41, sex = Male}]
        
      5. provideRepをprovideRepTypeに置き換えてみる
      6. "text/plain"をprovideRepTypeを用いて実装すると以下のようになります。
        getHomeR :: Handler TypedContent
        getHomeR = selectRep $ do
            provideRep $ toTableHtml
        --    provideRep $ return $ repPlain $ show samplePersonList
            provideRepType "text/plain" (return $ show samplePersonList)
        
        provideRepTypeを利用することで、HasContentTypeのインスタンスを持っていないフォーマットを返すことができます。


      応用:JSON, CSVフォーマットをサポートする

      ここまでの手順を応用して、CSV及びJSONフォーマットを返すようにgetHomeRを拡張します。
      1. provideRepTypeを利用してCSVフォーマットを返す実装を追加
      2. -- CSVフォーマットのレスポンスを生成する。
        class ToCSV a where
          toCsv :: a -> Text
        instance ToCSV Person where
          toCsv p = (name p) 
                   ++ ("," :: Text) 
                   ++ (pack $ show $ age p) 
                   ++ ("," :: Text) 
                   ++ (pack $ show $ sex p) 
                   ++ ("\n" :: Text)
        instance (ToCSV a) => ToCSV [a] where
          toCsv [] = ""
          toCsv (x:xs) = (toCsv x) ++ (toCsv xs)
        
        getHomeR :: Handler TypedContent
        getHomeR = selectRep $ do
            provideRep $ toTableHtml
            provideRep $ return $ repPlain $ show samplePersonList
            provideRepType "text/csv" (return $ toCsv samplePersonList) -- 追加!
        
        
      3. 動作確認
      4. % curl -H "Accept: text/csv" http://localhost:3000/ 
        Taro Yamada,18,Male
        Hanako Yamada,25,Female
        Ichiro Suzuki,41,Male
        
        
      5. ついでにJSONもサポート
      6. {-# LANGUAGE DeriveGeneric #-}
        
        ...
        -- toJSONを自動導出。DeriveGeneric言語拡張が必要。
        instance ToJSON Sex 
        instance ToJSON Person 
        
        getHomeR :: Handler TypedContent
        getHomeR = selectRep $ do
            provideRep $ toTableHtml
            provideRep $ return $ repPlain $ show samplePersonList
            provideRepType "text/csv" (return $ toCsv samplePersonList) 
            provideJson $ samplePersonList -- 追加!
        
        
      7. 動作確認
      8. % curl -H "Accept: application/json" http://localhost:3000/ 
        [{"age":18,"name":"Taro Yamada","sex":"Male"},{"age":25,"name":"Hanako Yamada","sex":"Female"},{"age":41,"name":"Ichiro Suzuki","sex":"Male"}]
        


      まとめ:

      TypedContentを利用して一つのURLからHTML, PlainText, CSV, JSONフォーマットのデータを返す方法を説明しました。ハンドラを実装する上で、selectRep/provideRep/provideRepTypeをどう使えばよいか、YesodフレームワークがContentTypeの判定にHasContentTypeを用いている、といったキモになる情報をまとめています。
      このエントリで利用したコードは以下のgithubリポジトリにコミットしてあるので、参考にしてください。
      https://github.com/kurokawh/work_haskell/tree/master/yesodweb/typedcontent


      参考:

      2016年11月30日水曜日

      [emacs] emacs上のgrep関連機能、複数ファイルの一括置換手順のまとめ

      emacs上でgrep関連の機能を利用する際のTIPSをまとめておきます(よく忘れて調べ直すので…)。

      grepコマンドのオプション

      • 指定ディレクトリ以下のファイルを再帰的に検索
        • -R DIR    シンボリックリンクを辿る
        • -r  DIR    シンボリックリンクは辿らない
      • 検索対象をファイル名でフィルタする
        • --include=GLOB    GLOBにファイル名を指定する。"*.cpp"のようにワイルドカード(*,?,[...])を指定可能
      • 検索対象から指定ファイル・ディレクトリを除外する
        • --exclude=GLOB   GLOBに除外するファイルのファイル名を指定する(ワイルドカード指定可能)。
        • --exclude-dir=DIR DIRに指定されたディレクトリをスキップ

      • 使用例:
        • docディレクトリ以下の.txtを拡張子に持つ全てのファイルを対象に"Test"という文字列を検索
        • % grep Test -R doc --include="*.txt"
        • includeディレクトリとsrcディレクトリ以下で拡張子が.hもしくは.cppのファイルを対象に"typedef"という文字列を検索(同じオプションを複数回指定することができる)
        • % grep typedef -R src -R include --include="*.h" --include="*.cpp"

      *grep*バッファのキーバインディング

      • M-n / TAB
        • (compilation-next-error)次のマッチ箇所へ移動する。
      • n
        • (next-error-no-select)次のマッチ箇所へ移動する。かつ、別バッファに該当ファイルのマッチ箇所が表示される
      • } / M-}
        • (compilation-next-file)同じファイルのマッチ箇所を飛ばして、次のファイルのマッチ箇所へ移動する。
      • M-p / S-TAB
        • (compilation-previous-error)手前のマッチ箇所へ移動する。
      • p
        • (previous-error-no-select)手前のマッチ箇所へ移動する。かつ、別バッファに該当ファイルのマッチ箇所が表示される
      • { / M-{
        • (compilation-previous-file)同じファイルのマッチ箇所を飛ばして、手前のファイルのマッチ箇所へ移動する。
      • g
        • (recompile)再検索
      • q
        • (quit-window)*grep*バッファを閉じる
      • <
        • (beginning-of-buffer)先頭へ移動
      • >
        • (end-of-buffer)末尾へ移動
      • h / ?
        • (describe-mode)ヘルプ。キーバインド一覧が表示される。

      wgrepによる一括置換の手順

      1. 置換元文字列を含むファイルをM-x grepで検索
      2. *grep*バッファでC-c C-p(wgrep-change-to-wgrep-mode)を実行
      3. *grep*バッファ内で必要な編集を加える(replace-stringを実行するなど)
      4. C-x C-s(wgrep-finish-edit)で編集を終了
        • この操作を行っても編集した内容はファイルには書き込まれていない(emacs上で開かれた各ファイルのバッファに未保存の状態で変更が反映されるだけ)。
        • ※編集をキャンセルする場合はC-c C-k (wgrep-abort-changes)
      5. M-x wgrep-save-all-buffersを実行し、更新したファイルバッファをディスク上に保存

      参考

      2016年9月24日土曜日

      [cygwin] cygwin64セットアップメモ

      自分向け備忘録。cygwin64環境をセットアップする際の手順をまとめておきます。

      設定


      環境変数

      • HOME
        • ホームディレクトリを設定
      • SHELL
        • "/bin/tcsh"とすることでデフォルトのシェルが切り替わる
          • ※/etc/passwdの編集では切り替わらないので注意

      インストールするパッケージ

      • Archive
        • bzip2
        • p7zip
        • unzip
        • zip
      • Database
        • mysql
        • postgresql-client
        • sqlite3
        • sqliteman
      • Devel
        • autoconf
        • automake
        • bashdb
        • binutils
        • ctags
        • dmalloc
        • doxygen
        • gcc
        • gdb
        • git
        • gitk
        • jlint
        • make
        • mercurial
        • ocaml
        • patch
        • patchutils
        • subversion
      • Doc
        • cygwin-doc (libc関連man page)
      • Editors
        • emacs
        • emacs-X11
        • vim
      • Libs
        • libiconv
        • libncurses-devel
      • Net
        • curl
        • inetutils  (telnet)
        • nc
        • nc6
        • openssh
        • openssl
        • openssl-devel
      • Web
        • ping
        • wget
        • wput
      • Ruby
        • ruby
        • ruby-sqlite3
      • Shells
        • fish
        • rxvt-unicode
        • tcsh
        • xterm
      • Text
        • enscript
        • jq(JSON processor)
      • Utils
      • X11
        • xhost
        • xmodmap
        • xinit
        • xorg-server

      参考

      2016年8月28日日曜日

      [haskell][yesod] YesodにおけるRESTfulなJSON API実装チュートリアル

      HaskellのwebフレームワークであるYesodにおいて、RESTful APIを実装する手順を紹介します。Haskell上のデータ構造をJSONテキストに変換する、逆に、JSONテキストをパースしてHaskell上のデータ構造を生成する、といった処理が非常に簡単に実現できます。加えて、コードを書かなくてもバックエンドのDBとのORマッピングが可能になっており、効率的に開発することができます。
      ここで紹介しているコードはgithubにコミットしています。

      準備:

      • json-sampleというプロジェクト名でYesodのscaffolding siteをセットアップする
        • 空のプロジェクト生成
          • % stack new json-sample yesod-sqlite --system-ghc
            
            "--system-ghc"は省略可能。インストール済みのghcを使うことを指示しています。
        • 依存ツールをビルド
          • % stack build yesod-bin cabal-install --no-install-ghc
            
            "--no-install-ghc"は省略可。ghcのインストールを抑制するオプションです。
        • scaffolding siteをビルド
          • % stack build
            
        • scaffolding siteの動作確認
          • % stack exec -- yesod devel
            
            ブラウザで http://localhost:3000/ にアクセスできることを確認

      このチュートリアルで作るもの:シンプルな掲示板

      • 以下のREST APIを提供するシンプルな掲示板を作ってみます。
        • POST http://localhost:3000/posts
          • 記事を1件ポストする。
        • GET http://localhost:3000/posts
          • 投稿済みの記事一覧を返す。シンプルなGET。
        • GET http://localhost:3000/posts/sender
          • "sender"によって投稿された記事一覧を検索して返す。
      • バックエンドDBにはsqliteを利用し、postされた記事は以下のスキーマで生成された"post"テーブルに格納します。
        • CREATE TABLE "post"(
            "id" INTEGER PRIMARY KEY,
            "title" VARCHAR NOT NULL,
            "content" VARCHAR NOT NULL,
            "sender" VARCHAR NOT NULL);
          

      POSTの実装:

      • DBのmodelの定義
        • mode/configファイルを開き、以下の記述を追加します。"Post"の直後に記載されている"json"がキモです。この記述によりToJson/FromJson関数が自動生成されます。
        • Post json
              title Text
              content Text
              sender Text
          
      • Handerの追加
        • 以下の通りyesod add-handlerコマンドを実行しHandlerを追加します。
        • % stack exec -- yesod add-handler
          Name of route (without trailing R): Posts
          Enter route pattern (ex: /entry/#EntryId): /posts
          Enter space-separated list of methods (ex: GET POST): GET POST
          
          後で実装するGETもあわせて追加しておきます。
      • handler/Post.hsのpostPostRを実装する
        • handler/Post.hsのpostPostR関数を以下のように修正します。関数の型がHandler HtmlからHandler ()に変更されている点に注意してください。
        • {--
          postPostsR :: Handler Html
          postPostsR = error "Not yet implemented: postPostsR"
          --}
          
          postPostsR :: Handler ()
          postPostsR = do
              post <- requireJsonBody :: Handler Post
              _    <- runDB $ insert post
              sendResponseStatus status201 ("CREATED" :: Text)
          
        • add-handlerのバグで発生するjson-sample.cabalファイルの不備を修正します。
        • library
              hs-source-dirs: ., app
              exposed-modules: Application
                               Foundation
                               Import
                               Import.NoFoundation
                               Model
                               Settings
                               Settings.StaticFiles
                               Handler.Common
                               Handler.Home
                               Handler.Comment
                               Handler.Posts
          
          上記の通り、json-sample.cabalファイルの"exposed-modules"にHandler.Postsを手動で追記します。
      • 動作確認
        • curlコマンドで記事をポストしてみましょう。
        • % curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"title" : "this is a title.", "content" : "this is a content.", "sender" : "kuro"}' --noproxy "*" http://localhost:3000/posts
          *   Trying 127.0.0.1...
          * Connected to localhost (127.0.0.1) port 3000 (#0)
          > POST /posts HTTP/1.1
          > Host: localhost:3000
          > User-Agent: curl/7.47.0
          > Accept: application/json
          > Content-type: application/json
          > Content-Length: 83
          > 
          * upload completely sent off: 83 out of 83 bytes
          < HTTP/1.1 201 Created
          < Transfer-Encoding: chunked
          < Date: Sun, 28 Aug 2016 07:28:15 GMT
          < Server: Warp/3.2.8
          < Content-Type: text/plain; charset=utf-8
          < Set-Cookie: _SESSION=O2DB2N/gbqZCdpbwyHihgoyK0Zfcj77lkv7J619gaHi8YZliO58oqpvWHIXKeGYZxZcDZpiVF1MJxWzoSaza0+pB5OrEMoG59xLuayySrnI2gUNMrGn+zRfeLkIUDEcCy7DjTNLaaYY=; Path=/; Expires=Sun, 28-Aug-2016 09:28:07 GMT; HttpOnly
          < Vary: Accept, Accept-Language
          < 
          * Connection #0 to host localhost left intact
          
          POSTに成功しHTTP/1.1 201 Createdが返されていればOKです。GETで記事を取得できるかどうかは次のフェーズで確認します。

      シンプルなGETの実装:

      • getPostR関数に実装を与える。こちらもgetPostRの型をHandler HtmlからHandler Valueに変更しています。
        • {--
          getPostsR :: Handler Html
          getPostsR = error "Not yet implemented: getPostsR"
          --}
          
          getPostsR :: Handler Value
          getPostsR = do
              posts <- runDB $ selectList [] [] :: Handler [Entity Post]
              return $ object ["posts" .= posts]
          
          
          "selectList [] []"により、persistentの機能を利用して、postテーブル内のすべての行を取得しています。
      • 動作確認
        • 以下のcurlコマンドでGETの動作を確認してみます
        • % curl -v -H "Accept: application/json" --noproxy "*" http://localhost:3000/posts
          *   Trying 127.0.0.1...
          * Connected to localhost (127.0.0.1) port 3000 (#0)
          > GET /posts HTTP/1.1
          > Host: localhost:3000
          > User-Agent: curl/7.47.0
          > Accept: application/json
          > 
          < HTTP/1.1 200 OK
          < Transfer-Encoding: chunked
          < Date: Sun, 28 Aug 2016 07:37:02 GMT
          < Server: Warp/3.2.8
          < Content-Type: application/json; charset=utf-8
          < Set-Cookie: _SESSION=8cq2RzyFQ4GmsHEgbAltpOFpOgys9zSm+xaE1LWFfv1WvgGpyKhmAkfRNRjqQf/clKN1y5BDgI36KedcIJWlIBFSz2teM8QSqMUon1BeLjzz8SOAT1Kdgi0JS5hfdlgu0TMMtHYXwIk=; Path=/; Expires=Sun, 28-Aug-2016 09:37:02 GMT; HttpOnly
          < Vary: Accept, Accept-Language
          < 
          * Connection #0 to host localhost left intact
          {"posts":[{"sender":"kuro","content":"this is a content.","id":1,"title":"this is a title."}]}
          
        • レスポンスボディのJSONテキストを整形すると、以下のようになっています。
        • % curl -H "Accept: application/json" --noproxy "*" http://localhost:3000/posts | python -mjson.tool
          {
             "posts" : [
                {
                   "sender" : "kuro",
                   "id" : 1,
                   "content" : "this is a content.",
                   "title" : "this is a title."
                }
             ]
          }
          

      フィルタ処理を伴うGET:

      • Filterハンドラを新たに追加
        • add-handlerで新たにFilter.hsを生成します。
        • % stack exec -- yesod add-handler
          Name of route (without trailing R): Filter
          Enter route pattern (ex: /entry/#EntryId): /posts/#Text
          Enter space-separated list of methods (ex: GET POST): GET
          
      • Filter.hsにgetFilterRを実装
        • getFilterRを以下のように変更します。先ほどのgetPostRとほぼ同じですが、selectListで検索条件としてsenderを指定している点だけが異なります。
        • {--
          getFilterR :: Text -> Handler Html
          getFilterR sender = error "Not yet implemented: getFilterR"
          --}
          
          getFilterR :: Text -> Handler Value
          getFilterR sender = do
              posts <- runDB $ selectList [PostSender ==. sender] [] :: Handler [Entity Post]
              return $ object ["posts" .= posts]
          
          persistentのクエリ機能の詳細については以前にまとめたブログエントリを参照を参照していただければ。
      • 動作確認
        • curlコマンドでsenderを指定して、一覧を取得してみましょう。正しく動いているようです。
        • % curl --noproxy "*" http://localhost:3000/posts/kuro
          {"posts":[{"sender":"kuro","content":"this is a content.","id":1,"title":"this is a title."},{"sender":"kuro","content":"this is a content.","id":2,"title":"this is a title."}]}
          
          % curl --noproxy "*" http://localhost:3000/posts/hoge
          {"posts":[{"sender":"hoge","content":"this is a content.","id":3,"title":"this is a title."}]}
          
          % curl --noproxy "*" http://localhost:3000/posts/xxx
          {"posts":[]}
          

      参考: