並び順

ブックマーク数

期間指定

  • から
  • まで

1 - 32 件 / 32件

新着順 人気順

python sys stdin fileの検索結果1 - 32 件 / 32件

  • シェルスクリプトとの対比で理解するPythonのsubprocess - 朝日ネット 技術者ブログ

    はじめに 開発部の ikasat です。 皆さんは git, ssh, rsync のような外部コマンドを呼び出すスクリプトを書きたくなったことはありますか? 個人的にこの類のスクリプトは最初はシェルスクリプトとして書くのですが、改修を重ねるうちに肥大化して処理も複雑になり、 後から Python のような汎用プログラミング言語で書き直すことがよくあります。 外部コマンド呼び出しを書き直す際に、Git 操作のために pygit2、 SSH 接続のために paramiko のようなライブラリをわざわざ使うのは大がかりだったり、 rsync に相当するようなこなれたライブラリが存在しなかったりする場合があります。 そのような時は標準ライブラリの subprocess モジュールを利用し、Python から外部コマンドを呼び出すことになるでしょう。 しかしながら、Python のチュートリアルペ

      シェルスクリプトとの対比で理解するPythonのsubprocess - 朝日ネット 技術者ブログ
    • 【2020年】CTF Web問題の攻撃手法まとめ - こんとろーるしーこんとろーるぶい

      はじめに 対象イベント 読み方、使い方 Remote Code Execution(RCE) 親ディレクトリ指定によるopen_basedirのバイパス PHP-FPMのTCPソケット接続によるopen_basedirとdisable_functionsのバイパス JavaのRuntime.execでシェルを実行 Cross-Site Scripting(XSS) nginx環境でHTTPステータスコードが操作できる場合にCSPヘッダーを無効化 GoogleのClosureLibraryサニタイザーのXSS脆弱性 WebのProxy機能を介したService Workerの登録 括弧を使わないXSS /記号を使用せずに遷移先URLを指定 SOME(Same Origin Method Execution)を利用してdocument.writeを順次実行 SQL Injection MySQ

        【2020年】CTF Web問題の攻撃手法まとめ - こんとろーるしーこんとろーるぶい
      • Webサーバの仕組みについて入門してみた(Python実装) - iimon TECH BLOG

        はじめに 株式会社iimonでSREエンジニアをしているhogeです。 本記事はiimonアドベントカレンダー9日目の記事となります。 今回の記事は技術的な棚卸しとして、普段大変お世話になっているWebサーバがどういった仕組みで動いているのかを実装しながら深堀りしていこうと思います。 弊社のバックエンドはDjango/FastAPI + Gunicornの構成で動作しているため、Pythonを絡めた説明が多くなるかと思います。サンプルコードもPythonで実装をしています。 途中、システムコールやファイルディスクリプタなどにも踏み込んだ話をするのですが、低レベルなプログラミングをちゃんとやったことがないため、間違えている部分があるかもしれません。今後学習して行く中で気づいたら都度修正していきたいと思います。 環境・使用ツール 言語 Python OS Ubuntu(Linuxのシステムコー

          Webサーバの仕組みについて入門してみた(Python実装) - iimon TECH BLOG
        • Pythonプロジェクトでflat layoutではなくsrc layoutが推奨される理由を理解する - 肉球でキーボード

          本文中コード github.com flat layoutとsrc layoutについて Pythonプロジェクトのディレクトリ構成について調べてたところ、flat layoutとsrc layoutという2種類のディレクトリ構成が存在することを知りました。 src レイアウト対フラットレイアウト - Python Packaging User Guide flat layout flat layoutはパッケージフォルダをプロジェクトのルート直下に配置するスタイルです。 flat layoutの有名なpythonプロジェクトだと、 pytorch, django, tensorflow があります。 . ├── README.md ├── pyproject.toml └── my_package/ ├── __init__.py └── module.py src layout 一方、

            Pythonプロジェクトでflat layoutではなくsrc layoutが推奨される理由を理解する - 肉球でキーボード
          • Building a tiny Linux from scratch

            Last week, I built a tiny Linux system from scratch, and booted it on my laptop! Here’s what it looked like: Let me tell you how I got there. I wanted to learn more about how the Linux kernel works, and what’s involved in booting it. So I set myself the goal to cobble together the bare neccessities required to boot into a working shell. In the end, I had a tiny Linux system with a size of 2.5 MB,

              Building a tiny Linux from scratch
            • Claude Code / CursorのHooksで実装した AIエージェントの3層プロンプトインジェクション対策 - 弁護士ドットコム株式会社 Creators’ blog

              Claude Code / Cursor の Hooks で実装した AI エージェントの 3 層プロンプトインジェクション対策 こんにちは、クラウドサインで CRE をしている藤谷です。 CRE は「Customer Reliability Engineering」の略で、お客様やビジネス部門で発生した課題をエンジニアリングで解決する役割を担います。 私たちのチームでは顧客理解を加速させるため、AI エージェントを業務に積極的に活用しています。 2026 年 1 月の Cursor 2.4 で Skills 機能が追加されたのをきっかけに、Hooks(以下フック)を使ったプロンプトインジェクション対策を設計・実装しました。 LLM に「気をつけて」と指示するのではなく、LLM の外側にある実行境界で止める。この考えのもと、Python でフックスクリプトを実装しました。 この記事では、全

                Claude Code / CursorのHooksで実装した AIエージェントの3層プロンプトインジェクション対策 - 弁護士ドットコム株式会社 Creators’ blog
              • コンテナランタイムを自作した - zebian.log

                コンテナの仕組みを勉強したかったため、Goでコンテナランタイムを自作した。雑実装だし未実装の機能もたくさんあるが、ある程度形になってきたため現状をまとめる。 リポジトリ github.com kombu/dashi - 自作コンテナランタイム kombu/nimono - eBPFを利用したシステムコールロガー kombu/yaminabe - dashiとnimonoを利用したマルウェアサンドボックス プロジェクト名から和の雰囲気を感じるが、これはリポジトリ名をkombu(昆布)にしたかったため、せっかくなら今回は和風で固めようと思ったから。趣があっていいんじゃないでしょうか。 dashiが自作コンテナランタイムだが、nimonoとyaminabeは実験的な要素で、セキュキャン2023でコンテナを使ったマルウェアサンドボックスを実装した経験があり、今回はその再実装を自作コンテナランタイム

                  コンテナランタイムを自作した - zebian.log
                • Claude Code で git-grep を使うと幸せになれる、かもしれない

                  私たちのチームでは 6 月から全面的に Claude Code を使った開発をスタートしています。 本記事では筆者が 2 ヶ月間 Claude Code を触りながら行き着いた、シンプルながら効果的な git-grep の使い方を紹介します この記事で書くこと Claude Code で git-grep を活用する例 (おまけ)新しいフックを追加するときの Tips この記事で書かないこと フック定義(python コード)の解説 Claude Code やフックの説明 git-grep を PreToolUse フックで使う いきなり結論ですが、PreToolUse フックで Grep ツールの呼び出しを禁じ、 git grep --function-contextを強制するフック を定義しています。 もちろん Bash ツールで grep を使ったコンテンツ検索も禁じています。rip

                    Claude Code で git-grep を使うと幸せになれる、かもしれない
                  • Writing a C compiler in 500 lines of Python

                    A few months ago, I set myself the challenge of writing a C compiler in 500 lines of Python1, after writing my SDF donut post. How hard could it be? The answer was, pretty hard, even when dropping quite a few features. But it was also pretty interesting, and the result is surprisingly functional and not too hard to understand! There's too much code for me to comprehensively cover in a single blog

                    • 複数の AWS アカウントの AWS Security Hub 検出結果を Google BigQuery と Google DataPortal(DataStudio) により可視化した話 - Adwaysエンジニアブログ

                      こんにちは、インフラの天津です。今日は 複数アカウントの AWS Security Hub 検出結果の可視化についてお話したいと思います。 前提 モチベーション AWS Security Hub とは 構想 ツール・サービスの選定 検出結果データのエクスポートについて 可視化用データベース(またはクエリサービス)と可視化ツールについて 構築 全体像 検出結果データエクスポート 検出結果データの S3 -> GCS への転送と BigQuery へのインポート Security Hub からエクスポートしたデータには BigQuery のカラム名に使用できない文字(以下禁則文字)が使用されている件 自動判別で生成されたスキーマでインポートした際に INTEGER 型のカラムに STRING 型のデータが入ってくることがありインポートエラーが発生する件 AWS アカウントデータの S3 ->

                        複数の AWS アカウントの AWS Security Hub 検出結果を Google BigQuery と Google DataPortal(DataStudio) により可視化した話 - Adwaysエンジニアブログ
                      • 缶つぶし機とソフトウェア移行技術 - Refactoring to Rust の読書感想文 - じゃあ、おうちで学べる

                        はじめに ——あるいは、「知っている」と「理解している」の間 Rustのことは、知っていた。学習もしていた。実務でも使っていた。 でも、それは知っているつもりだった。 知ってるつもり 無知の科学 (ハヤカワ文庫NF) 作者:スティーブン スローマン,フィリップ ファーンバック早川書房Amazon 日々Rustで開発し、BoxとRcとArcを使い分け、tokio::spawnでタスクを生成し、?演算子を当たり前のように書いている。FFI?PyO3使えばいいでしょ。WebAssembly?wasm-bindgenがあるじゃない。技術的には、確かに「使える」レベルにはあった。 でも、心のどこかで感じていた違和感があった。 オートバイのエンジンを分解できる人と、エンジンが動く原理を理解している人は違う。コードが動くことと、なぜそう書くべきかを理解することも違う。私は前者だった。メカニックではあった

                          缶つぶし機とソフトウェア移行技術 - Refactoring to Rust の読書感想文 - じゃあ、おうちで学べる
                        • しくじり先生のように学ぶ「NFS+sqliteで苦労した話から学ぶ、問題解決の考え方」という勉強会をやってみました | Raccoon Tech Blog [株式会社ラクーンホールディングス 技術戦略部ブログ]

                          株式会社ラクーンホールディングスのエンジニア/デザイナーから技術情報をはじめ、世の中のためになることや社内のことなどを発信してます。 インフラLinux勉強会SQLiteNFS こんにちは、羽山です。 今回は社内で実施した勉強会をほぼそのままブログ記事にしています。 ITエンジニアたるものドキュメントを残したり勉強会を実施したり分かりやすい設計にリファクタリングしたりなど、日々 知見の伝達 を意識していると思います。主要な知見はたいていそれらの方法で満たせるのですが、しかし残念ながら中には画一的な方法では伝えにくいものもあったりします。 ところで伝統芸能や工芸の世界では技術の継承において 背中を見て学ぶ という方法が用いられることがあるようです。 これと似た手法はITエンジニアの世界にもあって、先輩エンジニアとペアプログラミングをすることで文書では伝わりにくい技術や考え方・テクニックを学ぶ

                            しくじり先生のように学ぶ「NFS+sqliteで苦労した話から学ぶ、問題解決の考え方」という勉強会をやってみました | Raccoon Tech Blog [株式会社ラクーンホールディングス 技術戦略部ブログ]
                          • Building a Toy Programming Language in Python

                            I thought it would be fun to go outside of my comfort zone of web development topics and write about something completely different and new, something I have never written about before. So today, I'm going to show you how to implement a programming language! The project will parse and execute programs written in a simple language I called my (I know it's a lame name, but hey, it is "my" language).

                              Building a Toy Programming Language in Python
                            • Fridaを用いてマルウェアの動作を解析・変更する - NTT docomo Business Engineers' Blog

                              この記事は NTTコミュニケーションズ Advent Calendar 2021 の19日目の記事です。 はじめに こんにちは。イノベーションセンターテクノロジー部門の田中と申します。インターネットにおける攻撃インフラ撲滅に向けた追跡活動を主に行っています。例えば、追跡中のIPアドレスは真に該当マルウェアのC2であるか、現在も活動中であるか等をOSINTを活用して精度を上げて特定していくのですが、さらに情報が必要になるケースがあります。その際に、有力な技術の1つになるのが、マルウェアやC2に与える情報を制御し、挙動の差異を観測するという手法です。本記事では、Fridaというツールを利用して、解析・変更の初歩の部分について行ってみたいと思います。 概要 前半は、準備としてAPI Monitorというツールを用い、APIコールをトレースし、マルウェアの挙動を簡単に把握します。後半は、動的バイナ

                                Fridaを用いてマルウェアの動作を解析・変更する - NTT docomo Business Engineers' Blog
                              • 0.10.0 Release Notes ⚡ The Zig Programming Language

                                Tier 4 Support § Support for these targets is entirely experimental. If this target is provided by LLVM, LLVM may have the target as an experimental target, which means that you need to use Zig-provided binaries for the target to be available, or build LLVM from source with special configure flags. zig targets will display the target if it is available. This target may be considered deprecated by

                                • Introducing the new Wasmer JS SDK · Blog · Wasmer

                                  Introducing the new Wasmer JS SDKToday we are incredibly excited to present `@wasmer/sdk`, a new library that allows running WASI(X) applications easily on the browser Dive into a world where running any WASI and WASIX package in your browser is a breeze. Whether it's Python, Bash, FFmpeg, or any package published in the registry, Wasmer Javascript SDK makes it all seamlessly possible. We think th

                                    Introducing the new Wasmer JS SDK · Blog · Wasmer
                                  • カスタムコンテナイメージを用いたデータ分析環境共通化Tips(ローカルPC&AWS SageMaker Studio) - コネヒト開発者ブログ

                                    みなさんこんにちは。たかぱい(@takapy0210)です。 気づけばもう6月ですね。2021年の半分が過ぎようとしています。もう半分.....もう...。 はじめに みなさんデータ分析環境はどのように構築していますか? Gunosyさんのブログ*1にもあるように、環境構築方法は様々あると思います。 本エントリでは、ローカルとクラウド(AWS SageMaker Studio)のデータ分析環境をコンテナで構築し、環境差分の無い快適なデータ分析ライフを過ごすTipsについてご紹介しようと思います。 これにより軽量な分析はローカル環境でサクッと、重めの分析はクラウド環境(AWS SageMaker Studio)で強いコンピューティングリソースを用いてじっくりとやる、といったことを環境差分を気にせず行うことができます。 ちなみに、ローカルで起動する際はdocker compose up -d

                                      カスタムコンテナイメージを用いたデータ分析環境共通化Tips(ローカルPC&AWS SageMaker Studio) - コネヒト開発者ブログ
                                    • EC2インスタンスのユーザーデータ内のdnfコマンドやyumコマンドが失敗する場合の緩和策を考えてみた | DevelopersIO

                                      ユーザーデータでパッケージのインストールをしようとすると失敗するんだが こんにちは、のんピ(@non____97)です。 皆さんはEC2インスタンスのユーザーデータでdnfコマンドやyumコマンドが失敗したことはありますか? 私はあります。 具体的にはユーザーデータでdnf upgradeやdnf install パッケージ名を実行すると、以下のようにRPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)とログが出力されます。 $ dnf upgrade -y --releasever=latest Amazon Linux 2023 repository 30 MB/s | 23 MB 00:00 Amazon Linux 2023 Ker

                                        EC2インスタンスのユーザーデータ内のdnfコマンドやyumコマンドが失敗する場合の緩和策を考えてみた | DevelopersIO
                                      • Python の open 関数と io モジュールをきちんと使うために - 朝日ネット 技術者ブログ

                                        はじめに 開発部の ikasat です。 Python の言語・ライブラリ・処理系はプログラマのタスクを手早く簡単にこなせるようにするために設計されており、数行程度のコードを書いただけでも内部で様々なことをやってくれます。 しかし、この便利さが特定のユースケースにおいては逆にお節介になってしまうこともあり、また内部動作が複雑であることにより挙動を修正する方法も分からなくなりがちです。 特に組み込みの open 関数や標準入出力 (sys.stdin, sys.stdout) はその最たる例であり、UnicodeEncodeError / UnicodeDecodeError や TypeError: a bytes-like object is required は Python を使った人であれば誰もが見たことのあるエラーメッセージでしょう。 私自身これまでこの類のエラーが出た時には検索

                                          Python の open 関数と io モジュールをきちんと使うために - 朝日ネット 技術者ブログ
                                        • Linuxのuniqコマンドに相当するコードをPythonで実装してみた - Qiita

                                          import sys def uniq(f): previous_line = "" for line in f.readlines(): if previous_line == line: continue print(line, end="") previous_line = line def uniq_c(f): previous_line = "" count = 1 for line in f.readlines(): if previous_line == "": previous_line = line continue if previous_line == line: count += 1 continue print("{} {}".format(count, previous_line), end="") previous_line = line count = 1

                                            Linuxのuniqコマンドに相当するコードをPythonで実装してみた - Qiita
                                          • Python behind the scenes #11: how the Python import system works

                                            If you ask me to name the most misunderstood aspect of Python, I will answer without a second thought: the Python import system. Just remember how many times you used relative imports and got something like ImportError: attempted relative import with no known parent package; or tried to figure out how to structure a project so that all the imports work correctly; or hacked sys.path when you couldn

                                            • Making a micro Linux distro

                                              Follow @popovicu94 In this article, we’ll talk about building up a tiny (micro) Linux “distribution” from scratch. This distribution really won’t do much, but it will be built from scratch. We will build the Linux kernel on our own, and write some software to package our micro-distro. Lastly, we are doing this example on the RISC-V architecture, specifically QEMU’s riscv64 virt machine. There’s ve

                                                Making a micro Linux distro
                                              • はじめての自然言語処理 Transformer 系モデルの推論高速化の検証 | オブジェクトの広場

                                                今回は Transformer 系のモデル、具体的には BERT, T5, GPT の推論を高速化してみます。高速化手法として FasterTransformer, Torch-TensorRT, AWS Neuron を用い、素 の transfomers に比べ、どの程度速くなるか(ならないか)、利点・欠点を確認してみましょう。 1. はじめに 今回は Transformer 系のモデル、具体的には BERT, T5, GPT の推論を様々な技術を使って高速化してみます。 高速化の元ネタは Hugging Face の transformers1 縛りとして、素の transformers で推論する場合に比べ、 どの程度速くなるか(ならないか)見てみましょう。 推論を高速化する技術としては FasterTransfomer2, Torch-TensorRT3, AWS Neuron(

                                                  はじめての自然言語処理 Transformer 系モデルの推論高速化の検証 | オブジェクトの広場
                                                • Large Text Compression Benchmark

                                                   Large Text Compression Benchmark Matt Mahoney Last update: Mar. 25, 2026. history This competition ranks lossless data compression programs by the compressed size (including the size of the decompression program) of the first 109 bytes of the XML text dump of the English version of Wikipedia on Mar. 3, 2006. About the test data. The goal of this benchmark is not to find the best overall compress

                                                  • はじめての自然言語処理 ByT5 と Charformer の検証 | オブジェクトの広場

                                                    トークナイザを使わない自然言語処理モデルである ByT5 と Charformer のご紹介です。従来の自然言語処理では多くの場合で文章を単語(あるいはサブワード)単位に分かち書きして処理しましたが、今回のモデルは直接、生のテキストを処理します。それでは実際に動かして単語(サブワード)ベースのモデルと比較してみましょう。 1. はじめに 今回は今年5月と6月に発表された ByT51 と Charformer2 の紹介をしたいと思います。一本の記事で 2 つのモデルを扱うのは、この連載では珍しいのですが、この二つはよく似ているというか、Charformer は 「ByT5 にもう一工夫加えたもの」くらいの認識なので、一度にさばいてしまいましょうということで。 さて、この二つのモデルの特徴ですが「分かち書きをしない」という点に尽きます。 今まで、この連載では BERT や T5 等の Tran

                                                      はじめての自然言語処理 ByT5 と Charformer の検証 | オブジェクトの広場
                                                    • Flipping Pages: An analysis of a new Linux vulnerability in nf_tables and hardened exploitation techniques

                                                      This blogpost is the next instalment of my series of hands-on no-boilerplate vulnerability research blogposts, intended for time-travellers in the future who want to do Linux kernel vulnerability research. Specifically, I hope beginners will learn from my VR workflow and the seasoned researchers will learn from my techniques. In this blogpost, I'm discussing a bug I found in nf_tables in the Linux

                                                      • DeepL APIをコマンドラインで使用する(Mac) - Qiita

                                                        これは何 標準入力もしくはテキストファイルと翻訳したい言語を指定して、DeepLによる翻訳結果を標準出力に出力するコマンドラインツールです。 DeepL APIを使用しており、Pythonで書いています。 当方の環境 Darwin monju.local 21.1.0 Darwin Kernel Version 21.1.0: Wed Oct 13 17:33:23 PDT 2021; root:xnu-8019.41.5~1/RELEASE_X86_64 x86_64 Python 3.9.1 MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports) 準備 DeepL APIに登録 手順どおりに登録すると、auth_keyを手に入れることができます。 deeplのインストール PyPIにあります。詳細は、ドキュメントをお読みください。 #

                                                          DeepL APIをコマンドラインで使用する(Mac) - Qiita
                                                        • XML/HTMLに対してjq的な使い方ができるxq、xq-python、htmlqを試す - CLOVER🍀

                                                          これは、なにをしたくて書いたもの? 最近、特定のファイルフォーマットに対するjqの代替みたいなものを書いているのですが、あともうひとつだけ書いて終わりに しようかなと。 Markdownに対してjq的な使い方ができるmdq、mqを試す - CLOVER🍀 YAMLに対してjq的な使い方ができるyq(2種類)を試す - CLOVER🍀 メモとしてここまで書いてきてしまったので、ひとまずこのフォーマットまでやってしまいましょうと。 最後はXML/HTMLです。ざっと調べてみたところ、xq、xq-python、htmlqあたりがよいのかなと思ったのでメモしておきます。 xq xqは、XML/HTMLに対してフォーマットおよびコンテンツの抽出ができるCLIです。 GitHub - sibprogrammer/xq: Command-line XML and HTML beautifier an

                                                            XML/HTMLに対してjq的な使い方ができるxq、xq-python、htmlqを試す - CLOVER🍀
                                                          • JupyterLab Changelog — JupyterLab 4.6.0a1 documentation

                                                            JupyterLab Changelog# v4.5# JupyterLab 4.5 includes a number of new features (described below), bug fixes, and enhancements. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are encouraged to consult the Extension Migration Guide which lists deprecations and changes to the public API. Performance and windowing# The default windowing mode is now contentVisibil

                                                            • Gemini CLIのhooksで会話履歴をObsidianの保管庫に自動保存してみた | iret.media

                                                              目次1.はじめに 2.hooksについて 3.hooksで使うPythonスクリプトについて 4.hooksを動かしてみた 5.おわりに 1.はじめにAI ツールを日常的に使用している中で、会話履歴を振り返りたい場面がないでしょうか。 AI とのやりとりですが、デフォルト状態では手軽に保存、参照するのは難しいかと思います。 そこで本ブログでは Gemini CLI の hooks 機能を使って、Obsidian の保管庫に AI とのやりとりを自動的に保存する方法を紹介します。 環境情報 macOS:Tahoe 26.3.1 Node.js のバージョン( node --version ):24.11.1 Gemini CLI のバージョン( gemini --version ):0.36.0 Obsidian のバージョン:1.12.7 2.hooksについてhooks とは Gemin

                                                                Gemini CLIのhooksで会話履歴をObsidianの保管庫に自動保存してみた | iret.media
                                                              • zsh のあの記号 (チートシート) - blog.livewing.net

                                                                シェルやシェルスクリプトを使っていて「この記号なんだこれ」ってなったときに見る記事です。記号について調べたくてもググラビリティが低くて検索できないので、まとめました。正直 man ページ見れば全部分かるんだけどね 筆者は zsh (zsh 5.8) を使っているので基本的に zsh についてまとめていますが、 bash など他のシェルで使用できるものもあります。 POSIX sh では使えないものが結構多いので注意してください (#!/bin/sh って書いているそこのあなたですよ) 。 コマンドの表記法 いきなりシェルとは関係無いことですが、必ず目にするものですのであらかじめ解説します。 よく「このコマンドを実行します」と書いてある記事では、行頭に $ や # が書いてあります。 $ yes 高須クリニック # dd if=/dev/urandom of=/dev/sda (これらのコマ

                                                                  zsh のあの記号 (チートシート) - blog.livewing.net
                                                                • 500 Python Interpreters

                                                                  🐍 No Steppy On Threads 🐍August 19, 202417 minutes As we approach the final release date for Python 3.13, I’ve seen an uptick in discussion regarding 3.13’s introduction of an optional GIL. While removing the GIL has been a long time coming for the average user (I’ve dreamt of this for nearly 20 years), there have actually been two concurrent efforts to improve Python’s performance for multithrea

                                                                    500 Python Interpreters
                                                                  1