サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
oswald.hatenablog.com
Ubuntuでタイムゾーンを設定するときは「dpkg-reconfigure tzdata」コマンドを実行して、起動したインタラクティブウィンドウで Asia -> Tokyo を選択するのが良いのですが、chefなどバックグラウンドでバッチ処理で設定するときは、インタラクティブだと困ります。 そのときは以下のようにdpkg-reconfigureに「--frontend noninteractive」オプションを付けると良いです。 $ sudo echo Asia/Tokyo > /etc/timezone $ sudo dpkg-reconfigure --frontend noninteractive tzdata
POSIXが使える環境でC言語のプログラムを書いていて、特定の関数が使用するスタックの量を調べる必要がありました。 別スレッドを生成してその特定の関数を実行させることで、スタックの使用量を調べることができます。あらかじめ別スレッドのためのスタック領域用に明示的にメモリを確保しておき、マジックナンバーで充たしておきます。そしてpthread_setstack()によって別スレッドがそのスタック領域を使用するようにして、別スレッドで関数を実行させます。実行後にスタック領域のマジックナンバーを見ることで、関数が使用したスタックの量が分かります。 ソースを読んだほうが分かりやすいかも知れません。以下では function() という関数が使用したスタックの量を標準出力しています。 // コンパイル方法:gcc -Wall -Werror -std=gnu99 -o check_used_stack
関数内でmallocするときは、割り当てたアドレスの値を返すようにしなければなりません。 僕もやってしまったことがあるのですが、よくありがちなミスとしては以下のようなものがあります。 #include #include void alloc_func (char *ptr) { ptr = malloc (512); } int main (void) { char *ptr; alloc_func (ptr); free (ptr); return 0; } これを実行するとセグメンテーション違反で異常終了します。 原因を調べるために、以下のようにptrに格納されているアドレスの値を出力する処理を加えて実行してみます。 #include #include void alloc_func (char *ptr) { printf ("before malloc : %p\n", ptr);
RedHat系のLinuxディストリビューションではRPMでパッケージ管理を行います。RPMスペックファイルで、%configをつけるとそのファイルは設定ファイルとして認識されます。%configでは、noreplaceとmissingokを指定することができます。第5章 SPECファイルの記述 - 5.3. ファイルリスト部 - vinelinux.orgを参考にしました。 noreplaceで、ファイルを置き換えさせない %configではnoreplaceを設定すると、このファイルが変更されていた場合、 アップグレード時に新しいファイルに置き換えずにもとのファイルをそのまま使われます。 %config(noreplace) missingokで、ファイルがなくても大丈夫 %configでmissingokも指定すると、存在しなくても問題ないファイルの場合に使います。これは、rpmコマ
Bamoo はブランチによる開発を協力にサポート Git の登場により、機能ブランチ(フィーチャーブランチ)や git-flow といった開発のワークフローが提唱されています。典型的なワークフローは以下のような形でしょうか。 機能ブランチを作成してそこで開発 開発が終わったら CI ツールで結合テストをして、ブランチ元へプルリクエスト (メンバーのレビューを経て)ブランチ元へマージ 開発者用サンドボックスや QA サーバーへデプロイしてエージング しかるべきタイミングで本番環境へリリース アトラシアン社が提供する CI(継続的インテグレーション)・CD(継続的デリバリー)ツールである Bamboo を使うと、開発者は上記のプロセスの中で開発作業に集中でき、それ以外の大部分を自動化することができます。UI は英語ですが、無料お試しの30日間でいろいろ試すことができると思います。私の感じた B
Ubuntuでタイムゾーンを設定する方法を検索すると、主に以下の2通りが出てきます。 「cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime」コマンドを実行して再起動 「dpkg-reconfigure tzdata」コマンドを実行して、インタラクティブウィンドウが起動するので、Asia -> Tokyoを設定する 1ではなく2の方法で設定することをオススメします。 1だと、dpkg自体がこのタイムゾーン設定を覚えないため、のちのちapt-get upgradeなどで様々なパッケージがアップグレードされたときに、タイムゾーンの設定が戻ってしまいます。2だとそのようなことは起こりません。
Facebookのシェアボタンの設置 Facebookのシェアボタンの設置自体は難しくありません。Googleで検索しても簡単に出てくるし、Facebookにも開発者向けに公式ページが用意されています。https://developers.facebook.com/docs/reference/plugins/share-links/ OGPタグによるシェアボタン押下後の表示のカスタマイズ シェアボタンを押したあとのサムネイル画像・タイトル・説明文をカスタマイズしたい場合、WEBページにmetaタグでOGPタグを設置します。以下のページの説明が分かりやすいです。http://www.site-support.jp/?p=4281 FacebookのOGPタグの扱いにおける不具合 しかし、FacebookではこのOGPタグ(特にog:image)が正しく反映されないことがあり、バグレポートが
スタンディングデスクの長所 色々なところでスタンディングデスクが紹介されているのを見て、自分もスタンディングデスクを使い始めました。実際にスタンディングデスクで仕事をするようになって1ヶ月が経ち、以下のような効果を感じています。 ・腰痛になりにくい ・肩こりになりにくい ・集中力が持続する(業務中に眠くならない) ・運動不足解消にもなる ・収納が増える(私のスタンディングデスクの場合) 私の作ったスタンディングデスク 私の作ったスタンディングデスクはこんなカンジです。なかなかの使い心地です。 作り方 以下の材料を購入し、元のデスクにキューブボックスを乗せ、その上に天板を乗せれば出来上がりです。 ・キューブボックス ・天板 実際に買ったもの キューブボックスの高さや天板のサイズは元のデスクのサイズや、使う人の身長によって変わるので、あくまで参考にしてください。デスクの高さは以下のページの中段
結論から言うと、以下のようにrun-partsコマンドを--testオプションで実行することで、cron.dailyで実行されるスクリプト名を確認することができます。同様にcron.hourly, cron.weekly, cron.monthlyも確認可能です。 run-parts --test /etc/cron.daily cronスクリプトを作成したときにいつも苦心していたのが、そのcronスクリプトがちゃんと動くかどうか確認することです。このオプションをもっと早く知っていれば。。。今まではマシンの時刻をずらしたり、わざとsyslog出力してスクリプトの実行を確認したり、色々と面倒なことをしていました。 しかもrun-partsのmanページを見ると分かるのですが、ubuntuなどDebian系のディストリビューションでは、cronスクリプトのファイル名に許されている文字列は、(^
Linuxの起動プロセスの仕組みに関する記述はよく見ることが出来ますが、シャットダウンプロセスの仕組みに関する記述はあまりないので、ここに記しておきます。 poweroffコマンドが呼ばれると、Linuのランレベルが0になります。rebootコマンドの場合はランレベルは6になります。 すると、initプロセスに制御が戻ります。initプロセスは、/etc/inittabを見ます。 /etc/inittabには次のように書かれています。 id:3:initdefault: # 起動時のランレベルは3。この場合は無視されます si::sysinit:/etc/rc.d/rc.sysinit # ランレベルに関わらず、起動時にはrc.sysinitが実行される。この場合は無視されます。 # ランレベルに応じて、「/etc/rc.d/rc *」が実行される。この場合は、0または6です。 l0:0:
シェルスクリプトでは、空白は詰められてしまいます。 ダブルクォーテーションで囲むと、空白は詰められなくなります。 [Oswald@fedora ~]$ string="a b" [Oswald@fedora ~]$ echo $string a b (←空白を詰める) [Oswald@fedora ~]$ echo "$string" a b (←空白を詰めない) 簡単なことなのに、昨日はどうやったら空白を詰めなくなるのか分からなくて、散々ネットで調べ続けました。 ちなみに何がやりたかったのかというと、/var/log/messagesの中の前日分だけを抽出したかったのです。以下のように$strをダブルクォーテーションで囲むとうまくいきます。 [Oswald@fedora ~]$ vi /usr/local/bin/get_syslog_yesterday.sh #!/
Linuxサーバーで、sambaが大量のログを出力してパーティションがフルになってしまうトラブルが発生しました。 /var/log/samba/ディレクトリのログファイルを削除しても、改善されずにパーティションはフルのまま。これは、削除したファイルのファイルディスクリプタをsambaプロセスがopenしたままだからでした。samba プロセスを再起動すれば良いのですが、sambaを利用しているクライアントのセッションが切れてしまいます。 こういうとき、ファイルを削除するのではなく、ファイルをtruncateすれば、うまくいきます。例えば以下のようにします。 # echo -n > /var/log/log.oswald logrotateでも、copytruncateを使うと、同じようにプロセスを再起動せずにログをローテートすることができます。ログファイルをコピーしてから、元のファイルを切
iPod touchは、バージョン3からオーディオブックやポッドキャストの音声データの再生速度を2倍速や1/2倍速に変更できるようになりました。バージョン2から3へのアップデートは600円なので、高くはないと思います。 ではiTunesで再生速度を設定できないのかと調べたみたら、QuickTimeで再生して、「ウィンドウ」→「A/Vコントロールを表示」から設定できるとのことです。http://www.apple.com/jp/itunes/podcasts/ iTunesから再生速度を設定できるようにしてほしいと思いつつも、QuickTime Playerで再生してみることに。しかし「A/Vコントロールを表示」がない・・・。QuickTime Playerのヘルプを見ても、何も情報がない・・・。 インターネットで調べたところ、僕の使っているsnow leopardに同梱されている「Quic
Unix系OSでは、コマンドによって登録されているパスが違います。 一般的に/bin以下にあるコマンドは、そのLinuxディストリビューションにとって基本的なコマンドを指します。また/usr以下には/usr/binと/usr/sbinの2種類があります。/usr/bin以下に実行ファイルがあるコマンドは、ユーザーコマンドと呼ばれ、一般ユーザが使うコマンドです。そして/usr/local/bin以下のコマンドは、基本的には追加で導入するコマンドを格納する場所です。 では、/usr/local/binなどにあるコマンドから内部的に呼ばれる補助コマンドはどこに置くかというと、/usr/libexecまたは/usr/local/libexecに置くのが一般的なようです。あまり知られていませんが、そのようです。僕もあるLinuxディストリビューターから最近教えてもらいました。 例えば、gccパッケー
仮想マシンを使って、GuestOS(ゲストOS)をルータとして使うことができます。複数のインタフェースを設定できる仮想マシンであれば構築できます。 ユースケースとしては、Linuxルータを作って仕組みを理解したいが、物理的なマシンや追加NICを用意するのが面倒なときに、仮想マシンを使って仮想ルータを手軽に構築することができます。 ネットワーク構成は次のようになります。 ┌───────┐ ┌──────────────┐ │ ホストOS │ <───> │ ゲストOS(仮想ルータ) │ <───> (インターネット) └───────┘ └──────────────┘ 例として、以下のような環境で構築しました。 HostOS:Mac GuestOS:Linux(fedora12) 仮想マシン:VirtualBox 手順 GuestOSでVirtualBoxの設定
まず、コマンドプロンプトで netstat -an とやって、 3389番ポートが Listen されているかどうかを確認します。ちゃんと Listen されていれば、 「tcp 0.0.0.0:3389 * Listen」 みたいに表示されます。 3389番ポートが Listen されているかどうかで、確認する場所が変わってきます。 1.Listenされている場合 まず間違いなくファイアウォールによって3389番ポートが空いていません。3389番ポートの開け方は以下の通りです。 1-1. コントロールパネルで、[Windows ファイアウォール] をダブルクリックします 1-2. [Windows ファイアウォール] ダイアログ ボックスの [例外] タブをクリックします。 1-3. [プログラムおよびサービス] ボックスの一覧の [リモートデスクトップ] チェック ボックスをオンにしま
昨日のエントリでWindowsとLinuxのデュアルブート(マルチブート)の状態になっています。/dev/sda1にWindows、/dev/sda2にLinuxがインストールされています。/dev/sdaにgrubが入っています。 この状態でLinuxを起動して、ホストOSがLinuxの状態で仮想マシンでWindowsを動かしたいなと思いました。評判の良いkvmにしたかったのですが、CPUがpentium4だからなのか、カーネルモジュールkvm-intelがインストールできませんでした。 そこでvmware-player3を使うことにしました。現在の最新の3.0.1を使いました。これもかなり動作が軽くて良かったです。 参考URL http://club.h14m.org/kenji/hiki/?%28Linux%29VMware_Player_RawDisk 「vmware raw di
次のような間違いを含んだコードがあります。 // 同じようなことがRuntime.exec(...)でも起こる ProcessBuilder pb = new ProcessBuilder(args); Process proc = pb.start(); InputStream in = proc.getInputStream(); // ・・・ここでスレッドのストリームから読んで処理をする proc.waitFor(); // ・・・最後に、finallyブロックで「InputStreamを」クローズして、プロセスを終了する(不十分) in.close(); proc.destroy(); プロセスを作成して、ストリームをキャプチャして、最後にそのストリームをクローズしています。ごく一般的な考え方によるコードだと思います。 しかし、これは間違いです。上記コードをループで繰り返すと、IO
int型の配列を使うときは以下のようにします。これは問題ないですね。 int[] array = new int[10]; // (1) しかし自分で定義したクラスのオブジェクトの配列を使う場合は、同じようにしてもうまくいきません。 class NewClass{ int a; int b; } public static void main(String[] args) { NewClass[] dim = new NewClass[3]; // (2) dim[0].a = 1; dim[0].b = 10; dim[1].a = 2; dim[1].b = 20; dim[2].a = 3; dim[2].b = 30; } (1)と同様に(2)と書いたのに、これを実行するとNull Pointer Exceptionが発生してしまいます。 調べたところ、(2)は、オブジェクトを入れ
うちの会社はグループウェアとしてサイボウズを使っています。サイボウズサーバがイントラネット上にあるため、社外からはアクセスすることができません。確かに安全ですが、社外からアクセスできないと不便なこともあります。そこで次のような方法で、サイボウズサーバに記載された自分の予定をgoogleカレンダーと同期する方法を考えました。 2段階の手順を踏んでいます。cronやbatで自動化すると良いです。 1. サイボウズサーバに記載された自分の予定をiCalendar形式のファイルで取得する 2. 取得したiCalendar形式のファイルをgoogleカレンダーと同期する 1. サイボウズサーバに記載された自分の予定をiCalendar形式のファイルで取得する Cybozu2ICalというperlスクリプトを利用しました。HTTPまたはHTTPSでサイボウズサーバから取得します。--compat-go
例えば、以下のようなネットワークを考えます。 ┌──────────┐ ┌─────────┐ ┌───────────┐ │ クライアントPC │ <───> │ プロキシサーバ │ <───> │ HTTPSサーバ │ └──────────┘ └─────────┘ └───────────┘ 192.168.1.40 192.168.1.2 https_server.jp(1.1.1.1) HTTPSサーバはインターネット上にあり、プロキシサーバとHTTPSサーバの間にはルータがあるものとします。 プロキシサーバ経由でHTTPSの通信を行う場合は、以下のようなリクエストを発行し、プロキシサーバに接続先のHTTPSサーバから公開鍵と証明書を転送するように、指示を行います。 CONNECT s
「dhclient -l lease_file」でリースファイルの出力先を指定できます。 (デフォルトは/var/lib/dhclientディレクトリにdhclient-eth0.leasesというファイル名で記録されます)←eth0のところにインタフェース名が入ります。 以前、CentOS 5.1でサーバを立てたとき、OSを起動して何もさせない状態にしていても、ディスクアクセスが発生していました。原因の一つがdhclientでした。 dhclientはDHCPクライアントプロセスです。IPアドレスがDHCPサーバからリースされると、そのリース情報をリースファイルに記録します。これはもし後にDHCPサーバからIPアドレスをもらえなかったことがあったときに、dhclientがこのリースファイルを見て前回リースされたIPアドレスで通信できないかトライするときに使います。 このリースファイルが不
cronスクリプトの中でアンパサンド(&)を使ってコマンドをバックグランド処理しようとしても、このコマンドが終了するまでcronは次の処理に移行しません。 どういうことかというと、例えば以下のスクリプトをcronに登録します。 /etc/cron.hourly/sleep15.sh(修正前) #!/bin/bash sleep 15 & これだと、cronは「sleep 15」が終了するのを待ってしまいます。 これを解決するには、このプロセスがopenしているファイルディスクリプタをcloseします。 /etc/cron.hourly/sleep15.sh(修正後) #!/bin/bash sleep 15 >/dev/null 2>&1 & なぜこのようなことをしなくてはならないかというと、cronの仕様がそうなっているからです。 crontab により実行されたコマンドから出力が行われ
LinuxのC言語では「タイムアウトを設定してsystem関数を使いたい」と思っても、これが思うように出来ません。 「プロセスをforkさせて、子プロセスでsystem関数を実行して、親プロセスがタイムアウト時に子プロセスを殺せば良い」と思うかも知れませんが、それではうまく行きません。子プロセスを殺しても、そのときsystem関数で実行中のプロセスはinitプロセスの直下に移動してプロセスの実行を続けてしまうからです。 そこで、子プロセスでsystem関数ではなくexecv族の関数を使うようにします。そうすればタイムアウト時に親プロセスが子プロセスを殺すと、execv族の関数によって実行されているシェル関数も殺されます。 これを実装する関数を作りました。使い方は簡単。 int system_with_timeout (char *command, int timeout); command
このページを最初にブックマークしてみませんか?
『ソフトウェアエンジニア現役続行』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く