Macアプリケーションを開発していて
ファイル名およびフォルダ名に濁点/半濁点が含まれている場合、
Macの中で完結するのであれば、特になにも気にする必要はほぼなし。

ただ、サーバからデータをダウンロードして
そのダウンロードしたパス情報をログサーバにHTTPで送ろうと思ったら、
濁点系が含まれているとPerlのEncodeで引っかかってしまった。
Macのファイル名の文字コードはNFD(MAC-UTF-8)と呼ばれているらしい
LinuxやWindowsはNFS(UTF-8)らしい
#知らなかった。。。

サーバ側のプログラムを書き換ればいいのかもしれないが、
本番で長年動いていたプログラム。
なかなか更新できない。。。

なので、サーバに送信する直前にNFCに変換してあげる必要がある。
その際にしようするメソッドがこちら

  1.  
  2. NSString * sendStr = [ filePath precomposedStringWithCanonicalMapping ];
  3.  

これでサーバ側のエラーがなくなり、正しくデータを格納できた

XCodeで「一時的にデータフォーマッタが使用できません」というエラーが起きてしまい、
実行できなくなってしまっていた。

原因は、フレームワークも一緒に直していて、
フレームワークの改修をしてビルドしている途中に、
フレームワークを読み込んでいるアプリを実行しようとすると発生すると思われる。

一度、陥ったら、再起動してもうまく行かない。
とりあえず、フレームワークのリンクを削除して、
再度フレームワークを追加することで、直った。

あせっちゃいけませんってことですかね。。。

CGI.pmを使って、CGIを使っていたが、
GETとPOSTが混在した場合の処理については、
注意が必要だったので、
メモしておきます。

パラメータ
test.cgi?key1=val1とPOSTでkey2=val2が来た場合。

  1.  
  2. use CGI;
  3.  
  4. my $cgi = new CGI;
  5. my $val1;
  6. my $val2;
  7.  
  8. $val1 = $cgi->param(‘key1′);
  9. $val2 = $cgi->param(‘key2′);
  10.  
  11. #↑これだと、val2しか取れない
  12.  
  13. $val1 = $cgi->url_param(‘key1′);
  14. $val2 = $cgi->param(‘key2′);
  15.  
  16. #↑これで取得可能
  17.  
  18.  

GETとPOSTが両方とも存在する場合は、POSTが優先される。
GETの値を取りたい場合は、url_paramで取得可能。

実際、どちらで来るかわからない場合は、こんな風に書くのかなぁ
#同じキー値が届いた場合は、POSTを優先させる

  1.  
  2. use CGI;
  3.  
  4. use $cgi = new CGI;
  5.  
  6. my $val1;
  7. my $val2;
  8.  
  9. $val1 = $cgi->param(‘key1′);
  10. $val2 = $cgi->param(‘key2′);
  11.  
  12. $val1 = $cgi->url_param(‘key1′) if( ! defined($val1) );
  13. $val2 = $cgi->url_param(‘key2′) if( ! defined($val2) );
  14.  
  15.  

MySQLを使用したファイル管理等を行うものを構築していたときに、
ファイル名のみ抜き出したいケースがあった。
#ファイルの区切り文字は/とする

  1.  
  2. SELECT SUBSTIRNG_INDEX( "/AAAAA/BBBBB/CCCCC/DDDDD/EEEEE.jpg" , "/", -1 );
  3.  

これで、ファイル名のみ取得可能。
これをStoredFunctionで登録しておけば、らくちんでした。

CPANに登録されているNet::OpenSSHを使用して、
PerlのスクリプトからSSHで接続してみる。

すでに接続先サーバとキーの交換が終わっている場合

  1.  
  2. use strict;
  3. use Net::OpenSSH;
  4.  
  5. my $host = "xxx.xxx.xxx.xxx";
  6. my $ssh = Net::OpenSSH->new($host);
  7. #エラー処理
  8. die "SSH Connection faild:", $ssh->error if( $ssh->error );
  9.  
  10. my $result = $ssh->capture("コマンド");
  11.  
  12.  

これで、実行結果が$resultに入るようになる。
この場合、SSH側のコマンドでエラーが発生した場合、スクリプトはそのエラーを標準エラー出力に表示する。

次に、エラー出力も取得するやりかた

  1.  
  2. use strict;
  3. use Net::OpenSSH;
  4.  
  5. my $host = "xxx.xxx.xxx.xxx";
  6. my $ssh = Net::OpenSSH->new($host);
  7. #エラー処理
  8. die "SSH Connection faild:", $ssh->error if( $ssh->error );
  9.  
  10. my ($result, $errput) = $ssh->capture2("コマンド");
  11.  
  12.  

capture2メソッドを使用することで、エラー出力も取得でき、
スクリプト内で処理可能となる。

非常に便利なライブラリですね。

MySQLのSELECTした結果をCSVで書き出す方法はいろいろなサイトで確認できる。

  1.  
  2. SELECT * FROM data INTO OUTFILE "ファイルパス" FIELDS TERMINATED BY ‘,’;
  3.  

ファイルパスは、Windowsの場合は「c:\list.csv」など
Macの場合は「/Users/ユーザ名/list.csv」など

JOINした結果をCSVで取り出したい場合がある。
そんなときは、以下のようにすると取得できる

  1.  
  2. SELECT t1.id, t1.value1, t1.value2, t2.value1
  3. INTO OUTFILE "ファイルパス" FIELDS TERMINATED BY ","
  4. FROM table1 t1
  5. LEFT JOIN table2 t2 on
  6. t1.id=t2.id
  7. WHERE ・・・
  8.  

JOINした結果のcsv取り出しは、場所がFROM句の前になることに注意が必要ですね。
忘れてちょっとはまってしまった。。。

XCodeでSQLiteを使用する

Cocoaアプリケーションに久々に触ったので、
忘れないようにメモ。

SQLiteを使用したい場合は、既存のフレームワーク「libsqlite3.0.dylib」を使用することで、
簡単にアクセスすることができる。

書いたコードは以下

  1.  
  2. #import <sqlite3.h>
  3.  
  4. /*間省略*/
  5.  
  6. - (NSArray *)getSQLiteTable {
  7.         sqlite3* db; //DBハンドラー
  8.         sqlite3_stmt *sth; //ステートメントハンドラー
  9.         NSString * databaseFilePath = @"/Users/admin/SQLite/test.db"; //SQLiteのファイルパス
  10.         NSMutableArray * resultArray = [ NSMutableArray array ]; //結果を格納する配列
  11.         NSString * sql = [ NSString stringWithString:@"SELECT * FROM users" ]; //SQL
  12.        
  13.         //SQLファイルをオープン
  14.         //ファイルが存在しない場合は、作成してしまうので、
  15.         //エラーにしたい場合は、ファイルの有無をNSFileManager等で判断する
  16.         if( sqlite3_open([databaseFilePath UTF8String ], &db) == SQLITE_OK )
  17.         {
  18.                 //prepare
  19.                 int result = sqlite3_prepare_v2(
  20.                                                 db,
  21.                                                 [sql UTF8String ],
  22.                                                 -1,
  23.                                                 &sth,
  24.                                                 NULL );
  25.                 //SQLiteでコンパイルできたか
  26.                 if( result != SQLITE_OK){
  27.                         NSLog(@"Faild to Sqlite");
  28.                         NSLog(@"%s",sqlite3_errmsg(db) ); //エラーになった際の詳細のエラー文
  29.                         return;
  30.                 }
  31.                 int count = sqlite3_column_count(sth); //カラムの数を取得
  32.                 int i;
  33.                 NSMutableArray * keyArray = [ NSMutableArray array ]; //カラム名の配列
  34.                 for( i=0; i<count; i++){
  35.                         //カラム名を取得し、配列に格納
  36.                         [ keyArray addObject:[ NSString stringWithUTF8String:(char*)sqlite3_column_name(sth, i)] ];
  37.                 }
  38.                
  39.                 while( sqlite3_step(sth) == SQLITE_ROW ){
  40.                         NSMutableDictionary * dict = [ NSMutableDictionary dictionary ];
  41.                         //各値を取得
  42.                         for( i=0; i<count; i++){
  43.                                 NSString * value = [ NSString stringWithUTF8String:(char*)sqlite3_column_text(sth, i)];
  44.                                 [ dict setValue:value forKey:[ keyArray objectAtIndex:i ] ];
  45.                
  46.                         }
  47.                         //結果配列に格納
  48.                         [ resultArray addObject:dict ];
  49.                 }
  50.                 //ステートメントハンドラを破棄(これしないとメモリが廃棄されない)
  51.                 sqlite3_finalize(sth);
  52.         }
  53.         sqlite3_close(db); //DBを閉じる
  54.  

ポイント
・16行目 ・・・ SQLiteのファイルを開く。MySQLとかの場合はconnectと同じことかと。
         ただし、ファイルが存在しなくても作成されてしまうので、ファイルが存在しない場合にエラーにする場合は、
         NSFileManagerで存在チェックするべき。

WordPressのカテゴリをドンドン追加していくと、意外とカテゴリの数が増えてしまう。
特に、wordpressをブログではなくCMSとして使用したいと思うと、
カテゴリの数が半端ないことになってしまったりする。

既存のカテゴリ一覧を表示するメニューを使ってもいいのだが、
記事よりも長いカテゴリメニューが出来上がってしまう。
というより、大事なサイドバーなどのメニューがカテゴリのせいで見えなくなってしまったりする。

ここで、アコーディオン式のメニューが作れないかなぁと思って、
まぁ、jQueryを使えば、なんとか自分でできるかなぁと漠然に思っていたのだが、
きっとよいサンプルがあるはずと思って、検索したところ、そのまんまのプラグインが
存在していた!
#やっぱり、自分が欲しいものっていうのは、人も欲しくなるよな~

↓こちらのサイトを参考にさせていただきました。

プラグインの検索で、「jQuery Categories List Widget」検索し、そのままインストール→有効化。メニューに「jQuery ~」というメニューが追加されているので、それを貼り付けてやればあっという間にできた。

WordPressでいろいろ遊んでいるが、
カスタム投稿が可能になっており、
その投稿自体をXML-RPCでできないかいろいろ調べたところ、
下記のサイトを参考に読ませていただいた。

XMLRPCでWordPressのカスタム投稿タイプに投稿する | WEBPAPRIKA

なるほど、post_typeがpageかpostしか対応していないから、
その部分を追加してあげなきゃいけないのか!!

ただ、ソースいじるのか。。。
もう少し、気が乗ったらにしようかと思いながら、ちょっと公式の資料でも見ようかと思いたち、

XML-RPC WordPress API/Posts « WordPress Codex

を読んでみたら、
wp.newPostの部分にpost_typeの説明に登録されているタイプと書かれているから
これは行けるのではと思い、
簡単なサンプルをネットから拝借させていただき、該当部分だけ変更し、
実行したところ、ちゃんとカスタム投稿に登録されていた!!

ちなみに、Wordpress3.4から対応しているようです。

WordPressに投稿しようと思ったら、
wp.newPostでごにょごにょしたらできることが分かった。
基本スクリプトからしか呼ばないし、
汎用ツールでもないからこれでOKかと

いまさら感はすごいあるが、AppleScriptを触る必要があるので、
初めて勉強するから忘れないようにメモ

#dropletで書いています

  1.  
  2. on open dropItems
  3.   repeat with theItem in dropItems
  4.     tell application "Finder"
  5.       open theItem
  6.       – 開いたあとの処理
  7.     end tell
  8.   end repeat
  9. end open
  10.