So-net無料ブログ作成
  • ブログをはじめる
  • ログイン
前の10件 | -

【C++】 OpenGLメモ ② [C++]

【概要】
VC++プロジェクトにfreeglutをセットアップするぞ。

【詳細】
とりあえず、(空の)ソリューションとプロジェクトを作成しまふ。
プロジェクトに[追加]でincludeディレクトリとlibディレクトリを追加(※1)。
さらにlibはDebug用とRelease用があるのでlib配下にそれぞれのディレクトリを追加しておく。

※1 ソリューションエクスプローラーで「すべてのファイルを表示」を選択しないと
「フォルダー」ではなく「フィルター」になってしまうようだ。

後は通常のエクスプローラーから(※2)前回の成果物である以下をコピペする。
include/GL/*.hを作成した(プロジェクトディレクトリ)/includeへ
(GLディレクトリごとつっこもう)
~lib/Debug/*.libを作成した(プロジェクトディレクトリ)/lib/Debugへ
~lib/Release/*.libを作成した(プロジェクトディレクトリ)/lib/Releaseへ

コピペしたらVSに戻りソリューションエクスプローラーで「最新の情報に更新」。
これでコピペしたファイルが各ディレクトリに現れる筈。

※2 右クリ→[追加]→[既存の項目]での追加だとパス情報か何かしか貼られない上に
ディレクトリには配置されないようなので、コピペは通常のエクスプローラーから行う。

後は以前の記事でも触れた外部ライブラリ設定3点セットを設定する。
プロジェクト右クリック→[プロパティ]で以下を設定。
フルパスで記述してもいいけど極力マクロを使った表現の方が良いだろう。
・まずは構成を「全ての構成」、プラットフォームを「全てのプラットフォーム」にする。
・[C/C++]→[全般]→[追加のインクルードディレクトリ]
 「$(ProjectDir)include」を設定
・以下、構成を「Debug」「Release」それぞれで設定する(※3)。
・[リンカー]→[全般]→[追加のライブラリディレクトリ]
 構成が「Debug」なら「$(ProjectDir)lib\Debug」を設定
 構成が「Release」なら「$(ProjectDir)lib\Release」を設定

※3 面倒なら「全ての構成」のままDebugかReleaseのどちらかのパスを設定する。
  たぶん、あんまり良くない(笑)

早速確認する。
[追加]→[新しい項目]→[新しい項目]→[C++ファイル(.cpp)]を追加。
(作成ディレクトリに注意。lib等の作成操作でデフォルトが変わっているかもしれない。)
以下を入力してF7でビルド。

#include "GL/glut.h"


void callback(void) {
	glutWireCube(0.5);
	glFlush();
	return;
}

int main(int argc, char* argv[]) {

	glutInit(&argc, argv);

	glutInitWindowPosition(0, 0);
	glutInitWindowSize(320, 320);

	glutCreateWindow("Windows Title");

	glutDisplayFunc(callback);

	glutMainLoop();

}


上手くいったらF5でデバッグ実行。が、失敗する筈。
なぜなら実行時はdllが必要だから(´・ω・`)
…というわけでソリューションディレクトリ配下(.slnがあるとこ)にx64もしくはx32ディレクトリが出来ていて、そこに(DebugまたはReleaseディレクトリの下に).exeが有る筈なので前回作ったfreeglutd.dllまたはfreeglut.dllを配備しよう。
Debug/Releaseとファイル名末尾dの有無の関係に注意されたし。

これで上手くいけばウィンドウに□が表示される筈。
glutWireCube以外にも色々あるので試してみよう。
(glutWireまで入力してCtrl+スペースで候補を出してみる)


[リンカー]→[入力]→[追加の依存ファイル]は設定しなくてもいいようだ(´・ω・`)
いまいち関係性が分からん。。。
でもまぁ普通そうだよね。
単発で指定したい場合に「追加の依存ファイル」の項目を使うのだろう。たぶん。
コメント(0) 
共通テーマ:資格・学び

【C++】 OpenGLメモ ① [C++]

と、いうわけで、OpenGLを少しかじってみることに。
導入法は色んなサイトや動画で勉強出来るけど、備忘録として残す。

【概要】
CMakeとVC++を使ってfreeglutをビルドするぞ。

【詳細】
OpenGLだけだと使い難いっていうか初心者にはほぼ無理っぽいのでfreeglutを導入する。
http://freeglut.sourceforge.net/index.php#download
からfreeglut-3.0.0.tar.gzを落とす。

READMEを読むと先ずはREADME.cmakeを読めと言われる(´・ω・`)
README.cmakeを読む。どうやらCMakeというツールが必要らしい。
CMakeはマルチプラットフォーム対応のC++ビルドツールとのこと。
Visual C++のソリューションファイルやMinGWのmakefileをお手軽に作れるようだ。

https://cmake.org/download/
からcmake-3.11.1-win64-x64.msiをダウンロードしてインスコ。
尚、当方64bit環境ゆえ、以降全て64bit環境用で表記しまふ。

「Where is the source code:」にfreeglut-3.0.0の親ディレクトリ、
「Where to build the binaries:」に適当な出力ディレクトリを入力する。
後は左下の「Configure」から「Visual Studio 15 2017 Win64」を選択して「Finish」。
「Use default native compilers」は変更する必要はなさそう。
出力先が未作成の場合は「Configure」を押したときに作成するか聞いて来る。手厚いですな。

そうすると設定プロセスが進んで画面に真っ赤な趣味の悪い(笑)成果物選択画面が表示される。
FREE_GLESというのがチェックされていないが、組み込み用か何かのようなので無視で良いみたい。
そのままConfigureの隣にある「Generate」を押すと出力ディレクトリに.slnファイルが作成される。
と、ここまではREADME.cmakeに大体書いてあるね。
簡単な英語なので誰でも読めるに違いない。私でも読めたぞ(´・ω・`)

早速freeglut.slnをダブクリしてVSを起動する。
そのまま[ビルド]→[ソリューションのビルド]を実行。
すると.slnのあるディレクトリにbinとlibディレクトリが作成されて、
必要なfreeglut.dllやfreeglut.lib等がゲット出来るはずだ。

このままだとRelease版だけなので、[ビルド]→[構成マネージャー]から「アクティブソリューション構成」をDebugに変更して、
再度[ビルド]→[ソリューションのビルド]を実行してDebug版も作っておこう。

【成果物】
~\bin\Debug\freeglutd.dll
~\lib\Debug\freeglut_staticd.lib
~\lib\Debug\freeglutd.exp (これは多分使わない)
~\lib\Debug\freeglutd.lib
※ デバッグ用はファイル名の最後がdで終わっているので注意されたし。

~\bin\Release\freeglut.dll
~\lib\Release\freeglut_static.lib
~\lib\Release\freeglut.exp (これは多分使わない)
~\lib\Release\freeglut.lib

※ 以下のヘッダはfreeglut-3.0.0を解凍した時点で存在している。
freeglut-3.0.0\include\GL\freeglut.h
freeglut-3.0.0\include\GL\freeglut_ext.h
freeglut-3.0.0\include\GL\freeglut_std.h
freeglut-3.0.0\include\GL\glut.h

とりあえず、こんだけあればOKのようだ。
コメント(0) 
共通テーマ:資格・学び

【C++】 C++をかじり始めた [C++]

折角C言語やっているので、ちょっと手を伸ばしてC++をかじってます。
C++の感想ですが、言語仕様のごった煮状態でプログラム言語界の闇鍋という印象です(笑)
まぁこういう言語が一つ位有ってもいいんじゃないかと思います。
「趣味でやる分には」意外と楽しいですね。

機能拡張と言えばJavaとかもバージョンが上がる度に言語仕様が増えちゃってますが、
元々シンプルだった言語がだんだん汚くなっていってるようで、個人的にはどうだろうなぁと。
C++まではっちゃければまた違うんですけど、Javaとかはそうではないよなぁ…と思わんでもない。

Javaと言えば無償サポートが終了してしまうとか何とか。
Javaで遊ぶならOpen JDKでってなりそうですが、
場合によってはJavaがオワコン化しそうで、今後どうなるのか目が離せないですね。
まぁSunがOracleに喰われた時点で元々そういう心配は有りましたけど、現実味が出てきたなと。
Eclipseとかどうなるんでしょうね。

っといつの間にかJavaの話になってましたが、C++はまだディープに話せる程の知識がなく。。。

環境ですが、Visual Studio 2017で遊んでます。
Eclipse + MinGWでもいいかな…とは思うんですが、
どうせC++やるならWindowsプログラミングとかも触ってみたいですからね。
そうなると趣味の範囲なら拡張機能まで使えるCommunityが無償提供されているVisual Studioを
使わない手はない訳で。
それにしてもMSも柔らかくなったものですな(笑)

まぁ何れにせよ言語仕様以前にIDE自体に慣れないといけないという最初の関門がある訳で(笑)
VSで言うとソリューションとプロジェクトの関係がちょっと分かり難かったですな。
っていうかソリューションと1プロジェクトがデフォルトで紐づいてしまうのが個人的には
ちょっと扱い難いかなぁと。
もっと言うとSolution01-Project01みたいな構成にしても、Project01.slnが出来てしまうところね。
そこはSolution01.slnだろ…と(笑)
いや、まぁあまり困ることもないのでいいんですけど。

あとまぁ設定項目が大量過ぎてゲボいですな。まぁこれはしょうがないか。。。
もうちょっと整理されているといいんだけど。
[ビルド]→[構成マネージャー](※)辺りの設定と
[各プロジェクト]→[プロパティ]の構成の紐付けとかも引っ掛かり易い。
Debug版・Release版、32bit版・64bit版を意識しとかないと「あれ?」ってなる場合がある(´・ω・`)

※ [ビルド]→[構成マネージャー]じゃなくて[各プロジェクト]→[プロパティ]→[構成マネージャー]の方がいいかな

あとややこしいのは[各プロジェクト]→[プロパティ]の
・[C/C++]→[全般]→[追加のインクルードディレクトリ]
・[リンカー]→[全般]→[追加のライブラリディレクトリ]
・[リンカー]→[入力]→[追加の依存ファイル]
の外部ライブラリ(の追加に必要な)3点セットでしょうか。

まぁ言語仕様的にヘッダと本体に分かれているC/C++なので2つあるのはまぁしょうがないんでしょうけど、
最後の依存ファイルというのがまたしっくり来ない。
DLLやlibは別腹ですお!ということなんだろうけれども、この辺は知識不足のため「何やお前?」感がしゅごい。
追加のライブラリディレクトリを指定してるんだから勝手に読んでくれよと思っちゃう。(´・ω・`)

…という按配です、今のところ。
コメント(0) 
共通テーマ:資格・学び

【C】 リバースエンジニアリング備忘録 [C言語]

今回ほぼ全般的にリバースエンジニアリングを行うハメになったので、
やったことをまとめとこうと思う。今後のために。

①コールグラフを自力で作る。

コールグラフっていうのは関数の呼出し遷移図ですね。

関数A┬→関数B
   └→関数C─→関数D

こんな感じの。
まぁこの手のはツールが沢山転がってるんですけど、自力で作成します。
何故かというと、脳に引っ掛かり(記憶のトリガー)を作るためですね。写経で理解するのと同じです。

具体的にはエクセル辺りで
・関数名
・ファイルパス(ファイル名):関数開始行
・(有れば)コメント文の関数和名 or 概要
 →「○○処理」等の簡単なもの
を記述したテキストボックスを矢印で繋いでいく感じで適当に作ります。
そこそこ時間掛かりますが、処理の流れが何となく把握できるようになりますね。
ちなみにログ出力とか余計なものは省きます。


②関数の「層構造」を把握する。

これをここで表現するのは難しいですが(笑)、

main() ←(敢えて書く必要は無いです)
  処理A(or関数A)
    処理B(or関数B)
    処理E(or関数E)
  処理C(or関数C)
    処理F(or関数F)

みたいな感じでしょうか。
コールグラフと似てますが、コールグラフが「流れ・フロー」の理解であることに対して、
こちらは「処理構造」の理解になります。
従ってコールグラフは末端まで描きますが、こちらは末端までは書きません。
当然ながらインデントのレベルが非常に重要です。
上記の例で、処理Bと処理Eが逐次ではなく分岐の場合は、その旨何かテキストボックスでも貼っておくと良いかもしれません。
処理和名が分からない場合は一先ず関数名そのまま書いてしまいましょう。
出来れば両方有ると後々便利かも。


③その他

進展有ったら書く。
多分、変数(グローバル限定…?)周りの値遷移について書くと思うけど、
良い手法、図示方法を思いつかない。。。
コメント(0) 
共通テーマ:資格・学び

【C】 C言語に触れ始めて結構経ったが… [C言語]

面倒くせぇぇぇwwwww

とにかく面倒臭いC言語。
あの機能もこの機能もない。ないないないなーい。
これならC++の方がよっぽどいい気がするが、あれは逆に仕様盛り過ぎなんだよなぁ(笑)

ただ、未だに信者が多いというか使われ続けている理由も分かる。
機能が無い分リソースを全く喰わないので、コンパクトさが段違い。
でもそのコンパクトさが不要な界隈においては触れたくないですな。
だって面倒くさいんだもん!

自力で色々作らないとダメな分、色んなことが分かって面白かった点も多い。
(そういうとこがマニアックな人には堪らないのだろうな)
配列をハッシュ値使って割当てなおしているソースを見たときは???だったが、
これがハッシュ・チェインによる高速アクセス化だという事が分かったときには妙な感動が有った。
「何やってんだ、こいつバカじゃねーの?www」とか思ってたけどバカは私だったという。。。

Javaで言うところのハッシュマップの実装なんですよね。
ソース見ると確かに似たようなことやってるの。
恥をさらす前に自力で分かって良かった。時間掛かったけどな!
いやぁ、無知って怖いなぁ。
まぁ昔からハッシュって何やねん…と思いつつも、まぁいいかとなぁなぁで済ませてきたツケですな。

それにしてもクラスを作りたいです(笑)
コメント(0) 
共通テーマ:blog

【雑記】 どのプログラミング言語を学ぶべきか? [雑記]

的な記事を「稀に良く」目にするけど、実際に悩むことはないと思う。
なぜなら仕事で使う言語を選ぶだけだからさ(´・ω・`)
言語を選べるポジンションに下っ端がなることは余りないので、
下っ端は言語選択に悩むことはないのだ。
せいぜいパッチ(patch)やバッチ(batch)のスクリプト言語どうしよかぁ位よね。

学生だったらテストに出る奴やっとけばええんやで(´・ω・`)
え?働く前に予習しときたい?
遊べるときには遊んどこうよ(´・ω・`)

とか言ってたら話が終わってしまうので、敢えて勉強するなら前述のスクリプト言語をやっとくといい。
中でも個人的に推したいのはシェル(bash, zsh)かPerlだ。
えー人気言語ランキングにも出てこないレガシーうんこじゃーん。
てか、そいつらを言語っていうのも憚られるよね、だっさーい。
…とか思われるかもしれないけど、結局本格的な言語の起動スクリプトとして使ったり、
前述のパッチやバッチを作ったり、自分用の便利ツール作ったりと実作業よりちょっと外の作業でも
活躍するのですよ。
特にPerlなんかは文字列操作がめちゃくそ便利なので上手く使うと仕事が捗るのです(´・ω・`)
(ただワンライナーとかやりだすとゲテモノPGが出来上がるから注意ね)

パッチ(patch)の例だとシェルからPL/SQLに連携して、クソデータをささっと潰せるとかっこE。
きっとモテモテ間違いなし。上司のおっさんから。

え?決まった仕事がオープン系やWeb系でLinux処理系なんて使わない?
ハハ、そいつぁ参ったな(´・ω・`)
やっぱ無駄な勉強はやめて遊べるときは遊んどこうぜ!


【追記】
Web系で思い出したけどJavaScriptもいいよなぁ。。。

コメント(0) 
共通テーマ:資格・学び

【C】 とりあえず開発環境を [C言語]

ソネブロじゃソースコード書けねぇよクソが…的なことを前書いた気がするけど
リッチテキストモードなら書けるようだ。
馬鹿にしてごめんな。むしろ私が馬鹿だったよ(´・ω・`)
以前の記事も気が向いたら書き直そうかな。でもJavaの記憶も薄れつつあるからな!(悲しい)
【追記】
結局、リッチテキストモードも面倒臭かったので、
他のblogを参考にノーマルモードでpreタグ使って編集することにした。

とりあえず家のPCでもCの開発環境を作ることにした。
いつでも勉強できるぞ!!
…まぁ面倒臭がりな私は環境作ったら満足して終わるんだけどな!

さてセットアップの方法ですが、「モダンC言語プログラミング」ではわざわざXubuntu(マニアックな…)を
VirtualBox上で動かして、その上でEclipseを使っていましたが、
今のご時勢MinGWという便利なものがあるのでそこまでやる必要はない…と思う。
仮想環境だとやっぱりちょっと動作が重いし、コピペも面倒だし(出来ないことはないけどちょっと面倒)で、
やはり直接Windows上に作るほうが良かろう。
Torrentみたいなp2pを今時使うのもアレだしね。

細かいセットアップはググれば出てくるので、ここでは書かない。(何の為の記事だこれ)
MinGWは「developer-toolkit」「base」「msys-base」「g++」が入ってればOKだと思う。
実際のCコンパイラ(C++も兼用かな)はg++でmsysはmakefile等のビルドツールやdiff等の基本コマンドが入っているようだ。
toolkitとbaseは良く分からんがまぁベースなんだろう。(ぉぃ)
という訳で「MinGW\bin」と「MinGW\msys\1.0\bin」の両方ともパスを通しておく必要があるぞ。

後はEclipseのC/C++を展開するだけの簡単な作業。
日本語にしたいならPleiadesも突っ込む。
私はマニアなのでAll in Oneは使わないけど(重いの嫌い)、楽したいときはAll in Oneが良いでしょう。
Eclipseの公式サイトもクソ分かり難い事だしな!

早速簡単なプログラムを書いてみたけど、Eclipseがエラーで落ちたりしてヤバい。
いや、単にコーディングをミスってただけだけど(笑)
いやぁ、簡単にメモリぶっ壊して変な落ち方してくれるんだなぁ。流石C言語だぜ。
この面倒くささよ。。。
コメント(0) 
共通テーマ:資格・学び

【C】 C言語やることになったでござる… [C言語]

たまにはこちらの記事も投下しとかなきゃ(使命感)←無いです
と言ってもタイトルで完結しているのですが(笑)

新しいお仕事はC言語がメインのお仕事になりました。
通信系なのでとにかく速さ命のようです。となると確かにCになりますわな。

でもC言語は読んだことは有るけど書いたことは殆どない(´・ω・`)
という訳でまずは入門書を漁ってみたのでその感想でも。

■苦しんで覚えるC言語
https://9cguide.appspot.com/
こちらのサイトをそのまま書籍化した本ですね。
内容的にはC言語入門ですが、読む程度は出来る = ある程度知識はある訳で
タイトル的にもうちょっと中級な内容に踏み込んでるかな?
と思っていたらそんなことは無かったでござる。
という訳でわざわざ書籍を買う必要もなかったかな…と
ちゃんと調べてから買えよ!!(笑)

まぁ私には不要でしたが、
これからC言語を始めよう+敢えて紙で欲しいって方にはかなり良い書籍なのではないかと思います。
うざい位細かく説明してくれてるからね。


■プログラミング言語C 第二版
C言語の鉄板テキスト(笑)
昔買った記憶がうっすら有るけど引越しで技術本全部捨てたので再?購入。
訳が若干キツイところが有るけどEffective Javaとかプログラミング言語Javaとかに比べたら
全然読めるレベル。(※)
こちらも入門的な内容がメインだが4章以降でディープな内容にも踏み込むし、
やや言語記法等に今ではNGとされているような古い表現が見られたりするので、
読む方にもそれなりのレベルが要求される。
一通り学んでちょっとした実務をこなした後に復習用として読むといいと思う。


Effective Java、プログラミング言語Javaは内容的には素晴らしいのにクソ翻訳で台無しになって最悪ですね。
ちなみに翻訳の人はSo-netブログやっててビックリしましたね。
それでも敢えて言わせて貰おう。クソ翻訳であると。
こんなんで金とんなやボケが…と声を大にして言いたい。


■新・明解 C言語 実践編
実はまだあんまり読めていない(笑)
ある程度踏み込んだ情報が欲しくて購入した。
内容的には主にQA形式が取られているようで、私の要求を満たしてくれそうである。
とにかくCによる中~大規模プログラミングの経験が無いので
特に6章の関数の定義と宣言、11章のライブラリの開発辺りが役に立つのではと思って購入した次第。


■モダンC言語プログラミング
レガシーな言語であるCをIDE等を上手く活用してモダンにしましょう的な内容。
なかなか目の付け所が良いと思います。そういう応用情報こそ欲している訳です。
まぁC言語でオブジェクト指向とか無理があるのでこの辺は読み飛ばしが確定していますが(笑)
IDE、自動テスト、CIサーバ辺りはかなり興味深い。
Javaでやってんだから分かるだろ!という弁もあるかと思うが、
こうやってC言語での例が目に見える形であるというのはやはり良いものかと思うのですよ。
仮にもっといい方法があるとしても、その為の気付き源になるわけですし。


てな感じで今はプログラミング言語C 第二版をメインに読み込んでいます。
言語仕様の再確認的なね。
型がどうだの、制御文がどうだのは幾らでもWebに転がってるからどうでもいいんですけど、
問題はその先ですよね。
関数の組み合わせ方やら何やらのちょっと大きい視点での情報が欲しいんですが、
そういうのはなかなか転がってないんだよなぁ。
(この辺はどの言語でも同じですが)

ただ、エラーやバグ情報等の「つまずき」に関してはStack Over Flow等のサイトのお陰で大分良くなりましたね。
凄く役に立ちます。
コメント(0) 
共通テーマ:資格・学び

【Java】 Stream API 勉強中 (補足) [Java]

> entryArchiveのところで例外食いつぶしてますが、もちろんワザとです。

試しに例外をthrow(s)するようにしたところ、コンパイルが通らないことが判明。
いつもの「キャッチしろよクソボケが!」と怒られちゃう。
あぁ、forEachが例外に対してなーんもしてくれないからかな?

色んなブログなんかを舐め回したところentryArchiveをブロックで囲んでtry-catchしないとイケナイらしい。
うっは、これは面倒くさいし、見難いし醜い。
もしくはRuntimeExceptionに包むしかないと。

まぁでもファイル出力をStreamに噛ますのが邪道なのかもしれないしなぁ。
副作用だか何だかで。
てかIOと副作用の関係性も謎だけど。(近いうちに真面目に調べよう。。。)
あとまぁ例外をcatchせなならんことがどれ位有るかって話よなぁ。
(個人的に)例外は極力避ける方針だからまぁ余り問題は出ないとは思うけれども。

C言語なんかは例外無い訳だから戻り値で頑張ろうと思えば出来るんでしょうし、
「例外っていらなくね?」って論に転じるのも有りか?
(いや、APIが例外指向になっちゃってる時点で無いな…)
コメント(0) 
共通テーマ:資格・学び

【Java】 Stream API 勉強中 (ソース) [Java]

package application;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class FileManager {
    
    private static final Logger log = LogManager.getLogger(FileManager.class);
    private Path rootpath;
    
    public static void main(String[] args) {
        
        Path filepath = Paths.get("E:/RootDir");
        FileManager fmanager = new FileManager(filepath);
        
        Path zippath = Paths.get("E:/DestDir/save.zip");
        String[] subdirs = {"subdir1", "subdir2"};
        
        fmanager.packageOut(subdirs, zippath);
    }
    
    public FileManager(Path path) {
        rootpath = path;
    }
    
    
    public void packageOut(String[] subdirs, Path zippath) {
        
        Path[] targets = Arrays.stream(subdirs).map(subdir -> rootpath.resolve(subdir)).toArray(Path[]::new);
        Predicate<Path> selecter = path -> Arrays.stream(targets).anyMatch(target -> path.startsWith(target));
        
        try (
            Stream<Path> stream = Files.walk(rootpath);
            ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(Files.newOutputStream(zippath)));
        ) {
            stream.filter(Files::isRegularFile).filter(selecter::test).forEach(path -> entryArchive(zos, path));
        } catch(IOException e) {
            log.error("圧縮に失敗しました。");
            throw new Error(e);
        }
    }
    
    
    private void entryArchive(ZipOutputStream zos, Path target) {
        
        String entryName = rootpath.relativize(target).toString();
        ZipEntry entry = new ZipEntry(entryName);
        
        try (BufferedInputStream is = new BufferedInputStream(Files.newInputStream(target));) {
            
            zos.putNextEntry(entry);
            
            byte[] buf = new byte[1024];
            int len = 0;
            
            while ((len = is.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }
            
            zos.closeEntry();
            
        } catch (IOException e) {
            log.error("エントリ[{}]の圧縮に失敗しました。", entryName);
            e.printStackTrace();
        }
    }
}

コメント(0) 
共通テーマ:資格・学び
前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。