PowerShellのヘルプを調べたりする

コマンドを探す。

Get-Command <文字列;ワイルドカード可能>

コマンドレットのヘルプや使用方法を調べる。

# コマンドレットのヘルプを表示
Get-Help コマンドレット名

#別の方法
コマンドレット名 -?

# コマンドレットの完全なヘルプを表示
Get-Help コマンドレット名 -Full

# コマンドレットの詳細ヘルプ(パラメータの説明含む)を表示
Get-Help コマンドレット名 -Detailed

# コマンドレットの実行例を表示
Get-Help コマンドレット名 -Examples

# コマンドレットのパラメータを表示
Get-Help コマンドレット名 -Parameter <パラメータ;ワイルドカード可能>


他に、Get-Memberでメソッドおよびプロパティが表示できる。

"HOGE" | Get-Member


   TypeName: System.String

Name             MemberType       Definition
----             ----------       ----------
Clone            Method           System.Object Clone()
CompareTo        Method           int CompareTo(System.Object value)
以下略


なおオンラインで上記のようなドキュメント一覧を探そうと思ったら、ISEのヘルプがそもそも充実してた。これでことたりそう。他には

あたりにいろいろ書いてあるかも。

PowerShellでGoogle Chromeのキャッシュの置き場を変更する


ざっとネットで調べてみたら、mklinkでリンクを作ればいいようなので試してみることにする。
直し直し下のPowerShellでできたっぽいけど、参考用に書き直したりもしているのでそのまま動かないかも。
参照される方は自身の責任において実行してください。

なお、CドライブがSSD、DドライブがHDD(SATA)、RドライブがRAMDiskです。RAMDiskは4GBで作ってるので、全データがRに行かないように、Dドライブを使う想定を残してます。

Set-PSDebug -strict
$username = $env:username

################################
#ここから変数定義
#■新しいGoogleディレクトリ置き場のパス
$new_google_user_dir = Join-Path ( Join-Path "D:\" $username ) "Google"

#■新しいChromeディレクトリ置き場のパス
$new_chrome_user_dir = Join-Path ( Join-Path "R:\Browser" $username ) "Chrome"

################################

# 通常のGoogleアプリケーションのユーザディレクトリのパス
$google_user_dir = Join-Path ( Join-Path "C:\Users" $username ) "AppData\Local\Google"
Write-Host "ユーザのGoogleディレクトリ:" $google_user_dir

# symbolic linkを張る関数を作成
function New-Symlink { cmd /c mklink /d $args }

# ユーザディレクトリ自体を移行する
if ( $new_google_user_dir -ne ""){
    #新しいGoogle Dirへの移行を実施する。
    Write-Host $new_google_user_dir "への移行を実施。"
    
    move $google_user_dir $google_user_dir".bak"
    
    md $new_google_user_dir
    robocopy /MIR $google_user_dir".bak" $new_google_user_dir
    New-Symlink $google_user_dir $new_google_user_dir
    
    $google_user_dir  = $new_google_user_dir
    
}else{
    Write-Host "Googleアプリのユーザディレクトリの変更は行わない。"
}

# Google Chromeのキャッシュディレクトリのパス
$chrome_user_dir = Join-Path $google_user_dir "Chrome\User Data\Default\Cache"

Write-Host "ユーザのGoogle Chromeキャッシュ: " $chrome_user_dir
Write-Host "移行先のキャッシュディレクトリ: " $new_chrome_user_dir

move $chrome_user_dir $chrome_user_dir".bak"
md $new_chrome_user_dir
# robocopy /MIR $goole_user_dir".bak" $new_chrome_user_dir
New-Symlink $chrome_user_dir $new_chrome_user_dir

Write-Host "だん"

PowerShellでインストール済みプログラムの一覧を表示する

仕事でWindows触る機会が増えそうなのでPowerShellを触ってみる。
インストーラ経由でインストールされたプログラムの一覧を表示するスクリプト

PS> Get-WmiObject -Class Win32_Product | Select Name,Version | Format-List


なお、ファイルにCSVで書き出す場合は次の様にすればよい。これでデスクトップ上にinstallded.csvが出来るはず(vista以降)。

PS> $userprofile = $env:userprofile
PS> Get-WmiObject -Class Win32_Product | Select Name,Version | Export-Csv $userprofile\Desktop\installed.csv -encoding Default

%USERPROFILE%\Desktop以外のフォルダをデスクトップにしている場合はデスクトップに生成されないので要注意。


参考URL

apache-solr-3.5.0をGlassfish3.0.1に組み込んでみる

Solrは検索エンジンLuceneを利用した、Java環境で動作する検索エンジンサーバです。デモを動かしてみて得た感触は以下の通り。(なお、僕は検索エンジンもSolrのこともあまり詳しくないんで表現が適切でないものが多いかもしれません、ご容赦ください。)

  • 環境を適切に設定すればわりとさくっと動かせる
  • 日本語のドキュメントが少ない(というか、全文検索エンジンの仕組み、たとえばIndexとかが体系的に難しくて、触ったことある人はいても文章を公開してないだけかも)
  • 多言語に対応してない=日本語のインデックス作るにはプラグインが必要(一般的にも、日本語の処理には形態素解析用のエンジンと辞書が必要ですね)
  • インストールしたら、付属してるサンプルデータをインデックス化してお試し可能
  • XML形式JSON形式で検索・結果応答の取得ができる(別に検索Webアプリとか立てて、JSONでリクエストを投げて応答を加工して表示する、っていうような処理になるのかしら)
  • GlassfishとかTomcatみたいなアプリケーションサーバにdeployしなくてもスタンドアロンでサービス起動できる(マイクロサーバが付属してる)
  • インデックスを作成するのに、別途クローラ(データを収集してスキームに変換してSolrに投げるやつ)が必要かもしれない、調査不足
  • JSONとかXMLでやりとりできるから、専用アプリみたいなものが作りやすい
  • 触ってみてないけど、レプリケーションとかスケールアウトとかみたいな大規模サービス向けに使うのに必要な機能ももっていそう

それで、SolrGlassfish配下のアプリケーションサーバとして動かしてみようと思います。手元のGlassfishが3.0.1なのでこれで試しますがご容赦ください。なお、この後取り組もうと思っているlucene-gosenは、トップページに"Lucene/Solr 3.5 or 4.0"に対応してる、と書かれてるので、その都合でSolrのversionは3.5.0としてます。

参考文献


手順は大きく以下の通りです。

  • solr.solr.homeおよびsolr.data.dirの作成(ファイルの展開)
  • Glassfishでのプロパティの設定
  • Glassfishへのwarのdeploy


とりあえず、/opt配下にSolrを展開します。

bounoki@phorni:~> cd /opt
bounoki@phorni:/opt> sudo curl -O http://www.meisei-u.ac.jp/mirror/apache/dist//lucene/solr/3.5.0/apache-solr-3.5.0.tgz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 75.0M  100 75.0M    0     0  2266k      0  0:00:33  0:00:33 --:--:-- 5802k
bounoki@phorni:/opt> sudo tar -xzf apache-solr-3.5.0.tgz
bounoki@phorni:/opt> cd /opt/apache-solr-3.5.0/example/solr/
bounoki@phorni:/opt/apache-solr-3.5.0/example/solr> pwd
/opt/apache-solr-3.5.0/example/solr

上記、example配下のsolrディレクトリがsolr.solr.homeになります。


次に、index等のデータ用ディレクトリを作成します。

bounoki@phorni:/opt> sudo mkdir /var/solrdata
bounoki@phorni:/opt> cd /var/solrdata
bounoki@phorni:/var/solrdata> pwd
/var/solrdata

このディレクトリがsolr.data.dirになります。
Glassfishに渡すプロパティは以下の通り。

プロパティ名
solr.solr.home /opt/apache-solr-3.5.0/example/solr
solr.data.dir /var/solrdata


そしたら、Glassfishの管理画面(http://:4848/)にログインして、以下の手順でプロパティを追加します。

  1. 『ツリー』から『Enterprise Server』を選択。
  2. 『システム設定』タブをクリック。
  3. 『追加プロパティ』の欄に先ほど整理したプロパティを設定。
  4. 右上の『保存』をクリック。
  5. プロパティを反映するため、Glassfish Instanceを再起動。コマンドでもよいし、GUIからでもよい。


次に、Glassfishのautodeploy配下にwarファイルをぶち込みます。ぶち込むdomainは各自の環境に合わせてお選びを。

bounoki@phorni:/opt> sudo cp /opt/apache-solr-3.5.0/example/webapps/solr.war \
> /srv/glassfishv3/glassfish/domains/domain1/autodeploy
bounoki@phorni:/opt> ls /srv/glassfishv3/glassfish/domains/domain1/applications/
solr/


そしたら、以下の通りsolrを指定してGlassfishにアクセスすれば"Welcome to Solr!"が表示されるはず。
http://:8080/solr/

以上、GlassfishへのSolrの組み込み手順でした。

alfrescoを使い倒そうとしてみている

alfrescoを使い倒そう(させよう)としていろいろとあがいてみている。
とりあえずオフィシャルのCommunityのwikiくらいのことができれば
それなりに取っつきやすいんじゃないか、誰しも多少は見たことのあるMediaWiki Likeだし、
などと思っていたが、実際にMediaWikiだった

騙された気分だぜ…

http://wiki.alfresco.com/wiki/Alfresco_MediaWiki_Installation_Instructions

に連携方法が書いてある。

tcpdumpの結果をterminalから取得する

ヘッダの解析をしたいとのことで、環境に手を加えずにパケットダンプを取得する方法を考えています。本職のネットワーク機器での対応(L2SWでmonitor)は設定変更とセンターへの入館を伴うので避ける。
とりあえず思いついたのがtcpdumpの結果を標準出力に出してログとして取得する方法。できればpcap形式で取得してあとからWiresharkで解析したいので、バイナリで取得したい。。。

とりあえず下記方法で可能らしい。

bounoki@phorni:~> sudo tcpdump -n tcp port 80 -s 1518 -w - | base64

こいつで、base64で結果が出力される。tcpdumpの結果がフラッシュされるタイミングに間隔があるので、取得が終わったら別コンソールからkillコマンドで頃す。

bounoki@phorni:~> sudo killall tcpdump

そしたら、

31 packets captured
31 packets received by filter
0 packets dropped by kernel

のようなゴミデータが残ってると思うのでこれらを取り除く。ログを取得する際にうまく改行されるように(改行などの制御コードも正しく出すように)してやると取り除きやすいと思います。
取り除いたら、改行コードをLFにしてテスト用Linuxサーバ等に移し、以下のコマンドでpcapにデコード。

bounoki@phorni:~> base64 -d > .pcap

あとはwindowsやれ何やれのWiresharkで通常のpcapファイルとして開く。

Python3でとあるURLに日本語パラメータでアクセスするときの文字コードについて

HTTPの主たるメソッドであるGET/POSTについて。Pythonで書いたコードからサイボウズの設定を更新したいので、POSTを対象にして実験してます。普段UTF-8しか使わない僕は想定通りShift_JISで書かれたサイボウズに泣かされるのであります。
python2系から3系になったことで、Unicodeや文字列に対する考え方が変わっていて、今までInの時とOutの時に「外に合わせれば動く」という考えだけでよかったのがうまくいかなくなった。たとえば"スパム!".encode("utf-8")がbytes型になる、とかにより。

ログインからさきのセッション管理はhttp.cookiejarを使えば簡単なのでそれはよしとして、POSTするときのクエリの文字コードがメインテーマとなります。

検索クエリをURLエンコードする際、日本語の文字列を正しくエンコードしするためにurllib.parse.quote_plus()を使う。ここではそれをprintで表示する*1

import urllib.request
import urllib.parse

opener = urllib.request.build_opener()
r = opener.open("http://search.yahoo.co.jp/search?ei=shift_jis&p=" \
    + urllib.parse.quote_plus("天使ちゃんマジ天使",encoding="sjis"))
print(r.readall().decode("utf-8"))

日本語が出てこないなら(UALエンコード不要な文字なら)、"?"と"&"でjoinするようなカッコ悪い実装をしなくても、

params = urllib.parse.urlencode({"ei" : "Shift_JIS" ,
                                 "p" : "tenshi maji"})
r = opener.open("http://search.yahoo.co.jp/search", data=params)
print(r.readall().decode("utf-8"))

ってな具合にすればいける。
POSTについてもyahooでは2010/07/29時点では試すことができて、下記の通り。

r = opener.open("http://search.yahoo.co.jp/search" ,
                data = "ei=Shift_JIS&p=" \
                + urllib.parse.quote_plus("天使ちゃんマジ天使",encoding="sjis"))
print(r.readall().decode("utf-8"))

urllib.parse.urlencode()で辞書使ってかつ日本語解釈ってできないのかしら。
動くようになったし、まぁいっか。

*1:自前環境がUTF-8だからprint()するときはUTF-8にデコードしている。