2024年11月5日火曜日

Unit5が終わった

Google様のAndroidトレーニング「Compose を用いた Android アプリ開発の基礎」のUnit5まで終わった。

以前作ったアプリではRetrofit + moshiを使っていたのだけど、このコースではRetrofit + KotlinSerializationの組み合わせを推奨しているみたい。moshiはどこに行った?

通信するアプリでは、まず最初にManifestファイルへ権限設定をしておくのが良さげ。大体、後回しにすると忘れる。

build.gradle.ktsでの依存関係はデフォルトで作られたものをそのまま使うとうまく動かないケースがあり。

implementation(libs.androidx.core.ktx)implementation("androidx.core:core-ktx:1.12.0")に変更した。

pluginsの部分も差し替えないと、エミュレータで試したときにエラーになった。

 plugins { 
 id("com.android.application") 
 id("org.jetbrains.kotlin.android") 
 id("org.jetbrains.kotlin.plugin.serialization") version "1.9.0" 
}

この辺りは設定ファイルの書き方とかをちゃんと勉強しないとダメだなぁ。とりあえず作り方を一通り見たら、設定ファイルの書き方を改めて勉強しよう。

2024年10月31日木曜日

アウトプットした方が心の安定が保たれるという噂

というか、インプットに偏りすぎるのは自分のためにも良くない、という噂があり。
たまにXに「身体が痛い」「頭痛がひどい」と呟く程度のアウトプットしかしていない、インプットに激しく偏っている自覚があるので、自分の精神のためにアウトプットをしようと。

勉強していることとかを書けばいいかと思ったけど、ZennとかQiitaに書いちゃうと、ゴミになって迷惑かなと思うので、ここならいいかと。なんとなく復活させる。

実は仕事がちょっと暇なので、Android開発の勉強をしている。どうやら来年の1月からAndroid開発案件が降ってくるらしいので。 ということで、この辺りから。
で、どうやって勉強しているかというと、Google様のトレーニングコースをやっている。

Compose を用いた Android アプリ開発の基礎

量が多くて、サラッと流すと全てが忘却の彼方に飛んでいきそうだし。
しっかりやるといつまでも終わらない。
とりあえずもうちょっとでユニット5が終わりそうなところなので、これで「知らなかったなぁ」と思ったことをまとめていく。

果たして続くのか。

2020年9月18日金曜日

SESで添付付きのHTMLメールを送る

この情報は2020年9月時点の情報です。
先日、お仕事でAWS SESを利用して、動画を添付したHTMLメールを送るというのをやったのですが。
結局ボツになりまして。
もったいないので、ここに概要を貼り付けておこうかと。

ちゃんと動くかどうかは保証しません。なんかあっても私を責めないでください。
HTMLメールはファイルとして用意して、readTemplate()でstringとして読み込むようになっています。
動画はS3からmp4をダウンロードして、base64エンコードします。

タイトルが日本語だとbase64エンコードしないとダメだったりと、いろいろ面倒な感じになっていますが。
    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
    }

2016年8月23日火曜日

Java正規表現確認用のサイト

自分向け備忘録。

http://java-regex-tester.appspot.com

Direct Connect

金持ちにしか関係ないと思っていたダイレクトコネクトを設定する機会がやってきた。

 - 多分誰かが何かを依頼したのであろう、Direct ConnectのVirtual Interfacesにエントリができていた。ステータスはPending acceptance 
- とりあえずVPCのマネジメントコンソールでVGWを作る。リージョンに気をつけて、適当に名前をつける
 - 前述のVirtual Interfacesを作成したVGWと繋げる。
     - チェックボックスにチェックを入れ、Accept Virtual Interfaceをクリック
     - VGWを選択してAcceptをクリック
- なんか繋がったっぽい感じになるまで待つ
- VPCを用意する。必要に応じてサブネットも作る。
- VPGにVPCをアタッチする
- VPGにパケットを流すサブネットのルートテーブルに、エントリを追加する

最後の手順を忘れて、「あれ?繋がらん」と苦悩したのでした。

接続先サーバがpingを通さなかったので、疏通確認はncで。

$ nc -v -w 1 < IP address> -z

2015年4月8日水曜日

rbenv-gemsetsを使う。

$ 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

rbenv-gemsetsはAnsibleでインストール。
Bundlerをアンインストールして、全部gemsetで管理するように切り替えた。
gemsetはRubyのバージョンごとに作るので、まずrbenv versionsでバージョン確認。とりあえずbasicとしておいた。

作業用ディレクトリに移動してそこで有効にするgemsetを記述した.rbenv-gemsetsファイルを作る。rbenv gemset activeで確認すると、なぜかbasic以外にもglobalと表示される。gem envを確認してもglobalというgemsetがあるかのようにGEM PATHSに表示されるけど、実際には該当ディレクトリがない。謎。
深く考えずにbundlerをインストールすると、ちゃんとGEM PATHSのbasicの下にインストールされるし、他のディレクトリに移動してgem listを見るとbundlerは表示されない。

あとは、gemをインストールするときにちゃんと該当ディレクトリで.rbenv-gemsetsファイルを記述するようにすればきっときれいな状態になる...はず。

Bundlerもgemsetsで管理するならrbenv-default-gemsの設定は確認する必要あり。
つづけてRailsアプリを作るなら
$ cd ~/Study/Rails1
$ rbenv exec gem install rails
$ rbenv exec rails new myapp
$ cd myapp
$ rails server
みたいな感じかと。

2015年4月6日月曜日

TeX on Yosemite

あー、大切なTeX環境が動かないということで。TeX環境を作りましょう。

1. http://tug.org/mactex/ からMacTeXをダウンロード。Yosemiteだとインストールで障害が出たりするよとか書いてあって怖い。 ghostscriptになんかあるらしいけど、とりあえずインストールする。

2. PATHとMANPATHは勝手に通るという噂だが通っている気がしないので.zshrcに
export PATH=$PATH:/usr/texbin
を追加。MANPATHはとりあえず放置。

3. TeX Live Utilityを起動して更新をかける。そうするとエラーになるので、メニューから「更新があるか確認」を実行。その後もエラーメッセージが出たりするので、深く考えずにTeX Live ユーティリティを再起動してもう一度更新をかけると、そのうち文句を言わなくなる(Yosemiteの問題という噂)。多分、大丈夫だと思う。

4. texmf.cnfの編集
$ kpsewhich -var-value TEXMFLOCAL
/usr/local/texlive/texmf-local
$ sudo vi /usr/local/texlive/texmf-local/web2c/texmf.cnf
shell_escape_commands = \
bibtex,bibtex8,bibtexu,upbibtex,biber,\
kpsewhich,\
makeindex,mendex,texindy,xindy,\
mpost,upmpost,\
repstopdf,epspdf,extractbb
$ sudo mktexlsr

5. ヒラギノフォントを使えるように設定。https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#i9febc9bを参照。PDFへの埋め込みも可能にしておく

6. sudo kanji-config-updmap-sys status で埋め込まれるフォントを確認しておく

7. MacTeXで入るghostscript(9.10)だとeps fileが表示されないそうなので、新しいバージョンのものを入れる。ダウンロード先はhttp://pages.uoregon.edu/koch/
最新は9.16だった。

8. TeXShopを起動して、環境設定をする。値はhttp://uenohara.hatenablog.jp/entry/2014/02/02/224140を参考に。

[書類]

  • [設定プロファイル]
    • pTeX(ptex2pdf)
  • エンコーディング
    • Unicode(UTF-8)


[内部設定]

  • [pdfTeX]のTeX
    • pdftex --file-line-error --synctex=1
  • [pdfTex]のLaTeX
    • pdflatex --file-line-error --synctex=1
  • [TeX+dvipdfmx/TeX+dvips+distiller]のTeX
    • ptex2pdf -e -ot "-synctex=1 -file-line-error"
  • [TeX+dvipdfmx/TeX+dvips+distiller]のLaTeX
    • ptex2pdf -l -ot "-synctex=1 -file-line-error"
  • [BibTeXエンジン]
    • pbibtex

このあとbrew doctorをやったら/usr/local/share/man/deのパーミッションエラーが出たのでchownした。なぜ、そこだけなんだ...





2015年4月4日土曜日

Yosemiteをクリーンインストール

暇だしということで、ずっと見ぬふりをしてきたYosemiteへのアップグレードを。一度きれいにしたいということで、クリーンインストール。
いろいろインストールしてディスク使用量を見ると、30G程度しか使ってない。インストール前は、残り20G切ってたのに。きっと何か忘れてるんだ...なんだろう。どきどき。

で、知り合いに唆されてAnsibleでセットアップ。
後で「あ、あれ忘れた」と思ってもyamlに追加して再実行すれば、実行済みのところはスキップしてくれるし。実行中にエラーが出たところも削除 or 修正して再実行すればいいし。冪等性っていうんですか?素敵ですね。

1Passwordをbrew caskで入れると不幸になるという話をちょっと見かけましたが、これは問題ないように見えます。
Alfredはインストールした後brew cask alfred linkを実行するようにして。後で手動でSearch Scopeの設定が必要。/opt以下なのでCmd+Shift+gでパスを入力(これを知らなくて苦悩した)。そのくらいかなと。
割と途中でよく失敗するんだけど、再実行するとうまく行ったりする。一気に実行すると辛くなるのかしらん。

とりあえず、Airmail, 夜フクロウ, ScanSnap関係あたりを手動で。後で追加する。

sophosはやたら重くなったという噂なので、ClamXAVにセキュリティソフトは変更。設定がいまいちわからん。

とりあえず、ansibleのyamlはgithubにでもあげとくか。

2013年10月23日水曜日

janssonのインストール

jsonのパースをやりたい。自力で頑張りたくないということで、jansson。
今回はjansson 2.5を使用。

ダウンロードして解答して、移動したら
# ./configure
# make
# make test
# make install
するだけ(インストール先によってはroot権限が必要)。

今回はひたすらデフォルト設定なので /usr/local/includeのしたにヘッダファイル、/usr/local/libのしたにライブラリができた。
 Arm v5でもconfigureのパラメータ設定でちゃんと使えた。

2013年6月22日土曜日

CからMySQLに接続する(環境設定)

1. mysqlインストール状態の確認
$ dpkg -l | grep -i mysql
2. mysql-serverインストール
$ sudo aptitude install mysql-server-5.0
3. libmysqlclient-develインストール
$ sudo aptitude install libmysqlclient-dev
 
クロスコンパイル環境では、ライブラリもそれ用のを入れるので
1. xaptをインストールする
$ 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
2.ちょっと/etc/xpat.d/debian.confを書き換える
suite= squeeze
checknewer=true
この2行以外は元のまま。
3. libmysqlclient-devインストール
$ sudo xapt -a armel -m libmysqlclient-dev
CFLAGS, LDFLAGSともにクロスコンパイル環境の場合は/usr/arm-linux-gnueabiの下になるので注意する。

2013年6月10日月曜日

armクロスコンパイル

VagrantとVirtualBoxはインストール済み。
1. DebianのBoxをVagrantに追加。今回はSqueezeの32で(深い理由はない)。
$ vagrant box add debian_squeeze_32 http://mathie-vagrant-boxes.s3.amazonaws.com/debian_squeeze_32.box
2.Vagrantのインスタンス置き場を作成し、初期化
$ mkdir ~/vagrant_work/debian_squeeze_32
$ cd ~/vagrant_work/debian_squeeze_32
$ vagrant init debian_squeeze_32
3. VirtualBoxインスタンス起動 & ログイン
$ vagrant up
$ vagrant ssh
4. ここからはDegian側での作業。armクロスコンパイル環境をバリバリと構築
$ sudo aptitude install emdebian-crush emdebian-grip emdebian-archive-keyring
5. apt-listにエントリを追加する
$ sudo vi /etc/apt/sources.list
追加するのは以下の2行。
deb http://www.emdebian.org/debian/ squeeze main
deb-src http://www.emdebian.org/debian/ squeeze main
6. さらにインストール
$ sudo aptitude update
$ sudo aptitude upgrade
$ sudo aptitude install gcc-4.4-arm-linux-gnueabi
で、
$ arm-linux-gnueabi-gcc test.c
みたいな感じでコンパイルできる。

2013年6月3日月曜日

TeX環境作成(MacTeX2013使用)

BoxenではTeXShopしか入らなかったので。手作業でごりごり。調べてみたらMacTeXは2013が出ているらしいので、うまくいかなくて良かったと安心してみることに。

1. とりあえずBoxenでTeXShopは入っている。
2. brewでghostscriptとimagemagickとか入れる。
$ brew update
$ brew install ghostscript
$ brew install imagemagick

3. ここからmactex-2013.pkgをダウンロード。結構でかい。

MacTeXでは「カスタマイズ」にしてTeXLiveだけをインストールする(ghostscriptとかかぶるので)。
あとは ここここを参考にしつつ。

  • 文献管理はPagersがあるのでインストールしない
  • Excaliburをインストール
  • LaTeXiTもインストール
  • TeXShopはすでにBoxenでインストールしていた
  •  TeXworksもインストール
TeXLiveでのパッケージ更新は、インストールしたのがMacTeX2013だったせいか、更新が見つからなくてスキップした。
pmetapostとuptexのインストールは実施。
フォントの追加はしない。
LaTeXiTの設定をして。
TeXShopの設定をして。

そんな感じで、インストール完了。

毎回TeXは結構面倒だなぁと思うので、なんとかしたいがどうにもならん。

2013年6月1日土曜日

Macの環境をなんとかする(Boxenを使ってみる)

Airがブートしなくなり、ジーニアスバーに連れて行ったらそのまま入院してしまい。
 帰ってきたらSSD交換で記憶を失っていたり、TimeMachinから戻そうとしたら失敗したりで、いっぺん環境を作りなおすかと作業中。
また何かあった時にイチからやり直すのはちょっとキツイので、この機会に出来るだけ自動化を目論んでみる。Boxen導入。

1. とりあえず、ソフトウェアアップデートをしたあとでTimeMachineにバックアップ。
2. XCodeをインストールする。コマンドラインツールも入れる。
3. githubのアカウント設定をする。ここを参考に。
4. githubの秘密鍵とかあるなら、.sshの下においておく(多分必要)
5. Quiitaの ここらへんを参考にする。

Puppetfileは、元からあったものはそのままにして必要なものを下に追加。追加したのは

  • chrome
  • iterm2
  • sublime_text_2
  • dropbox
  • firefox
  • github_for_mac
  • mou
  • tmux
  • virtualbox
  • skype
  • appcleaner
  • fluid
  • osx

manifests/site.appは編集して、一番新しいバージョンだけNodejsとRubyを入れるようにする(古いものはコメントアウト)。
modules/people/manifests/{Githubアカウント名}.ppを編集。Puppetfileで追加したもののincludeを設定したり(osxはincludeしない)。homebrew経由およびダウンロードでインストールするものを追加したり。

  • homebrew経由
    • autoconf
    • automake
    • bash
    • bash-completion
    • rbenv-gemset
    • tig
    • zsh
  • ダウンロード
    • GoogleJapaneseInput
    • Sophos Anti Virus for Mac Home Edition
    • Mac Vim + Kaoriya
    • Vagrant
    • MacTeX
    • TexShop

あとはzshにログインシェルを変更したりとかそんな感じで。

script/boxenでインストール(ディスクの暗号化をしないオプション付きで)。

失敗したこと
1. modules/peopleの下に個人設定ファイルを置いてしまい、「自分で追加したものがインストールされない。な〜ぜ〜?」と苦しんだ。エラーメッセージが出ない間違いは、気付きにくい。
2. sourcetreeはエラーが出てインストールできなかった。
3. MacTeXはダウンロードに失敗したのか、実行中にインストールエラーが発生
4. MacVim+Kaoriyaはエラーが出ないのにどこにも見当たらない...どこだ?
5. 途中で何度も「/opt/boxen/homebrew/binにパスが通っていませんぜ」とワーニングが出る。homebrewが入ったところあたりでパス設定ができると幸せになれる気がする。
6. よくわからんエラーが出ているところがある。どこが原因かわからないので、何もケアしていない....

依存関係とかpuppet-osxとか使いこなせると色々できそうだけど、ダウンロード途中で失敗したりした場合のケアとか考えないとまずいのかなと思うところがある。MacVimとMacTeXはとりあえず手動でインストールすることに。

今回のファイルはどっかにあげとくと、次回に活かせるかなということで。どっかにあげよう。

2013年5月23日木曜日

CでJSONをパースする

自分でゴリゴリ書くと辛い。そんな訳で、parsonを試してみた。
[{"Name":"Taro", "Age":"10"}, 
  {"Name":"Hanako", "Age":"20"}]
みたいなJSONを解析するには
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);
みたいな感じでやればパース出来る。 日本語とか大丈夫なのかはまだ未確認だけど、便利そう。

2012年4月3日火曜日

iPhoneでYouTube(その2)

先日の投稿で書いた通りにやると、うまくいかなくなってしまった。gdata-objectivec-clientにSBJSonが入らない状態でダウンロードされるためと思われる。 で。こんな感じで回避。

1. svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/ gdata-objectivec-client-read-only

これでSBJSonの入っていないgdata-objectivec-clientが取得できる。

2.ここからさらにダウンロード。 

2に入っているJSONフォルダを1のSourceにコピー。

そのあとはここで紹介されている手順で作業。

もしかしたら2つめにダウンロードしたやつだけでうまくいくのかもしれない....と後で思った。

2012年2月10日金曜日

iPhoneのPush

とりあえず、SandBox使用の場合

1) App IDではちゃんと開発用のPushの設定をしておく
2) Pushが使えるProvisioningで署名をする
3) 1. で取得した証明書とか秘密鍵でp12ファイルを作って、サーバーにおいておく

3を忘れてひどい目にあったので、めもめも。

2012年2月8日水曜日

YouTube API for Objective-C(iPhone)

設定はここを見れば、大体問題なし(YouTube APIになっていないところは、適宜直す)。

xxx.hでは
#import "Headers/GDataYouTube.h"
#import "Headers/GDataServiceGoogleYouTube.h"

を記述した上で、プロパティにGDatFeedYouTubeVideo*を設定しておく。

特定ユーザのフィードを検索するにはviewDidLoadあたりで

    GDataServiceGoogleYouTube *service = [self youTubeService];
    NSURL *feedURL = [GDataServiceGoogleYouTube youTubeURLForFeedID:nil];
    GDataQueryYouTube* query = [GDataQueryYouTube 
            youTubeQueryWithFeedURL:feedURL];
    [query setStartIndex:1];
    [query setMaxResults:5];
    [query setAuthor:@"ユーザ名"];
    [query setOrderBy:@"published"];
   
    [service fetchFeedWithQuery:query delegate:self
          didFinishSelector:@selector(request:finishedWithFeed:error:)];
   
    [super viewDidLoad];       


とやっておく。

youTubeServiceは
- (GDataServiceGoogleYouTube *)youTubeService {
    static GDataServiceGoogleYouTube* _service = nil;
    if (!_service) {
        _service = [[GDataServiceGoogleYouTube alloc] init];
        [_service setUserAgent:@"てきとうに"];
    }
   
    // fetch unauthenticated
    [_service setUserCredentialsWithUsername:nil  password:nil];
    return _service;
}

検索が終わったら
- (void)request:(GDataServiceTicket *)ticket
finishedWithFeed:(GDataFeedBase *)aFeed
          error:(NSError *)error {
    if (!error) {
        [self setFeed:(GDataFeedYouTubeVideo *)aFeed];   
        [self.listView reloadData];
    }
}

みたいにして、検索結果をプロパティに設定して、UITableViewを更新する。
タイトル文字列なんかは
    GDataEntryBase *entry = [[feed entries] objectAtIndex:indexPath.row];
    NSString *title = [[entry title] stringValue];
    NSString *descriotion =
   [[[(GDataEntryYouTubeVideo *)entry mediaGroup]
               mediaDescription] contentStringValue];
    NSArray *thumbnails =
   [[(GDataEntryYouTubeVideo *)entry mediaGroup] mediaThumbnails];


こんな感じでとれる。

ここから基本的なコードは取得できる。






2011年10月28日金曜日

階乗のプログラム

Lipsで書くと、こんな感じ。
(defun fact (n)
    (if (zerop n)
        1
       (* n (fact (- n 1)))))
カッコの数があっているのか心配になる。

Prologで書くとこんな感じ。
fact(0, 1).
fact(N, X) :- N1 is N - 1,  fact(N1, X1), X is X1 * N.
分かりやすい。ステキ☆

Haskellで書いてみる。
fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact(n - 1)
やっぱりこのあたりはHaskellが一番きれいかも。分かりやすいし。

Javaで書いてみる。
class Fuctorial {
  static int fact(int x) {
      if ( x == 0 )
          return 1;

     return x * fact(x-1);
  }
}
この程度のことでも色々書かなくちゃ行けない辺りが面倒。

2011年10月27日木曜日

Objective-C... メモリ管理

処理iOSのフレームワークMac OS Xのフレームワーク
データ処理FoundationFoundation
グラフィック処理
ユーザインタフェース処理
UIKitAppKit
マルチメディア処理AV Foundation, Media PlayerAppKitの一部、QTKitなど

オブジェクトの生成と削除 
オブジェクトはRetain Countが0になった時に削除される。オブジェクトの作成時には、Retain Countは1で初期化されている。

<普通のオブジェクト>
通常のオブジェクトは、メソッド終了時に自動的に破棄される。
イベントの発生によりメソッドが実行される場合、メソッド実行の直前にAutorelease Poolが作られ、メソッドが実行されている間に作成されたオブジェクトの管理を行う。メソッドが終了する直前にAutorelease Poolは削除されるが、その中で管理されていたオブジェクトに対して一斉にreleaseメソッドが送られる。これによりRetain Countが0になるため、オブジェクトは削除され、メモリが解放される。
メソッド開始
     →Autorelease Pool作成

NSString *str2 = [str substringFromIndex:3];
                 →ここでstr2のRetainCountは1。Autorelease Poolの管理に入る

メソッド終了
     →Autorelease Pool削除。releaseが呼ばれてstr2のRetainCountが0になる


<明示的に管理する場合>
retainをオブジェクトに対して実行すると、保持カウントが+1される。
この場合は、Autorelease Poolで管理されていても、Autorelease Pool削除時のreleaseにより保持カウントが0にならないので、オブジェクトは削除されない。
イベント処理が終了した後でも使用したいオブジェクトに対しては、retainを呼び出しておく。
[str2 retain];

この場合は、オブジェクトが不要になった時点で明示的にreleaseを送り、保持カウントを減らす必要がある。
[str2 release];

< Autorelease Poolで管理されないオブジェクト >
  • alloc, newという文字列を名前の先頭にもつメソッド
  • copyという文字列を名前に含むメソッド
により作られたオブジェクトはAutoreleasePoolの管理に入らない。
  • 明示的にreleaseする
  • autoreleaseメッセージを送っておく(AutoreleasePoolの管理に入る)

< allocの注意 >
allocでオブジェクトを作る時は、initから始まる初期化メソッドを呼び出すことが必要。
オブジェクトの生成(メモリの確保)は行うが、初期化を行わないため。
NSString *str2 = [[NSString alloc] initWithString:@"ABC"];
NSString *str2 = [[[NSString alloc] initWithString:@"ABC"] autorelease];

 

2011年10月5日水曜日

Linuxキーマップの設定

ThinkPadのキー配列がUSな関係で、キーマップの設定が必要になることがある。
VMWare上のCentOSでキーマップが違ったので直した。

よく忘れるのでメモ。



  • RedHat系:ファイルは/etc/sysconfig/keyboard

  • JPの場合
    KEYBOARDTYPE="pc"
    KEYTABLE="jp106"
    
    USの場合
    KEYBOARDTYPE="pc"
    KEYTABLE="us" 
     

  • debian

  • JPの場合
    # cp /usr/share/keymap/i386/qwerty/jp106.kmap.gz /etc/console/boottime.kmap.gz
    
    USの場合
    # cp /usr/share/keymap/i386/qwerty/us.kmap.gz /etc/console/boottime.kmap.gz