tag:blogger.com,1999:blog-62122399547598939342024-02-08T13:09:54.015+09:00ぼちぼちがんばるUnknownnoreply@blogger.comBlogger31125tag:blogger.com,1999:blog-6212239954759893934.post-20761880549892096212020-09-18T16:51:00.005+09:002020-09-25T22:00:40.958+09:00SESで添付付きのHTMLメールを送る<b>この情報は2020年9月時点の情報です。</b><br/>
先日、お仕事でAWS SESを利用して、動画を添付したHTMLメールを送るというのをやったのですが。<br/>
結局ボツになりまして。<br/>
もったいないので、ここに概要を貼り付けておこうかと。<br/><br/>
ちゃんと動くかどうかは保証しません。なんかあっても私を責めないでください。<br/>
HTMLメールはファイルとして用意して、readTemplate()でstringとして読み込むようになっています。<br/>
動画はS3からmp4をダウンロードして、base64エンコードします。<br/><br/>
タイトルが日本語だとbase64エンコードしないとダメだったりと、いろいろ面倒な感じになっていますが。<br/>
<pre class="brush:java">
try {
// HTMLメール本文
const templateStr = await this.readTemplate()
const encodedTemplate = Buffer.from(templateStr).toString('base64')
// 動画部分
const encodedStr = <ここはS3からmp4をダウンロードし、base64エンコードする>
const fromEmail = 'noreply@hogehoge.jp'
// Subject
const subject = '動画のお届けものです'
const encodedSubject = Buffer.from(subject).toString('base64')
const boundary = `----=_Part${ Math.random().toString().substr( 2 ) }`
const rawMessage = [
`From: "${ fromEmail }" <${ fromEmail }>`,
`To: ${ address }`,
`Subject: =?utf-8?B?${ encodedSubject }?=`,
'MIME-Version: 1.0',
`Content-Type: multipart/mixed; boundary="${ boundary }"`,
'\n',
`--${ boundary }`,
'Content-Type: text/html; charset=UTF-8',
'Content-Transfer-Encoding: base64',
'\n',
encodedTemplate,
`--${ boundary }`,
'Content-Type: video/mp4; name="movie.mp4"',
'Content-Transfer-Encoding: base64',
'Content-Disposition: attachement; filename="movie.mp4"',
'\n',
encodedStr,
'\n',
`--${ boundary }--`
]
const rawParams: SendRawEmailRequest = {
Source: 'noreply@hogehoge.jp',
Destinations: [address],
RawMessage: {
Data: rawMessage.join('\n')
},
}
AWS.config.update({region: <ここはregionを指定>})
const ses = new AWS.SES()
const sendPromise = ses.sendRawEmail(rawParams).promise()
return new Promise((resolve, reject) => {
sendPromise
.then((data) => {
console.log('send success: ', data.MessageId)
resolve(true)
})
.catch((err) => {
console.log('send error: ', err)
reject(err)
})
})
} catch(error) {
console.log(`sendEmail error(to: ${address}): `, error)
throw error
}
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-36171494115625027862016-08-23T23:17:00.002+09:002016-08-23T23:17:53.176+09:00Java正規表現確認用のサイト自分向け備忘録。<br />
<br />
http://java-regex-tester.appspot.comUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-37141632201807587482016-08-23T22:29:00.000+09:002016-08-23T22:29:18.925+09:00Direct Connect金持ちにしか関係ないと思っていたダイレクトコネクトを設定する機会がやってきた。<br />
<br />
- 多分誰かが何かを依頼したのであろう、Direct ConnectのVirtual Interfacesにエントリができていた。ステータスはPending acceptance
<br />
- とりあえずVPCのマネジメントコンソールでVGWを作る。リージョンに気をつけて、適当に名前をつける<br />
- 前述のVirtual Interfacesを作成したVGWと繋げる。<br />
- チェックボックスにチェックを入れ、Accept Virtual Interfaceをクリック<br />
- VGWを選択してAcceptをクリック<br />
- なんか繋がったっぽい感じになるまで待つ<br />
- VPCを用意する。必要に応じてサブネットも作る。<br />
- VPGにVPCをアタッチする<br />
- VPGにパケットを流すサブネットのルートテーブルに、エントリを追加する<br />
<br />
最後の手順を忘れて、「あれ?繋がらん」と苦悩したのでした。<br />
<br />
接続先サーバがpingを通さなかったので、疏通確認はncで。<br />
<br />
$ nc -v -w 1 < IP address> -z <port></port><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-15492648175739582232015-04-08T12:04:00.003+09:002015-04-29T13:18:07.061+09:00rbenv-gemsetsを使う。<pre class="brush:java">$ rbenv exec gem uninstall bundler
$ rbenv exec gem list
$ rbenv versions
$ rbenv gemset create 2.2.1 basic
$ mkdir -p ~/Study/Rails1
$ cd ~/Study/Rails1
$ echo basic >.rbenv-gemsets
$ rbenv gemset active
basic
$ rbenv exec gem install bundler
$ rbenv exec gem which bundler
$ gem list
$ cd ..
$ gem list
</pre>
<br />
rbenv-gemsetsはAnsibleでインストール。<br />
Bundlerをアンインストールして、全部gemsetで管理するように切り替えた。<br />
gemsetはRubyのバージョンごとに作るので、まずrbenv versionsでバージョン確認。とりあえずbasicとしておいた。<br />
<br />
作業用ディレクトリに移動してそこで有効にするgemsetを記述した.rbenv-gemsetsファイルを作る。rbenv gemset activeで確認すると、なぜかbasic以外にもglobalと表示される。gem envを確認してもglobalというgemsetがあるかのようにGEM PATHSに表示されるけど、実際には該当ディレクトリがない。謎。<br />
深く考えずにbundlerをインストールすると、ちゃんとGEM PATHSのbasicの下にインストールされるし、他のディレクトリに移動してgem listを見るとbundlerは表示されない。<br />
<br />
あとは、gemをインストールするときにちゃんと該当ディレクトリで.rbenv-gemsetsファイルを記述するようにすればきっときれいな状態になる...はず。<br />
<br />
Bundlerもgemsetsで管理するならrbenv-default-gemsの設定は確認する必要あり。
<br />
つづけてRailsアプリを作るなら
<pre class="brush:java">
$ cd ~/Study/Rails1
$ rbenv exec gem install rails
$ rbenv exec rails new myapp
$ cd myapp
$ rails server
</pre>
みたいな感じかと。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-84488731269800564612015-04-06T12:57:00.001+09:002015-04-07T22:01:46.006+09:00TeX on Yosemiteあー、大切なTeX環境が動かないということで。TeX環境を作りましょう。<br />
<br />
1. <a href="http://tug.org/mactex/">http://tug.org/mactex/ </a>からMacTeXをダウンロード。Yosemiteだとインストールで障害が出たりするよとか書いてあって怖い。 ghostscriptになんかあるらしいけど、とりあえずインストールする。<br />
<br />
2. PATHとMANPATHは勝手に通るという噂だが通っている気がしないので.zshrcに
<br />
<pre class="brush:java">export PATH=$PATH:/usr/texbin</pre>
を追加。MANPATHはとりあえず放置。<br />
<br />
3. TeX Live Utilityを起動して更新をかける。そうするとエラーになるので、メニューから「更新があるか確認」を実行。その後もエラーメッセージが出たりするので、深く考えずにTeX Live ユーティリティを再起動してもう一度更新をかけると、そのうち文句を言わなくなる(Yosemiteの問題という噂)。多分、大丈夫だと思う。<br />
<br />
4. texmf.cnfの編集<br />
$ kpsewhich -var-value TEXMFLOCAL<br />
/usr/local/texlive/texmf-local<br />
$ sudo vi /usr/local/texlive/texmf-local/web2c/texmf.cnf<br />
<pre class="brush:java">shell_escape_commands = \
bibtex,bibtex8,bibtexu,upbibtex,biber,\
kpsewhich,\
makeindex,mendex,texindy,xindy,\
mpost,upmpost,\
repstopdf,epspdf,extractbb
</pre>
$ sudo mktexlsr<br />
<br />
5. ヒラギノフォントを使えるように設定。<a href="https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#i9febc9b">https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#i9febc9b</a>を参照。PDFへの埋め込みも可能にしておく<br />
<br />
6. sudo kanji-config-updmap-sys status で埋め込まれるフォントを確認しておく<br />
<br />
7. MacTeXで入るghostscript(9.10)だとeps fileが表示されないそうなので、新しいバージョンのものを入れる。ダウンロード先は<a href="http://pages.uoregon.edu/koch/">http://pages.uoregon.edu/koch/</a><br />
最新は9.16だった。<br />
<br />
8. TeXShopを起動して、環境設定をする。値は<a href="http://uenohara.hatenablog.jp/entry/2014/02/02/224140">http://uenohara.hatenablog.jp/entry/2014/02/02/224140</a>を参考に。<br />
<br />
[書類]<br />
<br />
<ul>
<li>[設定プロファイル]</li>
<ul>
<li>pTeX(ptex2pdf)</li>
</ul>
<li>エンコーディング</li>
<ul>
<li>Unicode(UTF-8)</li>
</ul>
</ul>
<br />
<br />
[内部設定]<br />
<br />
<ul>
<li>[pdfTeX]のTeX</li>
<ul>
<li>pdftex --file-line-error --synctex=1</li>
</ul>
<li>[pdfTex]のLaTeX</li>
<ul>
<li>pdflatex --file-line-error --synctex=1</li>
</ul>
<li>[TeX+dvipdfmx/TeX+dvips+distiller]のTeX</li>
<ul>
<li>ptex2pdf -e -ot "-synctex=1 -file-line-error"</li>
</ul>
<li>[TeX+dvipdfmx/TeX+dvips+distiller]のLaTeX</li>
<ul>
<li>ptex2pdf -l -ot "-synctex=1 -file-line-error"</li>
</ul>
<li>[BibTeXエンジン]</li>
<ul>
<li>pbibtex</li>
</ul>
</ul>
<div>
<br /></div>
このあとbrew doctorをやったら/usr/local/share/man/deのパーミッションエラーが出たのでchownした。なぜ、そこだけなんだ...<br />
<ul>
</ul>
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-38701284828065189542015-04-04T11:04:00.002+09:002015-04-07T22:02:10.356+09:00Yosemiteをクリーンインストール暇だしということで、ずっと見ぬふりをしてきたYosemiteへのアップグレードを。一度きれいにしたいということで、クリーンインストール。<br />
いろいろインストールしてディスク使用量を見ると、30G程度しか使ってない。インストール前は、残り20G切ってたのに。きっと何か忘れてるんだ...なんだろう。どきどき。<br />
<br />
で、知り合いに唆されてAnsibleでセットアップ。<br />
後で「あ、あれ忘れた」と思ってもyamlに追加して再実行すれば、実行済みのところはスキップしてくれるし。実行中にエラーが出たところも削除 or 修正して再実行すればいいし。冪等性っていうんですか?素敵ですね。<br />
<br />
1Passwordをbrew caskで入れると不幸になるという話をちょっと見かけましたが、これは問題ないように見えます。<br />
Alfredはインストールした後brew cask alfred linkを実行するようにして。後で手動でSearch Scopeの設定が必要。/opt以下なのでCmd+Shift+gでパスを入力(これを知らなくて苦悩した)。そのくらいかなと。<br />
割と途中でよく失敗するんだけど、再実行するとうまく行ったりする。一気に実行すると辛くなるのかしらん。<br />
<br />
とりあえず、Airmail, 夜フクロウ, ScanSnap関係あたりを手動で。後で追加する。<br />
<br />
sophosはやたら重くなったという噂なので、ClamXAVにセキュリティソフトは変更。設定がいまいちわからん。<br />
<br />
とりあえず、ansibleのyamlはgithubにでもあげとくか。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-61549048951453693902013-10-23T17:41:00.002+09:002015-04-07T22:02:30.518+09:00janssonのインストールjsonのパースをやりたい。自力で頑張りたくないということで、jansson。<br />
今回はjansson 2.5を使用。<br />
<br />
ダウンロードして解答して、移動したら
<br />
<pre class="brush:bash; gutter: false;"># ./configure
# make
# make test
# make install
</pre>
するだけ(インストール先によってはroot権限が必要)。<br />
<br />
今回はひたすらデフォルト設定なので
/usr/local/includeのしたにヘッダファイル、/usr/local/libのしたにライブラリができた。<br />
Arm v5でもconfigureのパラメータ設定でちゃんと使えた。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-38737011393452621282013-06-22T12:14:00.003+09:002015-04-07T22:03:58.595+09:00CからMySQLに接続する(環境設定)1. mysqlインストール状態の確認
<br />
<pre class="brush:bash; gutter: false;">$ dpkg -l | grep -i mysql
</pre>
2. mysql-serverインストール
<br />
<pre class="brush:bash; gutter: false;">$ sudo aptitude install mysql-server-5.0
</pre>
3. libmysqlclient-develインストール
<br />
<pre class="brush:bash; gutter: false; ">$ sudo aptitude install libmysqlclient-dev</pre>
<pre class="brush:bash; gutter: false; "> </pre>
クロスコンパイル環境では、ライブラリもそれ用のを入れるので<br />
1. xaptをインストールする
<br />
<pre class="brush:bash; gutter: false; ">$ sudo apt-get install dpkg-cross
$ wget http://ftp.debian.org/debian/pool/main/e/emdebian-crush/xapt_2.2.20_all.deb
$ sudo dpkg -i xapt_2.2.20_all.deb
</pre>
2.ちょっと/etc/xpat.d/debian.confを書き換える
<br />
<pre class="brush:bash; gutter: false; ">suite= squeeze
checknewer=true
</pre>
この2行以外は元のまま。<br />
3. libmysqlclient-devインストール
<br />
<pre class="brush:bash; gutter: false; ">$ sudo xapt -a armel -m libmysqlclient-dev
</pre>
CFLAGS, LDFLAGSともにクロスコンパイル環境の場合は/usr/arm-linux-gnueabiの下になるので注意する。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-18316601961196666422013-06-10T20:40:00.000+09:002015-04-07T22:04:16.630+09:00armクロスコンパイルVagrantとVirtualBoxはインストール済み。<br />
1. DebianのBoxをVagrantに追加。今回はSqueezeの32で(深い理由はない)。<br />
<pre class="brush:bash; gutter: false;">$ vagrant box add debian_squeeze_32 http://mathie-vagrant-boxes.s3.amazonaws.com/debian_squeeze_32.box
</pre>
2.Vagrantのインスタンス置き場を作成し、初期化
<br />
<pre class="brush:bash; gutter: false;">$ mkdir ~/vagrant_work/debian_squeeze_32
$ cd ~/vagrant_work/debian_squeeze_32
$ vagrant init debian_squeeze_32
</pre>
3. VirtualBoxインスタンス起動 & ログイン
<br />
<pre class="brush:bash; gutter: false;">$ vagrant up
$ vagrant ssh
</pre>
4. ここからはDegian側での作業。armクロスコンパイル環境をバリバリと構築
<br />
<pre class="brush:bash; gutter: false;">$ sudo aptitude install emdebian-crush emdebian-grip emdebian-archive-keyring
</pre>
5. apt-listにエントリを追加する
<br />
<pre class="brush:bash; gutter: false;">$ sudo vi /etc/apt/sources.list
</pre>
追加するのは以下の2行。
<br />
<pre class="brush:bash">deb http://www.emdebian.org/debian/ squeeze main
deb-src http://www.emdebian.org/debian/ squeeze main
</pre>
6. さらにインストール
<br />
<pre class="brush:bash; gutter: false;">$ sudo aptitude update
$ sudo aptitude upgrade
$ sudo aptitude install gcc-4.4-arm-linux-gnueabi
</pre>
で、
<br />
<pre class="brush:bash; gutter: false;">$ arm-linux-gnueabi-gcc test.c
</pre>
みたいな感じでコンパイルできる。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-64119356422821579622013-06-03T10:57:00.001+09:002013-06-03T13:17:17.736+09:00TeX環境作成(MacTeX2013使用)BoxenではTeXShopしか入らなかったので。手作業でごりごり。調べてみたらMacTeXは2013が出ているらしいので、うまくいかなくて良かったと安心してみることに。<br />
<br />
1. とりあえずBoxenでTeXShopは入っている。<br />
2. brewでghostscriptとimagemagickとか入れる。
<br />
<pre class="brush: bash">$ brew update
$ brew install ghostscript
$ brew install imagemagick
</pre>
<br />
3. <a href="http://ftp.math.utah.edu/pub/texlive/tlpretest/">ここ</a>からmactex-2013.pkgをダウンロード。結構でかい。<br />
<br />
MacTeXでは「カスタマイズ」にしてTeXLiveだけをインストールする(ghostscriptとかかぶるので)。<br />
あとは <a href="http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#p3c663c9">ここ</a>と<a href="http://www.blogger.com/null">ここ</a>を参考にしつつ。<br />
<br />
<ul>
<li>文献管理はPagersがあるのでインストールしない</li>
<li>Excaliburをインストール</li>
<li>LaTeXiTもインストール</li>
<li>TeXShopはすでにBoxenでインストールしていた</li>
<li> TeXworksもインストール</li>
</ul>
TeXLiveでのパッケージ更新は、インストールしたのがMacTeX2013だったせいか、更新が見つからなくてスキップした。<br />
pmetapostとuptexのインストールは実施。<br />
フォントの追加はしない。<br />
LaTeXiTの設定をして。<br />
TeXShopの設定をして。<br />
<br />
そんな感じで、インストール完了。<br />
<br />
毎回TeXは結構面倒だなぁと思うので、なんとかしたいがどうにもならん。 Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-66162679436288258872013-06-01T13:13:00.001+09:002013-06-03T13:16:25.220+09:00Macの環境をなんとかする(Boxenを使ってみる)Airがブートしなくなり、ジーニアスバーに連れて行ったらそのまま入院してしまい。<br />
帰ってきたらSSD交換で記憶を失っていたり、TimeMachinから戻そうとしたら失敗したりで、いっぺん環境を作りなおすかと作業中。<br />
また何かあった時にイチからやり直すのはちょっとキツイので、この機会に出来るだけ自動化を目論んでみる。Boxen導入。<br />
<br />
1. とりあえず、ソフトウェアアップデートをしたあとでTimeMachineにバックアップ。 <br />
2. XCodeをインストールする。コマンドラインツールも入れる。<br />
3. githubのアカウント設定をする。<a href="https://help.github.com/articles/set-up-git">ここ</a>を参考に。<br />
4. githubの秘密鍵とかあるなら、.sshの下においておく(多分必要)<br />
5. Quiitaの <a href="http://qiita.com/items/c6f20de0e4f4c352046c">ここらへん</a>を参考にする。<br />
<br />
Puppetfileは、元からあったものはそのままにして必要なものを下に追加。追加したのは<br />
<br />
<ul>
<li>chrome</li>
<li>iterm2</li>
<li>sublime_text_2</li>
<li>dropbox</li>
<li>firefox</li>
<li>github_for_mac</li>
<li>mou</li>
<li>tmux</li>
<li>virtualbox</li>
<li>skype</li>
<li>appcleaner</li>
<li>fluid</li>
<li>osx</li>
</ul>
<br />
manifests/site.appは編集して、一番新しいバージョンだけNodejsとRubyを入れるようにする(古いものはコメントアウト)。<br />
modules/people/manifests/{Githubアカウント名}.ppを編集。Puppetfileで追加したもののincludeを設定したり(osxはincludeしない)。homebrew経由およびダウンロードでインストールするものを追加したり。<br />
<br />
<ul>
<li>homebrew経由</li>
<ul>
<li>autoconf</li>
<li>automake</li>
<li>bash</li>
<li>bash-completion</li>
<li>rbenv-gemset</li>
<li>tig</li>
<li>zsh</li>
</ul>
<li>ダウンロード</li>
<ul>
<li>GoogleJapaneseInput</li>
<li>Sophos Anti Virus for Mac Home Edition</li>
<li>Mac Vim + Kaoriya</li>
<li>Vagrant</li>
<li>MacTeX</li>
<li>TexShop</li>
</ul>
</ul>
<br />
あとはzshにログインシェルを変更したりとかそんな感じで。<br />
<br />
script/boxenでインストール(ディスクの暗号化をしないオプション付きで)。<br />
<br />
失敗したこと<br />
1. modules/peopleの下に個人設定ファイルを置いてしまい、「自分で追加したものがインストールされない。な〜ぜ〜?」と苦しんだ。エラーメッセージが出ない間違いは、気付きにくい。<br />
2. sourcetreeはエラーが出てインストールできなかった。<br />
3. MacTeXはダウンロードに失敗したのか、実行中にインストールエラーが発生<br />
4. MacVim+Kaoriyaはエラーが出ないのにどこにも見当たらない...どこだ?<br />
5. 途中で何度も「/opt/boxen/homebrew/binにパスが通っていませんぜ」とワーニングが出る。homebrewが入ったところあたりでパス設定ができると幸せになれる気がする。<br />
6. よくわからんエラーが出ているところがある。どこが原因かわからないので、何もケアしていない....<br />
<br />
依存関係とかpuppet-osxとか使いこなせると色々できそうだけど、ダウンロード途中で失敗したりした場合のケアとか考えないとまずいのかなと思うところがある。MacVimとMacTeXはとりあえず手動でインストールすることに。<br />
<br />
今回のファイルはどっかにあげとくと、次回に活かせるかなということで。どっかにあげよう。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-73320181085851482082013-05-23T12:27:00.001+09:002013-05-23T13:14:38.957+09:00CでJSONをパースする自分でゴリゴリ書くと辛い。そんな訳で、<a href="https://github.com/kgabis/parson">parson</a>を試してみた。
<pre class='brush:js'>
[{"Name":"Taro", "Age":"10"},
{"Name":"Hanako", "Age":"20"}]
</pre>
みたいなJSONを解析するには
<pre class='brush:c'>
int i;
JSON_Value *root_value;
JSON_Array *persons;
JSON_Object *person;
root_value = json_parse_file("ファイル名");
persons = json_value_get_array(root_value);
for ( i = 0; i < json_array_get_count(persons); i++ )
{
person = json_array_get_object(persons, i);
printf("%s, %s\n",
json_object_get_string(person, "Name"),
json_object_get_string(person, "Age"));
}
json_value_free(root_value);
</pre>
みたいな感じでやればパース出来る。
日本語とか大丈夫なのかはまだ未確認だけど、便利そう。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-18591726200207944402012-10-19T17:47:00.000+09:002012-10-19T17:47:05.546+09:00AWSトレーニング仕事の関係でAWSのトレーニングを受講。<br />
2日でEC2, AMI, RDS, S3, IAM, ELB, AutoScaling, CloudFormationあたりをぐぉーっとやるので、ハンズオンは結構大変なものもあった(Linuxは良いんだけど、Windowsを使うと....慣れてないので)。<br />
<br />
本を読んだり自分で触っているだけだと今ひとつ漠然としていたサービスの全体が少しクリアになった感じ。あと、すごい課金がくるんじゃないかとビクビクしてたけどこれからはあんまり怯えないで使えそう ^^;; 仕事で使う予定はないけど、テスト用サーバとか作ったりして遊びたい。<br />
<br />
Webベースで操作をするとちょっといらっとするので、APIの勉強もしようかな。 Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-19896739866701996982012-04-03T20:37:00.003+09:002012-04-04T14:27:08.409+09:00iPhoneでYouTube(その2)<a href="http://myahal.blogspot.jp/2012/02/youtube-api-for-objective-ciphone.html">先日の投稿</a>で書いた通りにやると、うまくいかなくなってしまった。gdata-objectivec-clientにSBJSonが入らない状態でダウンロードされるためと思われる。
で。こんな感じで回避。<br />
<br />
1. svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/ gdata-objectivec-client-read-only<br />
<br />
これでSBJSonの入っていないgdata-objectivec-clientが取得できる。<br />
<br />
2.<a href="https://github.com/earcar/gdata-objectivec-client">ここ</a><a href="http://www.blogger.com/blogger.g?blogID=6212239954759893934">からさらにダウンロード。 </a><br />
<br />
2に入っているJSONフォルダを1のSourceにコピー。<br />
<br />
そのあとは<a href="http://hoishing.wordpress.com/2011/08/23/gdata-objective-c-client-setup-in-xcode-4/">ここ</a>で紹介されている手順で作業。<br />
<br />
もしかしたら2つめにダウンロードしたやつだけでうまくいくのかもしれない....と後で思った。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-15719871728709754142012-02-10T15:37:00.000+09:002012-02-10T15:37:01.491+09:00iPhoneのPushとりあえず、SandBox使用の場合<br />
<br />
1) App IDではちゃんと開発用のPushの設定をしておく<br />
2) Pushが使えるProvisioningで署名をする<br />
3) 1. で取得した証明書とか秘密鍵でp12ファイルを作って、サーバーにおいておく<br />
<br />3を忘れてひどい目にあったので、めもめも。<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-27160417460819747312012-02-08T13:19:00.001+09:002012-02-08T13:19:22.831+09:00YouTube API for Objective-C(iPhone)設定は<a href="http://hoishing.wordpress.com/2011/08/23/gdata-objective-c-client-setup-in-xcode-4/">ここ</a>を見れば、大体問題なし(YouTube APIになっていないところは、適宜直す)。<br />
<br />
xxx.hでは<br />
#import "Headers/GDataYouTube.h"<br />#import "Headers/GDataServiceGoogleYouTube.h"<br />
<br />
を記述した上で、プロパティにGDatFeedYouTubeVideo*を設定しておく。<br />
<br />
特定ユーザのフィードを検索するにはviewDidLoadあたりで<br />
<br />
GDataServiceGoogleYouTube *service = [self youTubeService];<br />
NSURL *feedURL = [GDataServiceGoogleYouTube youTubeURLForFeedID:nil];<br /> GDataQueryYouTube* query = [GDataQueryYouTube <br />
youTubeQueryWithFeedURL:feedURL];<br /> [query setStartIndex:1];<br /> [query setMaxResults:5];<br /> [query setAuthor:@"ユーザ名"];<br /> [query setOrderBy:@"published"];<br /> <br /> [service fetchFeedWithQuery:query delegate:self<br />
didFinishSelector:@selector(request:finishedWithFeed:error:)];<br /> <br /> [super viewDidLoad]; <br />
<br />
<br />
とやっておく。<br />
<br />
youTubeServiceは<br />
- (GDataServiceGoogleYouTube *)youTubeService {<br /> static GDataServiceGoogleYouTube* _service = nil;<br /> if (!_service) {<br /> _service = [[GDataServiceGoogleYouTube alloc] init];<br /> [_service setUserAgent:@"てきとうに"];<br /> }<br /> <br /> // fetch unauthenticated<br /> [_service setUserCredentialsWithUsername:nil password:nil];<br /> return _service;<br />}<br />
<br />
検索が終わったら<br />
- (void)request:(GDataServiceTicket *)ticket<br />finishedWithFeed:(GDataFeedBase *)aFeed<br /> error:(NSError *)error {<br /> if (!error) {<br /> [self setFeed:(GDataFeedYouTubeVideo *)aFeed]; <br />
[self.listView reloadData];<br /> }<br />
}<br />
<br />
みたいにして、検索結果をプロパティに設定して、UITableViewを更新する。<br />
タイトル文字列なんかは<br />
GDataEntryBase *entry = [[feed entries] objectAtIndex:indexPath.row];<br /> NSString *title = [[entry title] stringValue];<br />
NSString *descriotion =<br />
[[[(GDataEntryYouTubeVideo *)entry mediaGroup]<br />
mediaDescription] contentStringValue];<br /> NSArray *thumbnails =<br />
[[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails];<br />
<br />
<br />
こんな感じでとれる。<br /><br /><a href="http://pastebin.com/vmV2c0HT">ここ</a>から基本的なコードは取得できる。<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-80109063469083738842011-10-28T22:22:00.000+09:002011-10-28T22:23:07.860+09:00階乗のプログラムLipsで書くと、こんな感じ。
<br />
<fieldset>
<pre>(defun fact (n)
(if (zerop n)
1
(* n (fact (- n 1)))))</pre>
</fieldset>
カッコの数があっているのか心配になる。<br />
<br />
Prologで書くとこんな感じ。
<br />
<fieldset>
<pre>fact(0, 1).
fact(N, X) :- N1 is N - 1, fact(N1, X1), X is X1 * N.</pre>
</fieldset>
分かりやすい。ステキ☆<br />
<br />
Haskellで書いてみる。
<br />
<fieldset>
<pre>fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact(n - 1)</pre>
</fieldset>
やっぱりこのあたりはHaskellが一番きれいかも。分かりやすいし。<br />
<br />
Javaで書いてみる。
<br />
<fieldset>
<pre>class Fuctorial {
static int fact(int x) {
if ( x == 0 )
return 1;
return x * fact(x-1);
}
}</pre>
</fieldset>
この程度のことでも色々書かなくちゃ行けない辺りが面倒。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-22932218559172538732011-10-27T12:25:00.000+09:002011-10-27T12:32:14.106+09:00Objective-C... メモリ管理<table>
<tbody>
<tr><th>処理</th><th>iOSのフレームワーク</th><th>Mac OS Xのフレームワーク</th></tr>
<tr><td>データ処理</td><td>Foundation</td><td>Foundation</td></tr>
<tr><td>グラフィック処理<br />
ユーザインタフェース処理</td><td>UIKit</td><td>AppKit</td></tr>
<tr><td>マルチメディア処理</td><td>AV Foundation, Media Player</td><td>AppKitの一部、QTKitなど</td></tr>
</tbody></table>
<br />
<span style="font-size: large;">オブジェクトの生成と削除 </span><br />
<span style="font-size: large;"><span style="font-size: small;">オブジェクトはRetain Countが0になった時に削除される。オブジェクトの作成時には、Retain Countは1で初期化されている。</span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><普通のオブジェクト></span></span><br />
<span style="font-size: large;"><span style="font-size: small;">通常のオブジェクトは、メソッド終了時に自動的に破棄される。</span></span><br />
<span style="font-size: large;"><span style="font-size: small;">イベントの発生によりメソッドが実行される場合、メソッド実行の直前にAutorelease Poolが作られ、メソッドが実行されている間に作成されたオブジェクトの管理を行う。メソッドが終了する直前にAutorelease Poolは削除されるが、その中で管理されていたオブジェクトに対して一斉にreleaseメソッドが送られる。これによりRetain Countが0になるため、オブジェクトは削除され、メモリが解放される。</span></span>
<br />
<fieldset>
メソッド開始<br />
→Autorelease Pool作成<br />
<br />
NSString *str2 = [str substringFromIndex:3];<br />
→ここでstr2のRetainCountは1。Autorelease Poolの管理に入る<br />
<br />
メソッド終了<br />
→Autorelease Pool削除。releaseが呼ばれてstr2のRetainCountが0になる
</fieldset>
<br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><明示的に管理する場合></span></span><br />
<span style="font-size: large;"><span style="font-size: small;">retainをオブジェクトに対して実行すると、保持カウントが+1される。</span></span><br />
<span style="font-size: large;"><span style="font-size: small;">この場合は、Autorelease Poolで管理されていても、Autorelease Pool削除時のreleaseにより保持カウントが0にならないので、オブジェクトは削除されない。</span></span><br />
<span style="font-size: large;"><span style="font-size: small;">イベント処理が終了した後でも使用したいオブジェクトに対しては、retainを呼び出しておく。</span></span>
<br />
<fieldset>
[str2 retain];
</fieldset>
<br />
<span style="font-size: large;"><span style="font-size: small;">この場合は、オブジェクトが不要になった時点で明示的にreleaseを送り、保持カウントを減らす必要がある。</span></span>
<br />
<fieldset>
[str2 release];
</fieldset>
<br />
< Autorelease Poolで管理されないオブジェクト ><br />
<ul>
<li><span style="font-size: large;"><span style="font-size: small;">alloc, newという文字列を名前の先頭にもつメソッド</span></span></li>
</ul>
<ul>
<li><span style="font-size: large;"><span style="font-size: small;">copyという文字列を名前に含むメソッド</span></span></li>
</ul>
<span style="font-size: large;"><span style="font-size: small;">により作られたオブジェクトはAutoreleasePoolの管理に入らない。</span></span><br />
<ul>
<li><span style="font-size: large;"><span style="font-size: small;">明示的にreleaseする</span></span></li>
<li><span style="font-size: large;"><span style="font-size: small;">autoreleaseメッセージを送っておく(AutoreleasePoolの管理に入る) </span></span></li>
</ul>
<br />
< allocの注意 ><br />
<span style="font-size: large;"><span style="font-size: small;">allocでオブジェクトを作る時は、initから始まる初期化メソッドを呼び出すことが必要。</span></span><br />
<span style="font-size: large;"><span style="font-size: small;">オブジェクトの生成(メモリの確保)は行うが、初期化を行わないため。</span></span>
<br />
<fieldset>
NSString *str2 = [[NSString alloc] initWithString:@"ABC"];<br />
NSString *str2 = [[[NSString alloc] initWithString:@"ABC"] autorelease];
</fieldset>
<br />
<span style="font-size: large;"><span style="font-size: small;"> </span> </span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-86571656437927128922011-10-05T17:29:00.000+09:002011-10-05T17:29:24.144+09:00Linuxキーマップの設定ThinkPadのキー配列がUSな関係で、キーマップの設定が必要になることがある。<br />
VMWare上のCentOSでキーマップが違ったので直した。<br />
<br />
よく忘れるのでメモ。<br />
<br />
<br />
<div class="content"><br />
<li>RedHat系:ファイルは/etc/sysconfig/keyboard</li><br />
JPの場合<br />
<pre>KEYBOARDTYPE="pc"
KEYTABLE="jp106"
</pre>USの場合<br />
<pre>KEYBOARDTYPE="pc"
KEYTABLE="us" </pre><pre> </pre><div class="content"><br />
<li>debian</li><br />
JPの場合<br />
<pre># cp /usr/share/keymap/i386/qwerty/jp106.kmap.gz /etc/console/boottime.kmap.gz
</pre>USの場合<br />
<pre># cp /usr/share/keymap/i386/qwerty/us.kmap.gz /etc/console/boottime.kmap.gz
</pre></div><pre> </pre></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-14891986320505734852011-09-11T20:35:00.003+09:002011-10-05T17:30:11.316+09:00ハンダ付け勉強会OSSコンソーシアム 組込み部会女子部 組込み女子半田ゴテ勉強会 様による(第3回)「メイドさんハンダ付け勉強会」というイベントに参加しました(正式名称がこんなに長かったとは)。<br />
<br />
Arduinoを使った「ラブメーター」を作ろうということで(どういうお題だ)。知り合いのおっさんから「参加者が少ないから来て」と言われたので参加。<br />
<br />
実際にハンダ付けしたものは、シンプルなもの....でも色々とトラブルがあってちゃんと動かず皆で苦悩するという謎の状況に陥った(間違えた抵抗が配られたというオチ)。<br />
<br />
で。本題の方はたいしたことではなく。参加者がすごかった。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEide2tFG3N4szBbCib2u8NL14fWshcbNjjUgVsBOvefZwQ6PRuoeFUQ20wn4-x7r0ixcamLTJziYgah_Yu1agTGhm1dnAHQhh5eBO7HcKNlW3vZMj2MTjDyEpjKcAWM8tnwVJMf7sS5gmYb/s1600/%25E5%2586%2599%25E7%259C%259F.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEide2tFG3N4szBbCib2u8NL14fWshcbNjjUgVsBOvefZwQ6PRuoeFUQ20wn4-x7r0ixcamLTJziYgah_Yu1agTGhm1dnAHQhh5eBO7HcKNlW3vZMj2MTjDyEpjKcAWM8tnwVJMf7sS5gmYb/s320/%25E5%2586%2599%25E7%259C%259F.JPG" width="239" /></a></div>まず、本物のメイドさん。会場に入ったら「お帰りなさいませ」と言われてビビる。<br />
本物のメイドさんをこんなに間近に見たのは初めて(なんと席が隣だった)。確かに可愛い....メイドカフェとか流行る訳だわ。<br />
<br />
この後に行った別の宴会では、彼女の写真をおっさんにみせびらかして羨ましがられた。へへへ。 <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJdSEo1zqLSSE5DqHClP9OpVsgV4ItUk2LMvkJOu59S5FTRgdkfjNYykK9Xkc2MnyR04D39xoI4N-QredCZaAHYuPentBb9P7cJaC80L3CQYW2Z94w0BAB9iFY0MQ3QZD_rTzF_QswZI2E/s1600/%25E5%2586%2599%25E7%259C%259F%25EF%25BC%2592.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJdSEo1zqLSSE5DqHClP9OpVsgV4ItUk2LMvkJOu59S5FTRgdkfjNYykK9Xkc2MnyR04D39xoI4N-QredCZaAHYuPentBb9P7cJaC80L3CQYW2Z94w0BAB9iFY0MQ3QZD_rTzF_QswZI2E/s320/%25E5%2586%2599%25E7%259C%259F%25EF%25BC%2592.JPG" width="320" /></a></div><br />
そしてコスプレの方々。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGgntXDvwJe5LvkC025Xve4Mn0yIBNRzjI57wDiQ-fk1oIEI6LCFxBK-dmNhEVQAhVzocOMSoCoQ6mVjxtnykYbn5rw0yCc4aGJempdpUWell_T7E1VTULAfRblQ-yEHCirDCnPl7yngIE/s1600/%25E5%2586%2599%25E7%259C%259F3.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGgntXDvwJe5LvkC025Xve4Mn0yIBNRzjI57wDiQ-fk1oIEI6LCFxBK-dmNhEVQAhVzocOMSoCoQ6mVjxtnykYbn5rw0yCc4aGJempdpUWell_T7E1VTULAfRblQ-yEHCirDCnPl7yngIE/s320/%25E5%2586%2599%25E7%259C%259F3.JPG" width="239" /></a></div><br />
左は、昨日の講師さま<br />
<br />
<br />
コスプレしていない私の方がおかしいのか?という気分にさせられる<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
そして、メイドさんにデレデレするおっさん多数。秋葉原らしい勉強会でした。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-51361429666798926042011-08-29T09:09:00.002+09:002011-10-05T18:34:14.742+09:00OCJ-Pバウチャーを買って、早くも1年。期限切れしてしまうということで、焦ってOCJ-Pを受験してきました。<br />
対策は黒本(教科書と問題集両方)のみ。<br />
<br />
黒本と殆ど同じ問題が何問か出題されて、ちょっと驚きました。全体的には黒本よりも簡単な問題が多かったです。<br />
問題運があったのか、あまり難しい問題も無く。10年くらい前に「引っ掛け問題が多い」という噂を聞いていたので、警戒していたのですがそういうことも無く。割と素直な問題が多かった印象。<br />
<br />
・コレクションはそれぞれの特徴と代表的なメソッドは覚えた方が良い<br />
・スレッドは排他制御(synchronizedあたり)<br />
・javac/javaコマンドのオプションもちゃんと出た<br />
<br />
最初はサンプル問題から始まり、ほいほいと解いていると知らない間に本試験になっていました。「ここから本番ですよ〜」ともっと主張して欲しい...<br />
<br />
正解率は93%で合格。60問なので4問くらい間違えたのか...多分、コレクションのあたりかなぁと思う。<br />
<br />
黒本は、正誤表もあるけど「え?これおかしくない?」という解説や解答例があり、ちょっと悩ましい。<br />
<br />
ところで、Bloggerって読者がつくシステムなんですね。知りませんでした。<br />
こんな放置気味のブログにも読者がついていると....申し訳ないっUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-14799553912516615652011-07-17T21:34:00.000+09:002011-10-05T18:34:38.537+09:00Ruby会議繁忙期につくばとかでやってるから、ずっと行けなかったRuby会議に初参加。<br />
今年で最後なので、最初で最後。<br />
<br />
「最近、こんなに英語聞くこと無かった!」と目を回しそうなくらい、英語を聞いている。<br />
時々、頭がフリーズしている。通訳が出るので、なんとかなっているが。<br />
<br />
クックパッドや図書館システム、クリティカルシステムの話が、興味深かった。<br />
ライブラリとかGC周りもオモシロいんだけど、実際にRubyを使って開発している人たちの工夫はなかなかまとめて聞けないし。Solrが流行っているのかしらん?<br />
<br />
今日もテスト関連の話を聞いて、「データの種類ごとにテストのやり方を変える」とか「そーかー、思いつかなかったよ」と目から鱗。<br />
<br />
仕事でRubyを使う機会が無いので(研修でRailsをたまに教える程度)、今回仕入れた情報をいかに活用するかが問題だ。<br />
<br />
そろそろフリー生活にピリオドを打ち、就職したいと思っているので今回の「求人中です」というプレゼンには激しく心を動かされる。でも...研修で教えているだけで、開発で使ったこと無いからなぁ。むぅ。<br />
<br />
技術評論社をはじめ、色々な人の素早いレポートに驚愕する毎日。今日は、みんな懇親会かな?<br />
明日はRuby会議最終日&railstokyo。楽しみ。<br />
<br />
追記:<br />
「アンチ・ボッチ」活動のおかげで、二日連続で初対面な人たちと楽しくご飯を食べれたことに、感謝。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-10815562003838772212011-01-24T23:35:00.000+09:002011-10-05T18:36:41.745+09:00xmlTextReaderReadでコケた日本語を含んだXMLの場合は特に、なのかもしれないが。<br />
xmlTextReaderRead()を読んでいると、エラーが発生して途中で終わってしまうことがある。<br />
<br />
戻り値が1なら成功、0なら終わり、それ以外はエラー発生でちゃんと処理することが大切。<br />
うっかり忘れていて、ハマった...<br />
<br />
日本語の文字列(文字数制限付き)をXMLに書き出す時に、文字の途中でぶっちぎれてしまったのが原因のようす。書き出す時は良いけど、そのデータを読み出す時に「エンコーディングエラー」と言われた。エンコーディングエラーというよりは、日本語文字列が途中で化けているのが原因だった。<br />
<br />
C言語で日本語を含む文字列の操作は難しい....文字列処理関数が、基本的に「バイト」単位だからなぁ。英数字と日本語が混在している場合で「120文字以下に切り詰める」ってどうやれば良いんだろう?Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-78546288511884026192010-12-06T21:04:00.004+09:002011-09-21T11:06:54.077+09:00RSSのパースlibxml2でRSSのパース。<br />
<br />
xmlデータがchar*に入っている場合は、xmlReaderForDocを使う。<br />
xmlReaderForMemoryを使っていて、ずっとハマった(何故か冒頭の"xml version..."のところでコケる)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6212239954759893934.post-28921450638938233042010-11-30T19:07:00.002+09:002010-12-06T11:55:17.760+09:00iPod touchのパケットをキャプチャする対象のiOSは4.2.1、MacはSnowLeopard<br />
<br />
Macは有線でLANに繋げることが必要。<br />
<br />
<a href="http://ryos.cocolog-nifty.com/hima/2007/09/macipod_touchla_cf1b.html">Macを無線のアクセスポイントにする</a><br />
<br />
<a href="http://d.hatena.ne.jp/paella/20081021/1224597134">WireSharkをインストールする</a><br />
<a href="http://negatorblog.blog36.fc2.com/blog-entry-97.html">WireSharkをインストールする</a><br />
<br />
iPod touchのWiFi設定を変更する<br />
<br />
プロキシの設定はEthernetのアドレスを指定する。<br />
CaptureインタフェースもEthrenetを指定。<br />
<br />
WireSharkでネットワークインタフェースが表示されない場合は、<br />
<br />
chgrp admin /dev/bpf*<br />
chmod g+rw /dev/bpf*<br />
<br />
を実行する。Unknownnoreply@blogger.com0