text:
A fine work of imperial provenance, which is not recorded in the imperial catalogue, is Landscape, a refined, lyrical painting in hanging scroll format in the collection of the Seattle Art Museum.
To elucidate this important work, first we will take a look at how contemporaries and later writers described Wen Boren (1501-1575) and his work. Then we will examine the Seattle painting and compare it to other Ming Wu school works, especially related paintings by Wen Boren's celebrated uncle, Wen Zhengming 文徵明 (1470–1559), and discuss which places Wen Boren depicts and compare it to other paintings of these same locations. Finally, before we conclude, we will discuss the seals on the painting.
First, how do contemporaries portray the life and works of Wen Boren?
Wang Shizhen王世貞 (1526–1590) praises Wen Boren's works of art as follows:
"Wen Daizhao's [Expectant Official, Wen Zhengming] nephew was Boren; when he was young he studied with Wen Zhengming, often demonstrating brilliance. His handscrolls and large hanging scrolls were reputed to surpass [Wen Zhengming's work]. In his later years he has had the leisure to enter a life of contemplation, and his reputation has diminished little since. 文待詔猶子伯仁,少傳家學,而時時發以巧思,橫披大幅頗負出藍之聲。晚節自足間入紕路,聲亦小減。"Wang Shizhen王世貞, Yanzhou sibu gao 弇州四部稿, in SKQS, 155.21.
On the other hand, Wang Shizhen also criticized him: "This chap used foul language and tended to verbally abuse those around him. 此君穢而好罵座。"Yanzhou sibu gao, 170.6.
In addition, in the preface to Jinling suo shi 金陵瑣事, dated to the middle of the third month of 1610, Zhou Hui周暉writes two passages about Wen Boren:
"Wen Boren was the nephew of Hengshan (Wen Zhengming) and his reputation was no less than Wen Zhengming's. He tended to abuse those around him; most people could not endure him. Once when he was staying for some years in the Bailuquan Hall of Qixia Temple, a man by the name of Xufrom Dongshan politely invited Boren to come to the waterside pavilion at his home to paint. The pavilion overlooked Lake Tai. When host and guest were chatting and disagreed over a minor point, Boren, raising his fist, cursed his host violently. Xu did not bear it in silence for long, saying, 'Wen Boren, you dare to act in such a rude manner in my house! If I were to toss you into Lake Tai, who would know?' He immediately called his servants to come and tie him up. Boren, not anticipating this, prostrated himself, asking to be forgiven. Xu got out of his seat, and, towering over him, made an account of his failings while scolding him. Boren submitted to this to avoid being turned into fish bait. 文伯仁衡山之猶子,畫名不在衡山下。好使氣罵坐,人多不能堪。客棲霞寺白鹿泉庵中數年,有東山徐姓者,禮請伯仁至家水閣上作畫,水閣即臨太湖,賓主相談微有不合,伯仁遂掀拳大罵,徐隱忍不過,乃曰:『文伯仁在我家敢如此無狀,今投於爾于太湖,誰得知之。』急呼家僮數人來縛。伯仁計無所出,長跪求免。徐據上座,以大石壓頂,歷數其生平而唾罵之。伯仁唯唯而已,乃免為魚鱉餌。" Zhou Hui, Jinling suo shi金陵瑣事, SKQS, 256. Editor's note: See also Alice M. Hyland, The Literati Vision: Sixteenth Century Wu School Painting and Calligraphy ( Memphis: Memphis Brooks Museum of Art, 1984), 62.
The line "Once when he was staying for some years in the Bailuquan Hall of Qixia Temple for some years" refers to when Wen Boren was living at the Qixia shan (Mt. Qixia), which he depicts in a work in the National Palace Museum, Taipei, titled Bailuquan Hermitage at Mt. She (She shan Bailuquan an 攝山白鹿泉庵).Translator's note: for published information see: Guoli gugong bowu yuan國立故宮博物院, Gu gong shu hua tu lu故宮書畫圖錄 (Taibei: Guoli gugong bowu yuan, 1989), 169.
Zhou Hui also writes:
"When Wen Boren was young, he had a legal dispute with his uncle Wen Zhengming. He was put in prison where he became very sick. One night he dreamt that a spirit in a golden robe called to him saying, 'You have nothing to be concerned about. In a former life, you were a student of Jiang Zicheng (active early 15th century). You must paint a large portrait of Guanyin, but before lifting your brush, you must purify yourself by fasting. Having accumulated merit, you will become famous for your painting in this lifetime.' When he awoke, he felt immediately cured, and the problem was solved. 文伯仁幼年與叔徵仲相訟,囚於囹圄,病且亟。夜夢金甲神呼其名云:汝勿深憂。汝前身迺蔣子誠門人,凡畫觀音大士像,非齋戒不敢動筆。積此虔誠,今世當以畫名于世也。醒來殊覺病頓愈,而事亦解矣。"Zhou Hui, Jinling suo shi, 256. Editor's note: See also Alice M. Hyland, The Literati Vision: Sixteenth Century Wu School Painting and Calligraphy ( Memphis: Memphis Brooks Museum of Art, 1984), 62.
Wen Boren's large portrait of Guanyin is no longer extant. Despite Zhou Hui's description of Wen Boren's former and current lives, including his dispute with his uncle, we still do not know the cause of the dispute between nephew and uncle. This dispute can be found in contemporaneous accounts; however, Wen Zhengming, in his Fu tian ji 甫田集, makes no mention of this incident and how it affected his relationship with his nephew.
In any event, Wen Boren must have spent considerable time with his uncle Wen Zhengming, and learned painting from him. The inscription on the Wen Boren painting Deep River in the Fifth Month (Wu yue jiang shen tu 五月江深圖), in the National Palace Museum, Taipei, reads: "Written in the Tingyun 停雲 Hall." Thus, the inscription tells us that Wen Boren painted this scroll at the Tingyun Hall, the studio of Wen Zhengming. Most likely Wen Boren had numerous occasions to visit Wen's studio, but the relationship between uncle and nephew changed after the legal dispute. Does this suggest that Wen Boren's Deep river in the Fifth Month was created prior to the falling-out between uncle and nephew?
Another Wen Boren painting in the National Palace Museum, Taipei, titled West Dongting Mountain (Xi Dongting shan tu 西洞庭山圖), includes inscriptions by such poets as Wang Guxiang 王穀祥 (1501–1568), the brothers Wen Peng 文彭 (1498–1573) and Wen Jia 文嘉 (1501–1583), Lu Andao 陸安道 (his younger brother Shidao 師道 lived 1517-?), Lu Zhi 陸治 (ca. 16th c.), Xie Shichen 謝時臣 (1488-?). As Xie Shichen's inscription is dated to his seventy-second year, or 1559, the year Wen Zhengming passed away, West Dongting Mountain predates Wen Zhengming's death. More importantly, Wen Boren's talent is noted in Lu Zhi's inscription:
May I ask if this painting comes from the wondrous hands of a spirit?
Master Bo, [hao] Wufeng (Wen Boren) is of the ranks of immortals.
借問丹青神妙手, 五峰伯子是仙班。
Another indication of Wen's talent was a portrait painted by him when he was twenty-five years old (1526), titled Small Portrait of Yang Jijing (Yang Jijing xiao xiang) 楊季靜小像, the only portrait by Wen Boren which is known to still exist. Yang Jijing (before 1504–1530) was a famous zither player who befriended Wen Zhengming, Tang Yin (1470–1524) and other Suzhou intellectuals. Given that Wen Boren, one generation younger than Wen Zhengming and Tang Yin, was painting portraits of Yang Jijing, an elder, we can speculate that, even when Wen Boren was young, his artistic skill already stood out among Wu school artists, and he was recognized as exceptional.
In addition, Wen Boren's painting A Spring Dawn on Cinnabar Platform (Dan tai chun xiao tu 丹臺春曉圖), National Palace Museum, Taipei, features a Taoist, his head bowed, standing on a stone platform with his back to the wind gazing at a cinnabar colored tripod. This work also reveals his skill at transmitting form and spirit in his paintings.
In the Palace Museum, Beijing, another painting by Wen Boren, Visiting Autumn Mountains (Qiu shan youlan tu juan 秋山游覽圖卷), bears an inscription by the Ming scholar-painter Mo Shilong 莫是龍 (1537–1578) who writes:
"In observing those of the past, such men as Gu Kaizhi would mount a platform and probe the essence of being, for more than twenty years. This spirit has been redoubled in our own times. Wen Zhengming and Wen Decheng (Boren) [have done this] by living alone in the mountains and distancing their footsteps from city and town. Besides their works no other trace of them exists; they are like the ancients, good and true. 觀昔人,稱顧愷之登樓研精者二十餘年,出便重於當代。文徵君徳承,獨居山樓,絶跡城市,筆墨之外,别無他營,其直造古人,良不虚也。" Bian Yongyu卞永譽, "Wen Wufeng Qiu shan youlan tu 文五峰秋山遊覽圖," in Shi gu tang shu hua hui kao式古堂書畫彙考(Shanghai: Jiangu shu she, 1922), 28.56-57.
From this we know that Wen Boren was regarded as possessing the diligence and integrity of the ancients.
Later, Jiang Shaoshu 姜紹書 wrote the Wu sheng shi shi 無聲詩史 (completed after 1679) and reiterated the previous description of Wen.Jiang Shaoshu, Wusheng shi shi (Taibei: Xin wen feng, 1989), 14-15. During the era of the Republic (established 1912), the Wu Xianzhi 吳縣志, though the latest in date to appear, drew on the Yan men jia cheng xuji 雁門家乘續集 which cites the exact location of Wen's reclusion: "Wen Boren, zi Decheng, began his reclusion in the village of Hancun 韓村 on Mount Dongting 洞庭 and late in life he moved to the western foot of Tiger Hill 虎丘 where he resided until the end of his days. 文伯仁字德承,…始居洞庭山之韓村,晚年遷虎丘西麓終焉。"Cao Yunyuan 曹允源, Li Genyuan 李根源, et al, eds., Wu xian zhi (Shanghai: Jiang Su guji chuban she, 1991), 75: 18.
Turning to Seattle's Wen Boren Landscape, typical of 16th-century works, the composition is long and narrow. A body of water separates foreground and background. In the foreground are large boulders, towering cypress trees, and an open pavilion in which sits a single figure, enjoying the lakeside view. In the center foreground, a bridge connects left and right foregrounds; on the bridge, two figures converse. Just beyond is a second open pavilion with two people deep in conversation. The brushwork is subtle and understated, the rocks are defined by pale colored washes and light strokes of dry ink, and the foliage of the towering cypresses is rich and dense. The painter very ably sets up interplay between tree and building, water and rock, creating a sharply contoured space.
Separating foreground, or near distance, from the mountains in the background is a wide body of water, a lake, which eventually winds its way deep into the mountain range. This truly gives the scene a sense of wandering deep along a winding path. The only interruption on the tranquil surface of the water is a tiny boat sailing across the lake. Beyond the lake a towering mountain rises, receding into space. Small, dark trees highlight the crest of the mountainous form, emphasizing spatial recession. Using multiple perspectives, Wen Boren has the viewer look down on the foreground, yet up at the distant mountain.
The overall composition––trees, rocks, figures and buildings, mountains and water––is complex and yet lucid and serene, the use of ink and brush light and masterfully controlled. This particular scene most likely portrays a place familiar to the literati of the Wu region. Two paintings, one by Wen Zhengming and one by his son Wen Jia 文嘉 (1501–1583), can be compared with the Seattle scroll by Wen Boren.
The Wen Zhengming painting in the Shanghai Museum, titled The Pure Wonder of Stone Lake (Shihu qing sheng tu juan 石湖清勝圖卷), (fig. 1) bears the following artist's inscription:
"In the year renchen (1532), the seventh month, after mid-month, Zhengming depicted the pure wonder of Stone Lake."
The Wen Jia painting, Autumn Colors by Stone Lake (Shi hu qiu se 石湖秋色), in the National Palace Museum, Taipei, (fig. 2) also depicts the wonderful scenery of Stone Lake, the famous place in the Suzhou region.
Upon comparing the three paintings—the Seattle Wen Boren, the Shanghai Wen Zhengming and the Taipei Wen Jia––the mountains in the Seattle painting bear a striking resemblance to the contour of the mountains, or steep hills, rising above Stone Lake as seen in the works by Wen Zhengming and Wen Jia, suggesting that the mountain in Seattle's Wen Boren most likely represents Lengjia 楞枷 Hill, at the foot of which lies Stone Lake.
In the foreground of the Wen Jia painting is a bridge known as Xingchun 行春 Bridge. On the mountaintop is a pavilion named Zhiping 治平 temple, also called Lengjia temple.Quoted from Chiang Chiao-shen, "Ke shao fufeng de Wen Jia," Shuangxi duhua suipi (Taipei: National Palace Museum Press, 1977), 172. This is a place that the literati of the Wu region often frequented and many Wu school painters were inspired by the scenery of this place, as is evident in their landscape paintings. An example would be Hou Maogong's 侯懋功 (fl. ca. 1522–1562) Landscape (Shanshui tuzhou 山水圖軸) (1570), (fig. 3) which portrays the same scenery as Wen Jia's painting Autumn Colors by Stone Lake.
Like Wen Zhengming's The Pure Wonder of Stone Lake 石湖清勝圖卷, the Seattle Wen Boren work does not depict the mountaintop pavilion. Nonetheless, might not Wen Boren be inspired by the same scenery while looking at Lengjia Hill from a different angle?
Wen Boren's Floating on Lake Tai (Fan Taihu tuzhou 泛太湖圖軸) in the Palace Museum, Beijing, (fig. 4) is inscribed: "[Painted] in the spring of 1569, after drifting from Xukou to Lake Tai." From the middle of the lake a triangular hill can be seen, resembling the distant peak of Wen Boren's landscape in the Seattle example; however, the Seattle painting brings the viewer closer to the mountain. Even if the Seattle scroll does not depict Stone Lake specifically, no doubt it represents the scenery of the Lake Tai vicinity.
During the prime of the Wu school of painting, surrounded by the beauty of the Suzhou landscape, together scholars would climb the mountains, searching for wonderful views, and lingering in the glory of the mountains. In their paintings, they captured the beauty of specific sites, their rivers and hills. They painted in open pavilions; on bridges they chatted about gardening, and in thatched huts they tasted and discussed the subtlties of different kinds of tea. These activities were seen as demonstrating the sentiments and eloquence that were at the core of being a literatus. The Seattle scroll truly captures the mountains and lakes where the literati spent their days.
The style of the Seattle Wen Boren has its source in the art of Wen Zhengming. As seen below, the use of brush and ink is similar to the detailed brushwork of Wen Zhengming's landscape paintings. We can view the Seattle Wen Boren as a typical example of the tranquil, detailed, refined manner of the Wen Zhengming tradition.
The Wen tradition has its roots in earlier painting, as Wang Shizhen states:
"Wen Daizhao (Wen Zhengming) surpasses Zhao Wuxing [Zhao Mengfu], Shuming [Wang Meng] and Zijiu [Huang Gongwang], occasionally reaching the essence of Dong Beiyuan's [Dong Yuan]. Generally speaking, his style has much in common with that of Shen Zhou."文待詔徵明見前待詔出趙吳興(孟頫)及叔明(王蒙)子久(黃公望)間有董北苑(源)筆意,大概得自啟南(沈周)不少也 。Wang Shizhen王世貞, Yanzhou sibu gao弇州四部稿, in SKQS, 155. 19b-20a.
The fact that Wen Boren was seen as attaining the level of Wen Zhengming is part of this same story.
As for the close relationship between the Seattle Wen Boren and the painting methods of Wen Zhengming, we can confirm the connection if we look at Wen Zhengming's The Emerald-shaded Studio (Ying cui xuan tu 影翠軒圖) (dated to 1520), (fig. 5). Similar to the Wen Zhengming painting, the Seattle scroll uses delicate, modulated brushstrokes, and wet and dry ink to describe the twists and turns of the trunks of the cypress trees.
The dots that describe the tree leaves in the Seattle scroll—and are often seen in other works by Wen Boren—can also be compared to those of Wen Zhengming's The Emerald-shaded Studio. Like Wen Zhengming, in the foliage of the Seattle scroll Wen Boren combines dark and light dots, organizing them in radiant clusters like the stamen of plum blossoms. Both paintings also contain another type of tree with leaves that are composed of "small circles" that set it apart from those composed of "dot leaves."
These stylistic comparisons corroborate textual statements, such as "he studied [painting] with Wen Zhengming." His brushwork and use of ink is very close to that of Wen Zhengming. If we compare it to the style of such contemporaries as Wu school painters Lu Zhi 陸治 (1470–1559), Qian Gu 錢穀 (1508–1572), Ju Jie 居節 (ca. 1524–ca.1585), all follow this same tradition.
As for the high peaks in the distance of the Seattle Wen Boren painting, the artist uses long brushstrokes to delineate the contours of the hilly mountain; the space between the mountain peaks is interspersed with small rocky crags, called fantou 礬頭 (alum-crystal tops).Translator's notes: this term is used for aspects of landscape painting that feature hard, sharp mountain rocks. Mi Fu米芾 (1051–1107) and Huang Gongwang黃公望 both credited Dong Yuan 董源and Juran 巨然 for forming this distinctive feature. See Mi Fu, Hua shi畫史, in SKQS, 1.7a and Huang Gongwang Xia shanshui jue寫山水訣, in Zhongguo shu hua quan shu 中國書畫全書, vol. 2, Shanghai: Shuhua chuban she, 2000, 762; Susan Bush and Hsio-yen Shih, Early Chinese Texts on Painting (Cambridge, Mass: Published for the Harvard-Yenching Institute by Harvard University Press, 1985), 231; 263. Along the edge of the mountain are scattered small shrubs and trees. The long strokes used to describe the texture of the mountain's surface are known as pima cun 披麻皴 (hemp-fiber strokes) and associated with the tradition of Dong Yuan 董源 (?-ca. 962). This is also what was meant by Wen Zhengming "occasionally reaching the essence of Dong Beiyuan" as discussed previously.
We could look back as well to Shen Zhou沈周 (1427–1509) who also used this brush technique, or even earlier to Huang Gongwang 黃公望 (1269–1354) and the structure of the mountain peaks in his famous work Living in the Fuchun Mountains (Fu chun shan ju tu 富春山居圖), which is very similar in appearance.
Generally speaking, the Wu school painters took the Four Yuan Masters as their models as well as Dong Yuan and Juran of earlier times. Wen Boren worked hard to master the tradition of Dong Yuan. Wang Shizhen writes,
"Wang Bozuo [Yifu宜輔] of Huayin came seeking [my calligraphy for] the grave inscriptions of his father Wang Shanshi (Hongzhuan弘撰, 1622–1702). He took Wen Wufeng's [Wen Boren] painting Mount Li (Lishan tu), as his payment. The forgoing [Mt. Li] had the inscription, 'In the fourth month of 1575 the first month of summer, I painted Pondering the Past in Mount Li (Lishan diaogu tu) in the style of Dong [Yuan] and Ju [Ran].' That does give the impression of sightseeing trips of the Tang era. 華隂王伯佐,來求其父山史墓銘,以文五峰畫〈驪山圖〉潤筆。上方自題云:『萬曆乙亥(1575)孟夏四月,以董巨墨法寫〈驪山弔古圖〉。』葢唐世游觀勝地。"Wang Shizhen, Gu fu yu ting za lu古夫于亭雜録, in SKQS, 3.13.
As for Yuan artist Huang Gongwang, who painted in the Dong Yuan tradition, he also was among those who influenced Wen Boren. The Wen Boren painting The Stone Cliffs of Tianchi Lake (Tian chi shi bi) 天池石壁, in the National Palace Museum, Taipei, has the inscription "In the year 1558, on the 16th day of the fifth month, Wufeng Wen Boren composed this painting." This painting is recorded by Gao Shiqi 高士奇 (1644–1703, who describes it as follows: "The brushwork is robust, the trees and rocks are archaic and strong, not inferior to the original (This points to Huang Gongwang's painting of the same title Tian chi shi bi). Even Taishi (Wen Zhengming) may not reach this level. People rarely see this type of robust work [from Wen Boren], and hence overlook him. 筆法渾厚,樹石古勁,不減真蹟。(指黃公望畫有〈天池石壁〉)即太史(文徵明)猶當少避,世人恒見其板實一路,遂忽之耳。"Gao Shiqi, Jiangcun xiao xia lu 江村銷夏録, in SKQS, 3.60.
In addition, Wen Boren paintings such as the Cloudy Dusk in Xiangtan (Xiangtan yun mu tu) 湘潭雲暮圖, Capital Museum, Beijing, (dated to 1552), Woody Valley (Qiaogu tu) 樵谷圖 (dated to 1560), (fig. 6), Beijing Palace Museum, and Immortal Dwelling in Xishan (Xishan xianguan) 谿山仙館 (dated to 1564), Guangzhou Art Gallery, are all examples of works by Wen Boren which are influenced by the style of Huang Gongwang. The texture strokes of the mountains and rocks are "hemp fiber strokes." The Seattle scroll of 1561 is very close in time to Qiaogu tu and Xishan xianguan, which explains the striking similarity of texture strokes.
As later generations often note, the style of Wang Meng 王蒙 (1308–1385) also exerted a strong influence on the painting of both Wen Zhengming and Wen Boren. Reviewing extant paintings by Wen Boren, we can understand the statement "each [painting] emulates the brushwork of Wang Shuming [Meng]."Han Ang 韓昂, Tuhui baojian xubian 圖繪寶鑑續編, SKQS, 15. The full line reads: "Wen Boren, zi Decheng, hao Wufeng, was from Changzhou. He was skilled at painting landscapes and people. In every case he emulated the brushwork of Wang Shuming 文伯仁,字徳承,號五峯,長州人。善畫山水、人物,每效王叔明筆法,多得意儼然. In the Ming period, Wang Keyu 汪砢玉 (1587–?) recorded that he had in his possession a painting by Wen Boren emulating Wang Meng's Reclusive Fisherman of Huaxi (Huaxi yu yin tu 花溪漁隱圖).Wang Luoyu, Shan hu wang 珊瑚網, in SKQS, 35.11.
In addition, Zhao Boju 趙伯駒 (1120–1182) and Zhao Mengfu 趙孟頫 (1254–1322) served as sources for Wen Zhengming and Wen Boren, as a group of blue-green landscapes attest. Examples of this notable tradition are Wen Boren's Isle of Fanghu (Fang hu tu 方壺圖) and The Yuanjiao Studio (Yuanjiao shuwu zhou 圓嶠書屋軸), both in the National Palace Museum, Taipei. Referring to Isle of Fanghu (fig. 7), the Qing scholar Zhang Chou notes: "The emphasis on color completely follows Zhao Qianli [Zhao Boju], [thus the painting] is extremely fine, also archaic and elegant, especially with regards to the composition. No doubt it is a divine work. 重著色全學趙千里,精細之極,亦復古雅,尤是布景卓絶,足稱無上神品。"Zhang Chou張丑, Qinghe shuhua fang清河書畫舫, in SKQS, 12.37A.
Let's compare Wen Boren and Wen Zhengming. Wang Shizhen, as quoted above, was astonished that Wen Boren "used foul language and tended to abuse those around him;" however, he "often demonstrated brilliance, his handscrolls and large hanging scrolls almost surpassing those of Wen Zhengming." Wang also said, "I do not know where such a wealth of artistic creativity comes from. 不知胸中何以富此一段丘壑也。"Wang Shizhen, Yanzhou sibu gao, 170.6. Wen Zhengming and his nephew Wen Boren, both members of the Wen family, were cited as sources of artistic brilliance.
Tang Zhiqi 唐志契 (1579–1651) states: "[Wen Zhengming's] son Wen Jia and his nephew [Wen] Boren inherited his excellence: Wen Jia's foliage is thick and lush; Boren's mountain ranges are luxuriant. They both served as models for painters. (文徵明)子嘉、猶子伯仁,並嗣其妙,嘉竹木扶疎;伯仁巖巒欝茂,並幟繪林。" Tang Zhique, Hui shi wei yan繪事微言, SKQS A.58.
Although Tang does not say who is the better artist, other assessments often correspond to "[Wen Boren's] reputation was no less than that of Hengshan (Wen Zhengming). 擅名不在衡山(徵明)之下" Later, in his Hua shi huiyao 畫史會要, Zhu Mouyin 朱謀垔 (active ca. 1631) writes in regard to Wen Boren, "In composing landscapes, he used vigorous brushstrokes and painted luxuriant mountains; his reputation was no less than that of Hengshan. 作山水,筆力清勁,巖巒鬱茂,擅名不在衡山之下。"Zhu Mouyin, Hua shi huiyao畫史會要, in SKQS 4.47. After this, in his Wu sheng shi shi 無聲詩史 Jiang Shaoshu copied verbatim the foregoing description.Jiang Shaoshu, Wusheng shi shi, (Taibei: Xinwenfeng, 1989), 2.14-15. And as we noted earlier, Gao Shiqi argued "Even Taishi 太史 (Wen Zhengming) may not reach this level."
Wen Zhengming's ancestral home is in Hunan and so he took the hao, or sobriquet, Hermit of Hengshan Mountain (Hengshan jushi 衡山居士) and Wen Boren the hao Wufeng五峰. The Xiang chuan ji湘川記 records, "There was the Spirit Altar of Zhuling and the Treasure Cave of Taixu. Matching the constellation of Yizhen, aligning with the Big Dipper, and so it is called Heng Mountain. The mountain has five peaks (wufeng 五峰). The first is called Zigai 紫蓋 (Purple top), the second Mixue 密雪 (Hidden in Snow), the third Zhurong 祝融, the fourth is Tianzhu 天柱 (Pillar of Heaven), the fifth Shilin 石廪 (Stone Granary)."Pan Zimu潘自牧, Ji zuan yuan hai 記纂淵海, SKQS, 6.21. Is Wen Boren's hao an expression of his indebtedness to Wen Hengshan (Wen Zhengming)? Or does he mean to stand up to his uncle? This question merits further consideration. Overall, in regards to Wu school painting, among those students or disciples who studied and emulated Wen Zhengming, Wen Boren stood out and was recognized as an exceptional talent.
Wen Boren's inscription on the Seattle scroll reads: "Written on a spring day in the year xinyou 辛酉 (40th year of the Jiajing reign period, 1561), by Wen Boren [hao] Wufeng." Wen Boren's small standard script is extremely fine as can also be seen in his calligraphy on his portrait. His brushstrokes are slender and strong, drawing on Wen Zhengming's. However, Wen Boren's calligraphy also reflects his study of Wang Xizhi's Preface to the Sacred Teachings (Sheng jiao xu 聖教序). A similar example of a Wen Boren inscription in a single line of running standard script, is found on his Fresh Waters and Clearing Hills (Xin shui qing luan tu 新水晴巒圖), in the National Palace Museum, Taipei (fig. 8).
As for seals on the Seattle scroll: the first seal is composed of the characters wen, bo, ren 文伯仁. The third character ren, in seal script, is composed of the characters of qian 千on top and xin 心 on the bottom. It is worth noting that in seal script ren (benevolence) is based on qian (thousand) and xin (heart).Translator's note: this is part of a tradition drawing on the Xu Shen's Shuowen jiezi 說文解字. According to this work the graph ren is described as: "meaning close in relation. It is based on the graphs ren 人 and er 二. As for the graph ren 忎, it is the ancient style script for ren 仁based on the graphs qian千 and xin心. See Ding Fubao 丁福保 ed., Shuowen jiezi gulin 詁林 (Beijing: Zhonghua shuju, 1988), 8A.3472.7917. This is the character ren.
A second seal reads Recluse of Wufeng (Wufeng shanren 五峰山人). The two seals are placed one above the other, which can also be seen on another landscape by Wen Boren, donated by Lin Zongyi 林宗毅 to the National Palace Museum, Taipei (fig. 9). Wen Boren frequently used the seal Wufeng shanren on many of his works.
The Seattle scroll bears a title label written by the famous Japanese Sinologist Naito Torajirō 內藤虎次郎 (1866–1934), which reads, "From the Qing imperial collection, landscape by Wen Wufeng 清內府舊藏文五峰山水." In regard to Naito mentioning the imperial collection, the painting has a number of Qing imperial seals: Qianlong Yulan zhi bao 乾隆御覽之寶, Qianlong jianshang 乾隆鑑賞, Sanxi tang jing jian xi 三希堂精鑑璽, Yizi sun宜子孫, and Shi qu bao ji 石渠寶笈. This combination of five Qing imperial seals of the Emperor Qianlong are customarily called wu xi quan 五璽全 ("complete set of the ruler's five seals"), and is consistent with the combination of seals on other paintings.
It is worth noting that in both the Qianlong and Jiaqing periods the paintings in the Qing imperial collection were recorded in the multi-volume Shi qu bao ji 石渠寶笈 and Mi dian zhu lin 秘殿珠林.Regarding the compilation of the Shi qu bo ji and the Midian zhu lin see preface to the National Palace Museum editions of these two works. Guoli Gugong bowu yuan ed., Shi qu bao ji Mi dian zhu lin (Taibei: Guoli Gugong bowu yuan, 1971). If the Seattle painting had come from the Qing imperial collection, it ought to have been recorded in the first edition of the Shi qu bao ji, but we find no record of it. How can this absence be explained?
It is worth noting that the paintings held today in the National Palace Museum collection came from the Qing imperial collection, and the majority are recorded in either the Shi qu bao ji or the Mi dian zhu lin. Since 1989 they have systematically been published in the Gu gong shu hua tu lu故宮書畫圖錄. Similar to the previous publication, Gu gong shu hua lu 故宮書畫錄, both took the Shi qu bao ji and Mi dian zhu lin as their basis. The main difference is that the Gu gong shu hua tu lu included images, making it easier to examine the imperial seals. According to the editors of this work, even though some objects had Qing imperial seals, the works were not always included in the Shi qu bao ji or the Mi dian zhu lin.
Aside from the Wu xi quan seals mentioned in volume one of the Shi qu bao ji, objects included in this collection should also include the seal of the palace in which the painting was kept, and that seal is known as Dian cang yin ("seal of the palace hall"). This accords with the preface to the Shi qu bao ji, which was written at the time of compilation (8th year of the Qianlong reign period [1743] in the 12th month on the 16th day) and states: "According to the imperial edict of the Qianlong Emperor, [record] whatever objects are held in the Qianqing Palace, the Wanshan Palace, the Dagao Palace and the like, places and divides them by location without losing their proper order and allowing later generations to enjoy them and know where they are located. Hereafter let the location of storage be marked [on the object]. 奉(乾隆)上諭,何者貯乾清宮,何者貯萬善殿、大高殿等處,分別部居,無相奪倫,俾後人披籍,而知其所在。嗣後復有歸藏內府者,案號續編。"Shi qu bao ji Mi dian zhu lin, 1.
Shi qu bao ji and Mi dian zhu lin are in separate volumes, and they are ordered by the places where the paintings were kept. That is also why the paintings with the "Five Complete Seals" should also have "the palatial hall seal." The Seattle scroll does not have "the palatial hall seal," nor is it published in the Shi qu bao ji. Perhaps after the five seals were stamped on the painting, it was not officially placed in a particular hall. That is why it has the Shi qu bao ji seal, but is not published in the book.
As for the location of the five Qing imperial seals on the Seattle landscape, Qianlong Yulan zhi bao 乾隆御覽之寶 is to the upper right, Qianlong jianshang 乾隆鑑賞 (the round seal) is to the upper left, Sanxi tang jing jian xi三希堂精鑑璽 and Yizi sun 宜子孫 are to the left side, one on top of the other, and Shi qu bao ji 石渠寶笈 is to the right. This is the proper positioning according to the first edition of the Wu xi quan.
Ordinarily in addition to these seals, there was also a seal of the palace store house, the so-called Dian cang bao seal under the Shi qu bao ji seal such as Yushufang jian cang bao 御書房鑑藏寶, Yangxin dian jian cang bao 養心殿鑑藏寶, Chonghua gong jian cang bao 重華宮鑑藏寶 and so on. The Seattle painting does not have the Dian cang bao and so it is not recorded in the Shi qu bao ji.
The previously discussed Wen Zhengming painting, The Emerald-shaded Studio 影翠軒圖, found in the National Palace Museum collection (fig. 5) is in a similar situation. This work also not only has the Wu xi quan seals with the same seal placement as the seals in Seattle's painting, but it also lacks the Dian cang bao seal. The editors of the Gu gong shu hua tu lu state: "This object has the Shi qu bao ji seal. It is not recorded in the Shi qu bao ji."Guoli Gu gong bowu yuan, ed., 國立故宮博物院, Gu gong shu hua tu lu故宮書畫圖錄 (Taibei: Guoli Gu gong bowu yuan, 1991), 156. The Wen Boren painting Isle of Fanghu方壺圖 is recorded in the first volume of the Shi qu bao ji under the Yangxin Palace. Other than the Wu xi quan, it also has the seal Yangxin dian jian cang bao. The placement of seals for the Qing palace collection is related to the composition of the painting, thus the placement of seals for the Seattle Wen Boren and Wen Zhengming's The Emerald-shaded Studio is the same but it is different for Isle of Fanghu.
In conclusion, we have reason to believe that Wen Boren's Landscape in the collection of the Seattle Art Museum was once in the imperial collection at the Forbidden City. This lyrical work exemplifies the quintessential Ming literati sensibility and must have been painted when the then 59-year-oldWen Boren, known for his testiness, was in a serene mood. Perhaps more importantly, his extraordinary ability to internalize the pictorial conventions of ancient masters in this poetic rendering of Stone Lake and Lengjia Hill makes both the painting and those famous sites accessible to viewers, past and present.
© 2013 by the Seattle Art Museum
Questions for thought
Wen Boren文伯仁
Quick Facts about the Artist
inscriptions and seals
A fine work of imperial provenance, which is not recorded in the imperial catalogue, is Landscape, a refined, lyrical painting in hanging scroll format in the collection of the Seattle Art Museum. To elucidate this important work, first we will take a look at how contemporaries and later writers described Wen Boren (1501-1575) and his work.


text:
Questions about security in Ubuntu and the official flavours.
Use this control to limit the display of threads to those newer than the specified time frame.
Allows you to choose the data by which the thread list will be sorted.
Order threads in...
Note: when sorting by date, 'descending order' will show the newest results first.
Ubuntu Forums Code of Conduct

subset: commoncrawl


text:
Our Privacy Policy for our SITE(s), (collectively, the "SITES", or individually, a "SITE", the "SERVICE" or "we/our").
We have created this Privacy Policy to demonstrate our dedication to respecting privacy. This Privacy Policy sets out our practices with respect to personal information collected regarding visitors and subscribers (collectively referred as 'you') of this SITE. This SITE is an adult website and membership is solely restricted to adults; persons under the age of eighteen are strictly prohibited from this SITE and we do not intentionally collect information on individuals under the age of eighteen. By visiting or subscribing to this SITE, you agree and consent to the terms of this Privacy Policy as amended from time to time, as well as the terms and conditions of this SITE. We comply to Dutch and European Union data protection laws.
Certain non-personal information may be collected from visitors to this SITE including, but not limited to, their browser type, operating system, IP address, and the domain name from which they accessed the SITE. Other non-personal information may be collected such as browsing behavior, date and time of visit, the pages visited; the time spent viewing the SITE, the number of times the visitor returns to the SITE, and click-stream data. We may use cookies and similar technologies to collect this information. We may also allow unaffiliated third parties, such as advertisers, to serve cookies to visitors of our SITE. You are always free to decline cookies, but in doing so they may not be able to use certain features on our SITE.
We collect personal information so that we may custom tailor the web experience for each subscriber and offer the best products and services to meet the needs of each subscriber. We may use information collected from visitors to our SITE for any of the following purposes:
Since part of the personal information that is collected and safeguarded by us is your email address, we try very hard to respect your time and privacy by controlling and limiting the frequency of mailings. If you receive a mailing from us or one of our marketing partners, it is because your email address is either listed with us as someone who has expressly shared this address for the purpose of receiving information in the future, or you have registered or purchased or otherwise have an existing relationship with us.
There may be occasions when you will be presented with special offers either from us or from third-party service or content providers, which may include communications, newsletters, commercial advertising, or other promotional or special event materials (collectively referred to as 'Offers'). Your consent to this Privacy Policy acts as your consent to receive these occasional mailings by us and by our third party service or content providers.
The SITE is not responsible or liable for the use of any information that a subscriber may provide, or that is gathered by third-party websites that have ads or links on the SITE. This SITE does not control, monitor or endorse the information gathering practices or Privacy Policies of any of those third-party websites. Whenever applicable, each subscriber should seek to read the Privacy Policy of any third-party website provider that has an advertising banner, advertises or has a link on the SITE.
All information collected may be shared when
necessary to comply with applicable law and /or to cooperate with law
enforcement agencies and the courts/tribunals.
This SITE has security measures in place to protect the loss, misuse and alteration of the information under our control. As for all other information, visitors and subscribers should consider this communication and information to be non-confidential, and consequently, we assume no responsibility or liability if any information relating to any visitor or subscriber is intercepted and/or used by an unintended recipient.
By visiting or subscribing to this SITE, you agree to the practices described in this Privacy Policy. We may at any time revise or amend any of these terms and conditions. You are bound by any such revisions and should therefore periodically visit this page to review the then-current terms and conditions to which you are bound. To the extent that any of the third-party sites accessible through our SITE (such as our advertisers) have different privacy practices from those stated in this Privacy Policy, those third-party privacy practices govern the collection and use of information you provide when visiting those sites. We are not responsible for the policies, content, and practices of other companies which may collect personal information as a third-party web service provider that has an advertising banner or link on the SITE.


text:
Get amazing offers on selected items when you promo code - 20 active offers
You can quickly try the promotional codes below savings you can see.
Promo Code
Deal on Select Items at Priceline.com.au w/Promo Code
Shop and enjoy shocking discounts with our update Priceline promo code and discount. Thank you for choosing us. To give the most up-to-date Priceline coupons, We put in great efforts to update any new promo codes, coupons and offers available. Any offers that can save you money, we will list them on our website.
Different types of Priceline coupons, and which work in different ways. Majority are promo codes, free shipping, eceive free gifts and purchase memberships.
If you often shop at priceline.com.au, then please bookmark this page, we will find great offers for you. Can also always to follow them on social media.
If the Priceline promo code you are using does not apply to the order, please check:
Sometimes Priceline will extend the validity of the coupon code, we may not update the expiration time in time. Priceline offers that have no expiration time may indicate long-term validity. If you don't find a suitable discount, you can try out some expired. It may still work.
Of course! Please fill in our promo code submission form, please fill in the complete coupon information. Once verified the code will be added to this page.
If you need help about the order or other, you can contact the merchant through the contact page of Priceline. Most store will provide email, phone and online chat to help you solve related problems.
Coupert can test and apply all coupons in one click.
Be budget savvy with this great offer from Priceline! Priceline has 20 verified coupons for July, 2024. Use best coupon and be on your way to great savings, save up to 5% OFF.
Latest Priceline Offer: Get See Today's Beauty & Personal Care Deals at Amazon.com (w/Free Shipping for Prime). Did you know? No coupon code needed, you can enjoy the discount.
When to release the latest discount: Recently discovered a new discount code for Priceline on Mar 21, 2024.
Get the latest offers of Priceline
I hereby agree process my e-mail address data, used for "subscription" services.


text:
When You Need Water Heater Repair, Give Us A Call:
Water heaters are a vital part of your home and as such, it's important that they be cared for. Repairing them can only result in a better-functioning appliance and less stress when you need it most. We specialize in the repair of water heaters on all makes and models!
Common Problems With Water Heaters:
There are several common problems that can occur with water heaters. If you notice any of the following issues, it's time to give us a call for water heater repair:
-The water heater is making strange noises. This could be a sign that the heating element is failing or that there is sediment build-up inside the tank.
-The water temperature is not consistent. This could be due to a faulty thermostat or heating element.
-There is water leaking from the tank. This could indicate a serious problem, such as a cracked tank, and should be addressed immediately.
-The pilot light keeps going out. This could be caused by a draft in the room, dirty burner assembly, or other issues.
-The hot water runs out quickly. This could mean that the tank is too small for your household needs or that there is a leak in the system.
If your water heater is giving you trouble, don't hesitate to give us a call. We'll be happy to help you out and get your water heater back up and running in no time.
We're experts at water heater repair, so you can rest assured that we'll be able to fix the problem quickly and efficiently. We know how important it is to have a functional water heater, so we'll do everything we can to get yours working again as soon as possible.
If you have any questions or concerns, please don't hesitate to give us a call. We're always happy to help out however we can.
Our Experienced Plumbers Are Here To Help With Your Water Heater Replacement Needs:
It's not uncommon for water heaters to break down and need replacing. It's never fun when it happens, but don't worry! We have a team of plumbers standing by to take care of your needs. When you call us for water heater replacement, we'll send a professional plumber with the right tools and experience to get the job done as quickly and efficiently as possible!
Signs That You Need A Replacement:
If your water heater is over 10 years old, it may be time for a replacement. Here are some other signs that you may need to replace your water heater:
-Your water heater is leaking
-There is rust on your water heater
-You have no hot water or not enough hot water
-Your energy bills have increased significantly
-Your water heater makes strange noises
What Do Our Plumbers Offer?
We offer a wide range of plumbing services to meet the needs of our customers. Our experienced plumbers are available to help with your water heater replacement needs. We offer a variety of water heater options to choose from, including electric, gas, and tankless water heaters. We can also help you find the right size and type of water heater for your home or business. Call us today to schedule a free consultation.
Need A Tankless Water Heater Installed? Call Us Today Our Plumbers Are Here To Help:
Tankless water heaters are a wonderful way to conserve energy and save money on your utility bills. With the help of our highly trained plumbers, you can make sure that your tankless water heater is installed properly.
What Makes a Tankless Water Heater Better Than the Traditional Model?
A tankless water heater is a good choice for many homeowners because it is much more efficient than a traditional model. Tankless water heaters heat water on demand, so you are not wasting energy by heating water that you are not using. This can save you money on your utility bills. Additionally, tankless water heaters take up less space than traditional models, so they are a good option if you have limited space in your home.
Types of Tankless Water Heater Installations We Offer:
If you're thinking about having a tankless water heater installed in your home, our experts at All Pro Plumbing are here to help. We offer a variety of installation services to meet your needs and get the job done right.
Some of the different types of tankless water heater installations we offer include:
-Electric tankless water heaters: These units are typically small and can be installed under a sink or in a closet. They're a good option for homes with limited space.
-Gas tankless water heaters: Gas models are larger than electric units and require more ventilation. They're a good choice for homes with high hot water demand.
-Point-of-use (POU) tankless water heaters: POU units are designed for specific appliances, such as dishwashers or washing machines. They provide hot water on demand, which can save energy and money.
The benefits of having a tankless water heater are numerous. One of the biggest advantages is that they are much more efficient than traditional storage tanks. Tankless units heat only the water that is needed at the time, so there is no wasted energy.
We'll work with you to determine the best type of installation for your home and needs. Call us today to get started!
When your water heater breaks down, it can be a major inconvenience. You may not be able to take showers, do laundry, or wash dishes. Our water heater repair company can come to your rescue and get your water heater up and running again in no time. Here are some of the benefits of hiring a professional to repair your water heater:
1. Fast service – A professional repair company will be able to diagnose and fix the problem quickly.
2. Affordable prices – Many companies offer affordable rates for their services.
3. Experienced technicians – The technicians who work for a reputable repair company are experienced and know how to properly fix a water heater.
4. Warranty – Some companies offer a warranty on their services, so you can have peace of mind knowing that you're covered if something goes wrong.
5. Quality workmanship – When you hire a professional to repair your water heater, you can be sure that the job will be done right the first time.
When your water heater breaks down, don't wait around for it to get worse. Contact our water heater repair company today and have your problem fixed quickly and affordably.
-How often should I have my water heater serviced?
It is best to service your water heater once every year, but if you live in an area with a lot of hard water then it is recommended that you have it serviced twice a year. This will keep your water heater functioning at peak efficiency, and also help to prevent any problems from developing.
-How do I know if my water heater needs repair?
If your water heater is not working as well as it used to or is making strange noises, then it may need to be repaired. If you notice any leaks around the unit, or on the pipes leading to and from the unit, then this is another sign that repair may be necessary.
-What are some common problems that occur with water heaters?
One of the most common problems that can occur with water heaters is a build-up of sediment in the bottom of the tank. This can cause the unit to work less efficiently and may eventually lead to a complete breakdown. If you notice that your water heater is not heating water as well as it used to, then this may be an indication that sediment has built up in the tank and is causing problems. Another common problem that can occur is a leak in the tank or in the pipes leading to and from the unit. If you notice any leaks, then it is important to have them repaired as soon as possible to avoid further damage to your home.
-How can I prevent my water heater from needing repair?
The best way to prevent your water heater from needing repair is to have it serviced on a regular basis. This will keep the unit clean and free of sediment, and will also help to prevent any leaks from occurring. If you do notice any problems developing, then it is important to have them repaired as soon as possible to avoid further damage to your home.
If you're in need of water heater repair, don't hesitate to give our company a call. We have a team of experienced professionals who are dedicated to providing the best possible service. We understand the importance of having a functioning water heater, and we'll do everything we can to get yours up and running again as quickly as possible. Contact us today to schedule a repair appointment. We service the greater Park Ridge Illinois area.


text:
The first place card holder is an easy one made with candy canes.
You just need 3 of any size..these are the tiny ones.
Hot glue 2 of them together, so the hooks are positioned to hold the place card...almost like an easel.
Close up of hot glue.
and here is the third candy cane for support so it can stand up on it's own.
Top view.
Add a little ribbon.
and you're done!!
These would be great for dinner place cards or labeling food on a buffet, but extra cute for the "kids" table. Remember the kids table when you were younger. They need cute things too, but just tell them they can't eat these.
How about a beautiful piece of fruit...apple, pear, pomegranate.
Just stick in 2 floral picks or paper clips to hold the card.
Here is another great entertaining idea that I use for parties. Labeling the milk or creams for the coffee station. These are old fashion milk bottles, but this idea would work for any container.
Little I.D. bracelets.


text: The Electronic HP Care Pack Services (e-Care Pack) capability allows you to order, receive, update, and activate a wide range of valuable HP Care Pack Services over the Internet. Administered through the HP Services Network (CSN), it is a fast and simple process that enables immediate registration and service activation.¤¤Increase equipment availability and productivity with high-quality onsite and remote support for your HP hardware, as well as selected multivendor equipment. This flexible service covers desktops, workstations, servers, notebooks and laptops, network equipment, and printing.¤¤Choose Next Business Day Hardware Support when you need to extend your hardware warranty coverage for key systems and devices; obtain easy-to-buy, easy-to-use onsite services; improve hardware performance and uptime; increase the return on your HP and multivendor hardware investments; enjoy consistent service coverage across geographically dispersed sites.


text:
Last Chance! Homes are a Bargain Compared to Historic Norms
A loaf of bread used to be a nickel. A movie ticket was a dime. Not anymore. Houses were also much less expensive than they are now. Inflation raised the price of all three of those items, along with the price of almost every other item we purchase.
The reason we can still afford to consume is that our wages have also risen over time. The better measure of whether an item is more expensive than it was before is what percentage of our income it takes to purchase that item today compared to earlier. Let's look at purchasing a home.
The COST of a home is determined by three major components: price, mortgage interest rate, and wages. The big question? Are we paying a greater percentage of our income toward our monthly mortgage payment today than previous generations? Surprisingly, the answer is no.
Historically, Americans have paid just over 21% of their income toward their monthly mortgage payment.
Though home prices are higher than before, wages have risen as well. And, the most important component in the cost equation – the mortgage rate – is dramatically lower than it was in the 1970s, 1980s, 1990s, and 2000s.
Today, according to the latest Home Affordability Index just released by the National Association of Realtors, Americans are paying 17.4% of their income toward their mortgage payment. That is much lower than the 21% average previous generations have paid.
Bottom Line
The cost of purchasing a home today is a bargain compared to previous generations when we look at it from a percentage of income basis. However, with mortgage rates expected to increase and home prices continuing to appreciate, that will not always be the case. Whether you are buying your first home or looking to move-up to a more expensive home, purchasing sooner rather than later probably makes sense.
from Simplifying the Market™ http://bit.ly/2sxG641
via IFTTT The Julian Team San Antonio Area Real Estate (210) 279-8408


text:
USS Grenadier SS 525
"Personalized" Canvas Submarine Print
(Not just a photo or poster but a work of art!)
Most submariners loved his sub. It was his life. Where he had tremendous responsibility and lived with his closest shipmates. As one gets older his appreciation for the ship and the Navy experience gets stronger. A personalized print shows ownership, accomplishment and an emotion that never goes away. It helps to show your pride even if a loved one is no longer with you. Every time you walk by the print you will feel the person or the Navy experience in your heart (guaranteed).
The image is portrayed on the waters of the ocean or bay with a display of her crest if available. The ships name is printed on the bottom of the print. What a great canvas print to commemorate yourself or someone you know who may have served aboard her.
The printed picture is exactly as you see it. The canvas size is 8"x10" ready for framing as it is, or you can add an additional matte of your own choosing. If you would like a larger picture size (11"x 14") on a 13" X 19" canvas, simply purchase that option. The prints are made to order. They look awesome when matted and framed.
We PERSONALIZE the print with "Name, Rank and/or Years Served" or anything else you would like it to state (NO ADDITIONAL CHARGE). It is placed just above the ships photo. After purchasing the print simply email us or indicate in the notes section of your payment what you would like printed on it. A couple of Suggestions:
United States Navy Submariner
Proudly Served: Your Years Here
This would make a nice gift and a great addition to any historic military collection. Would be fantastic for decorating the home or office wall.
The watermark "Great Naval Images" will NOT be on your print.
This photo is printed on Archival-Safe Acid-Free canvas using a high-resolution printer and should last many years.
Because of its unique natural woven texture canvas offers a special and distinctive look that can only be captured on canvas. The canvas print does not need glass thereby enhancing the appearance of your print, eliminating glare and reducing your overall cost.
We guarantee you will not be disappointed with this item or your money back. In addition, we will replace the canvas print unconditionally for FREE if you damage your print. You would only be charged a nominal fee plus shipping and handling.
Thanks for looking!


text:
The Jonah is a medium-cut, low-rise swim bottom that includes a drawstring around the waist to stay secure when you get super active. Features diagonal stitch detailing along the back.
Lined for maximum privacy and tagless for maximum comfort.
Super durable with reinforced stitching
Medium bum coverage
100% Polyester
Elastic contains trace amounts of Latex
Rinse in cold water after use and hang dry
Made responsibly in the USA
Shipping & Returns
Free standard shipping on domestic orders over $90
Standard shipping takes about 5 - 7 business days
JOLYN Return Policy
Do I have to use the original JOLYN packaging or can I use my own?
We prefer you recycle the JOLYN packaging, but you can use whatever packaging you'd like.
How do I get a return shipping label?
All you have to do is submit a return, wait for approval, and then a return shipping label will be emailed to you. The cost of the return shipping will be taken out of your refund/store credit. Easy peasy!
Submit a return request here and we'll take it from there!
Does it need to be in brand new condition?
Yes! The item(s) must be unused, unworn, with no signs of washing or use. All tags and liners must be attached.
For sanitary reasons, please try on swimwear over underwear. Do not remove the hygienic liner.
Wrong product or product arrived damaged?
Email us and we'll make it right!
We stand by our products and offer a 6-month warranty. Please email us within 6 months of purchase with your order number and a photo of the item and we'll help you out!
I Live In Canada. Can I Return My Order?
- Of course! If you are willing to pay to have the garments shipped back to us we'll refund or issue a store credit for the product amount. Unfortunately we are not able to refund shipping, taxes, or duty collected on international orders.
- choosing a selection results in a full page refresh
- press the space key then arrow keys to make a selection


text:
The Fantasy Flight Games forums have been created as a meeting point for fans of the games we publish, a place where they can exchange ideas and opinions about these games and meet other people that share the same hobby.
To insure that the exchange of ideas is fluid and requires the minimum interference by moderators and administrators, we need to all follow certain rules.
We're not going to compile an exhausive list of rules because we are counting on the maturity and common sense of all our users; if at any time our presumption is not confirmed, we will take the measures each situation requires, whether the rule broken is on this list, or merely common sense.
1. Write your messages to the appropiate forum, and if you would like to open a new topic, please check first to make sure there is not another topic similar to the one you propose.
2. Don't write messages with a commercial purpose (selling items).
3. Don't write messages that encourage the illegal use of products protected by copyright.
4. Treat everyone (users or not) with respect, while still being able to disagree with their ideas.
To sum up, if you come here to talk about games with other fans, exchange ideas, and have a good time while not bothering people who've come here to do the same, you will have no problems and need not concern yourself with this message.
If you think that any user is not respecting these rules, or you have any complaints or doubts about them, write to
[email protected]
Important note:
We recommend you read the
Forum text editor's users guide
Thank you.


text:
This forum is for discussion of PvMP on the Crickhollow server.
Use this control to limit the display of threads to those newer than the specified time frame.
Allows you to choose the data by which the thread list will be sorted.
Order threads in...
Note: when sorting by date, 'descending order' will show the newest results first.
Forum Rules
This form's session has expired. You need to reload the page.


text:
Need a host for your Zen Cart™ site?
DISCLOSURE: When you sign up for these services using the links provided, those services pay a commission fee back to Zen Cart™ to help support the Zen Cart™ project. We thank you in advance for your support.
Zen Cart® is grateful for the support of vendors who have graciously provided software and services to empower the ongoing development of Open Source projects.
We encourage you to visit these vendors and use their products in your own businesses.
Logos are copyright by their respective owners. Used with permission.


text:
Processing, Please Wait...
Please provide your e-mail address and password to login.
If your login information is displayed below, then you are already logged in.
If you are a visitor and not a registered user, please use the
New Visitor Registration
to register for the site.
Primary E-Mail Address:
Remember Me
Forgot your Password?


text:
Attorneys at Law, Detective Agencies and Law Firms in Vancouver, represents local and International clients in a wide variety of legal cases including, but not limited to:
** If you are an Attorney at Law or Law Firm in which there is at least one Legal XM member attorney or detective services, you may join Legal XM at the "Additional Member" rate of $149.00. After applying for additional members please contact our office at 1. 619. 846. 2123 so that your account can be properly linked with your firm. See Plans and Prices Here
* We DO NOT distribute, sell, or rent your name or personal information to any third party. This includes any e-mail addresses, phone numbers or mailing addresses that you provide. All our conversation, files, forms, etc are kept strictly confidential.


text:
A Decision Not Made Is Still A Decision
Whether through inertia or trepidation, investors who put off important investment decisions might consider the admonition offered by motivational speaker Brian Tracy, "Almost any decision is better than no decision at all."1
This investment inaction is played out in many ways, often silently, invisibly and with potential consequence to an individual's future financial security.
Let's review some of the forms this takes.
The worst indecision may be the failure to enroll. Not only do nonparticipants sacrifice one of the best ways to save for their eventual retirement, but they also forfeit the money that any employer matching contributions represents. Not participating holds the potential to be one of the most costly indecisions one can make.
The other way individuals let indecision get the best of them is by not selecting the investments for the contributions they make to the 401(k) plan. When a participant fails to make an investment selection, the plan may have provisions for automatically investing that money. And that investment selection may not be consistent with the individual's time horizon, risk tolerance, and goals.
Under the SECURE Act, in most circumstances, you must begin taking required minimum distributions from your 401(k) or other defined contribution plan in the year you turn 72. Withdrawals from your 401(k) or other defined contribution plans are taxed as ordinary income, and if taken before age 59½, may be subject to a 10 percent federal income tax penalty.
For homeowners, "stuff" just seems to accumulate over time. The same may be true for investors. Some buy investments based on articles they have read or based on the recommendations of a family member. Others may have investments held in a previous employer's 401(k) plan.
Over time, we can end up with a collection of investments that may have no connection to our investment objectives. Because of the dynamics of the markets, an investment that may have once made good sense at one time may no longer be advantageous today.
By not periodically reviewing what we own, which would allow us to cull inappropriate investments – or even determining if the portfolio reflects our current investment objectives – we are making a default decision to own investments that may be inappropriate.
Whatever your situation, your retirement investments require careful attention and may benefit from deliberate, thoughtful decision-making. Your retired self will be grateful that you invested the time, today.
1. Brainy Quote, 2020
The content is developed from sources believed to be providing accurate information. The information in this material is not intended as tax or legal advice. It may not be used for the purpose of avoiding any federal tax penalties. Please consult legal or tax professionals for specific information regarding your individual situation. This material was developed and produced by FMG Suite to provide information on a topic that may be of interest. FMG Suite is not affiliated with the named broker-dealer, state- or SEC-registered investment advisory firm. The opinions expressed and material provided are for general information, and should not be considered a solicitation for the purchase or sale of any security. Copyright 2020 FMG Suite.


text:
As member you have a publicly viewable profile page. This page includes information provided by the member, either during the registration process or later on via the User Control Panel.
There are a multiple ways to view a members profile...
Which Informations are shown on that Page?
The Public Profile Page is grouped into 5 Tabs.
Personal information such as E-Mail Address or Passwords are NOT shown.


text:
Apache HTTP Server Version 2.4
Available Languages: en
This document has not been updated to take into account changes made in the 2.0 version of the Apache HTTP Server. Some of the information may still be relevant, but please use it with care.
These are some notes on the Apache API and the data structures you have to deal with, etc. They are not yet nearly complete, but hopefully, they will help you get your bearings. Keep in mind that the API is still subject to change as we gain experience with it. (See the TODO file for what might be coming). However, it will be easy to adapt modules to any changes that are made. (We have more modules to adapt than you do).
A few notes on general pedagogical style here. In the interest of conciseness, all structure declarations here are incomplete -- the real ones have more slots that I'm not telling you about. For the most part, these are reserved to one component of the server core or another, and should be altered by modules with caution. However, in some cases, they really are things I just haven't gotten around to yet. Welcome to the bleeding edge.
Finally, here's an outline, to give you some bare idea of what's coming up, and in what order:
We begin with an overview of the basic concepts behind the API, and how they are manifested in the code.
Apache breaks down request handling into a series of steps, more or less the same way the Netscape server API does (although this API has a few more stages than NetSite does, as hooks for stuff I thought might be useful in the future). These are:
, which don't really fit well elsewhere.These phases are handled by looking at each of a succession of modules, looking to see if each of them has a handler for the phase, and attempting invoking it if so. The handler can typically do one of three things:
. In this case, the server behaves in all
respects as if the handler simply hadn't been there.Most phases are terminated by the first module that handles them;
however, for logging, `fixups', and non-access authentication checking,
all handlers always run (barring an error). Also, the response phase is
unique in that modules may declare multiple handlers for it, via a
dispatch table keyed on the MIME type of the requested object. Modules may
declare a response-phase handler which can handle any request,
by giving it the key */*
(i.e., a wildcard MIME type
specification). However, wildcard handlers are only invoked if the server
has already tried and failed to find a more specific response handler for
the MIME type of the requested object (either none existed, or they all
The handlers themselves are functions of one argument (a
structure. vide infra), which returns an integer,
as above.
At this point, we need to explain the structure of a module. Our
candidate will be one of the messier ones, the CGI module -- this handles
both CGI scripts and the ScriptAlias
config file command. It's actually a great deal
more complicated than most modules, but if we're going to have only one
example, it might as well be the one with its fingers in every place.
Let's begin with handlers. In order to handle the CGI scripts, the
module declares a response handler for them. Because of ScriptAlias
, it also has handlers for the
name translation phase (to recognize ScriptAlias
ed URIs), the type-checking phase (any
ed request is typed
as a CGI script).
The module needs to maintain some per (virtual) server information,
namely, the ScriptAlias
es in
effect; the module structure therefore contains pointers to a functions
which builds these structures, and to another which combines two of them
(in case the main server and a virtual server both have ScriptAlias
es declared).
Finally, this module contains code to handle the ScriptAlias
command itself. This particular
module only declares one command, but there could be more, so modules have
command tables which declare their commands, and describe where
they are permitted, and how they are to be invoked.
A final note on the declared types of the arguments of some of these
commands: a pool
is a pointer to a resource pool
structure; these are used by the server to keep track of the memory which
has been allocated, files opened, etc., either to service a
particular request, or to handle the process of configuring itself. That
way, when the request is over (or, for the configuration pool, when the
server is restarting), the memory can be freed, and the files closed,
en masse, without anyone having to write explicit code to track
them all down and dispose of them. Also, a cmd_parms
structure contains various information about the config file being read,
and other status information, which is sometimes of use to the function
which processes a config-file command (such as ScriptAlias
). With no further ado, the
module itself:
/* Declarations of handlers. */
int translate_scriptalias (request_rec *);
int type_scriptalias (request_rec *);
int cgi_handler (request_rec *);
/* Subsidiary dispatch table for response-phase
* handlers, by MIME type */
handler_rec cgi_handlers[] = {
{ "application/x-httpd-cgi", cgi_handler },
/* Declarations of routines to manipulate the
* module's configuration info. Note that these are
* returned, and passed in, as void *'s; the server
* core keeps track of them, but it doesn't, and can't,
* know their internal structure.
void *make_cgi_server_config (pool *);
void *merge_cgi_server_config (pool *, void *, void *);
/* Declarations of routines to handle config-file commands */
extern char *script_alias(cmd_parms *, void *per_dir_config, char *fake,
char *real);
command_rec cgi_cmds[] = {
{ "ScriptAlias", script_alias, NULL, RSRC_CONF, TAKE2,
"a fakename and a realname"},
module cgi_module = {
STANDARD_MODULE_STUFF, NULL, /* initializer */ NULL, /* dir config creator */ NULL, /* dir merger */ make_cgi_server_config, /* server config */ merge_cgi_server_config, /* merge server config */ cgi_cmds, /* command table */ cgi_handlers, /* handlers */ translate_scriptalias, /* filename translation */ NULL, /* check_user_id */ NULL, /* check auth */ NULL, /* check access */ type_scriptalias, /* type_checker */ NULL, /* fixups */ NULL, /* logger */ NULL /* header parser */ };
The sole argument to handlers is a request_rec
This structure describes a particular request which has been made to the
server, on behalf of a client. In most cases, each connection to the
client generates only one request_rec
The request_rec
contains pointers to a resource pool
which will be cleared when the server is finished handling the request;
to structures containing per-server and per-connection information, and
most importantly, information on the request itself.
The most important such information is a small set of character strings describing attributes of the object being requested, including its URI, filename, content-type and content-encoding (these being filled in by the translation and type-check handlers which handle the request, respectively).
Other commonly used data items are tables giving the MIME headers on
the client's original request, MIME headers to be sent back with the
response (which modules can add to at will), and environment variables for
any subprocesses which are spawned off in the course of servicing the
request. These tables are manipulated using the ap_table_get
and ap_table_set
Note that the Content-type
header value cannot
be set by module content-handlers using the ap_table_*()
routines. Rather, it is set by pointing the content_type
field in the request_rec
structure to an appropriate
string. e.g.,
r->content_type = "text/html";
Finally, there are pointers to two data structures which, in turn,
point to per-module configuration structures. Specifically, these hold
pointers to the data structures which the module has built to describe
the way it has been configured to operate in a given directory (via
files or <Directory>
sections), for private data it has built in the
course of servicing the request (so modules' handlers for one phase can
pass `notes' to their handlers for other phases). There is another such
configuration vector in the server_rec
data structure pointed
to by the request_rec
, which contains per (virtual) server
configuration data.
Here is an abridged declaration, giving the fields most commonly used:
struct request_rec {
pool *pool;
conn_rec *connection;
server_rec *server;
/* What object is being requested */
char *uri;
char *filename;
char *path_info;
char *args; /* QUERY_ARGS, if any */ struct stat finfo; /* Set by server core; * st_mode set to zero if no such file */
char *content_type;
char *content_encoding;
/* MIME header environments, in and out. Also,
* an array containing environment variables to
* be passed to subprocesses, so people can write
* modules to add to that environment.
* The difference between headers_out and
* err_headers_out is that the latter are printed
* even on error, and persist across internal
* redirects (so the headers printed for
* ErrorDocument
handlers will have
table *headers_in;
table *headers_out;
table *err_headers_out;
table *subprocess_env;
/* Info about the request itself... */
int header_only; /* HEAD request, as opposed to GET */ char *protocol; /* Protocol, as given to us, or HTTP/0.9 */ char *method; /* GET, HEAD, POST, etc. */ int method_number; /* M_GET, M_POST, etc. */
/* Info for logging */
char *the_request;
int bytes_sent;
/* A flag which modules can set, to indicate that
* the data being returned is volatile, and clients
* should be told not to cache it.
int no_cache;
/* Various other config info which may change
* with .htaccess files
* These are config vectors, with one void*
* pointer for each module (the thing pointed
* to being the module's business).
void *per_dir_config; /* Options set in config files, etc. */ void *request_config; /* Notes on *this* request */
Most request_rec
structures are built by reading an HTTP
request from a client, and filling in the fields. However, there are a
few exceptions:
file), or a CGI script which returned a local
`Location:', then the resource which the user requested is going to be
ultimately located by some URI other than what the client originally
supplied. In this case, the server does an internal redirect,
constructing a new request_rec
for the new URI, and
processing it almost exactly as if the client had requested the new URI
is in scope, the same internal redirect machinery comes into play.Finally, a handler occasionally needs to investigate `what would happen if' some other request were run. For instance, the directory indexing module needs to know what MIME type would be assigned to a request for each directory entry, in order to figure out what icon to use.
Such handlers can construct a sub-request, using the
functions ap_sub_req_lookup_file
, and ap_sub_req_method_uri
these construct a new request_rec
structure and processes it
as you would expect, up to but not including the point of actually sending
a response. (These functions skip over the access checks if the
sub-request is for a file in the same directory as the original
(Server-side includes work by building sub-requests and then actually
invoking the response handler for them, via the function
As discussed above, each handler, when invoked to handle a particular
, has to return an int
to indicate
what happened. That can either be
-- the request was handled successfully. This may or
may not terminate the phase.DECLINED
-- no erroneous condition exists, but the module
declines to handle the phase; the server tries to find another.Note that if the error code returned is REDIRECT
, then
the module should put a Location
in the request's
, to indicate where the client should be
redirected to.
Handlers for most phases do their work by simply setting a few fields
in the request_rec
structure (or, in the case of access
checkers, simply by returning the correct error code). However, response
handlers have to actually send a request back to the client.
They should begin by sending an HTTP response header, using the
function ap_send_http_header
. (You don't have to do anything
special to skip sending the header for HTTP/0.9 requests; the function
figures out on its own that it shouldn't do anything). If the request is
marked header_only
, that's all they should do; they should
return after that, without attempting any further output.
Otherwise, they should produce a request body which responds to the
client as appropriate. The primitives for this are ap_rputc
and ap_rprintf
, for internally generated output, and
, to copy the contents of some FILE *
straight to the client.
At this point, you should more or less understand the following piece
of code, which is the handler which handles GET
which have no more specific handler; it also shows how conditional
s can be handled, if it's desirable to do so in a
particular response handler -- ap_set_last_modified
against the If-modified-since
value supplied by the client,
if any, and returns an appropriate code (which will, if nonzero, be
USE_LOCAL_COPY). No similar considerations apply for
, but it returns an error code for
int default_handler (request_rec *r)
int errstatus;
FILE *f;
if (r->method_number != M_GET) return DECLINED;
if (r->finfo.st_mode == 0) return NOT_FOUND;
if ((errstatus = ap_set_content_length (r, r->finfo.st_size))
(errstatus = ap_set_last_modified (r, r->finfo.st_mtime)))
return errstatus;
f = fopen (r->filename, "r");
if (f == NULL) {
log_reason("file permissions deny server access", r->filename, r);
return FORBIDDEN;
register_timeout ("send", r);
ap_send_http_header (r);
if (!r->header_only) send_fd (f, r);
ap_pfclose (r->pool, f);
return OK;
Finally, if all of this is too much of a challenge, there are a few
ways out of it. First off, as shown above, a response handler which has
not yet produced any output can simply return an error code, in which
case the server will automatically produce an error response. Secondly,
it can punt to some other handler by invoking
, which is how the internal redirection
machinery discussed above is invoked. A response handler which has
internally redirected should always return OK
(Invoking ap_internal_redirect
from handlers which are
not response handlers will lead to serious confusion).
Stuff that should be discussed here in detail:
, and ap_requires
, which sets the
structure field
automatically, and ap_note_basic_auth_failure
which arranges for the proper WWW-Authenticate:
header to be sent back).When a request has internally redirected, there is the question of
what to log. Apache handles this by bundling the entire chain of redirects
into a list of request_rec
structures which are threaded
through the r->prev
and r->next
The request_rec
which is passed to the logging handlers in
such cases is the one which was originally built for the initial request
from the client; note that the bytes_sent
field will only be
correct in the last request in the chain (the one for which a response was
actually sent).
One of the problems of writing and designing a server-pool server is that of preventing leakage, that is, allocating resources (memory, open files, etc.), without subsequently releasing them. The resource pool machinery is designed to make it easy to prevent this from happening, by allowing resource to be allocated in such a way that they are automatically released when the server is done with them.
The way this works is as follows: the memory which is allocated, file opened, etc., to deal with a particular request are tied to a resource pool which is allocated for the request. The pool is a data structure which itself tracks the resources in question.
When the request has been processed, the pool is cleared. At that point, all the memory associated with it is released for reuse, all files associated with it are closed, and any other clean-up functions which are associated with the pool are run. When this is over, we can be confident that all the resource tied to the pool have been released, and that none of them have leaked.
Server restarts, and allocation of memory and resources for per-server configuration, are handled in a similar way. There is a configuration pool, which keeps track of resources which were allocated while reading the server configuration files, and handling the commands therein (for instance, the memory that was allocated for per-server module configuration, log files and other files that were opened, and so forth). When the server restarts, and has to reread the configuration files, the configuration pool is cleared, and so the memory and file descriptors which were taken up by reading them the last time are made available for reuse.
It should be noted that use of the pool machinery isn't generally
obligatory, except for situations like logging handlers, where you really
need to register cleanups to make sure that the log file gets closed when
the server restarts (this is most easily done by using the function ap_pfopen
, which also arranges for the
underlying file descriptor to be closed before any child processes, such as
for CGI scripts, are exec
ed), or in case you are using the
timeout machinery (which isn't yet even documented here). However, there are
two benefits to using it: resources allocated to a pool never leak (even if
you allocate a scratch string, and just forget about it); also, for memory
allocation, ap_palloc
is generally faster than
We begin here by describing how memory is allocated to pools, and then discuss how other resources are tracked by the resource pool machinery.
Memory is allocated to pools by calling the function
, which takes two arguments, one being a pointer to
a resource pool structure, and the other being the amount of memory to
allocate (in char
s). Within handlers for handling requests,
the most common way of getting a resource pool structure is by looking at
the pool
slot of the relevant request_rec
; hence
the repeated appearance of the following idiom in module code:
int my_handler(request_rec *r)
struct my_structure *foo;
foo = (foo *)ap_palloc (r->pool, sizeof(my_structure));
Note that there is no ap_pfree
ed memory is freed only when the associated resource
pool is cleared. This means that ap_palloc
does not have to
do as much accounting as malloc()
; all it does in the typical
case is to round up the size, bump a pointer, and do a range check.
(It also raises the possibility that heavy use of
could cause a server process to grow excessively
large. There are two ways to deal with this, which are dealt with below;
briefly, you can use malloc
, and try to be sure that all of
the memory gets explicitly free
d, or you can allocate a
sub-pool of the main pool, allocate your memory in the sub-pool, and clear
it out periodically. The latter technique is discussed in the section
on sub-pools below, and is used in the directory-indexing code, in order
to avoid excessive storage allocation when listing directories with
thousands of files).
There are functions which allocate initialized memory, and are
frequently useful. The function ap_pcalloc
has the same
interface as ap_palloc
, but clears out the memory it
allocates before it returns it. The function ap_pstrdup
takes a resource pool and a char *
as arguments, and
allocates memory for a copy of the string the pointer points to, returning
a pointer to the copy. Finally ap_pstrcat
is a varargs-style
function, which takes a pointer to a resource pool, and at least two
char *
arguments, the last of which must be
. It allocates enough memory to fit copies of each of
the strings, as a unit; for instance:
ap_pstrcat (r->pool, "foo", "/", "bar", NULL);
returns a pointer to 8 bytes worth of memory, initialized to
A pool is really defined by its lifetime more than anything else. There are some static pools in http_main which are passed to various non-http_main functions as arguments at opportune times. Here they are:
For almost everything folks do, r->pool
is the pool to
use. But you can see how other lifetimes, such as pchild, are useful to
some modules... such as modules that need to open a database connection
once per child, and wish to clean it up when the child dies.
You can also see how some bugs have manifested themself, such as
setting connection->user
to a value from
-- in this case connection exists for the
lifetime of ptrans
, which is longer than
(especially if r->pool
is a
subrequest!). So the correct thing to do is to allocate from
And there was another interesting bug in mod_include
/ mod_cgi
. You'll see in those that they do this test
to decide if they should use r->pool
. In this case the resource that they are
registering for cleanup is a child process. If it were registered in
, then the code would wait()
for the
child when the subrequest finishes. With mod_include
could be any old #include
, and the delay can be up to 3
seconds... and happened quite frequently. Instead the subprocess is
registered in r->main->pool
which causes it to be
cleaned up when the entire request is done -- i.e., after the
output has been sent to the client and logging has happened.
As indicated above, resource pools are also used to track other sorts
of resources besides memory. The most common are open files. The routine
which is typically used for this is ap_pfopen
, which takes a
resource pool and two strings as arguments; the strings are the same as
the typical arguments to fopen
, e.g.,
FILE *f = ap_pfopen (r->pool, r->filename, "r");
if (f == NULL) { ... } else { ... }
There is also a ap_popenf
routine, which parallels the
lower-level open
system call. Both of these routines arrange
for the file to be closed when the resource pool in question is
Unlike the case for memory, there are functions to close files
allocated with ap_pfopen
, and ap_popenf
, namely
and ap_pclosef
. (This is because, on
many systems, the number of files which a single process can have open is
quite limited). It is important to use these functions to close files
allocated with ap_pfopen
and ap_popenf
, since to
do otherwise could cause fatal errors on systems such as Linux, which
react badly if the same FILE*
is closed more than once.
(Using the close
functions is not mandatory, since the
file will eventually be closed regardless, but you should consider it in
cases where your module is opening, or could open, a lot of files).
More text goes here. Describe the cleanup primitives in terms of
which the file stuff is implemented; also, spawn_process
Pool cleanups live until clear_pool()
is called:
recursively calls destroy_pool()
on all subpools of a
; then calls all the cleanups for
; then releases all the memory for a
calls clear_pool(a)
and then
releases the pool structure itself. i.e.,
doesn't delete a
, it just frees
up all the resources and you can start using it again immediately.
On rare occasions, too-free use of ap_palloc()
and the
associated primitives may result in undesirably profligate resource
allocation. You can deal with such a case by creating a sub-pool,
allocating within the sub-pool rather than the main pool, and clearing or
destroying the sub-pool, which releases the resources which were
associated with it. (This really is a rare situation; the only
case in which it comes up in the standard module set is in case of listing
directories, and then only with very large directories.
Unnecessary use of the primitives discussed here can hair up your code
quite a bit, with very little gain).
The primitive for creating a sub-pool is ap_make_sub_pool
which takes another pool (the parent pool) as an argument. When the main
pool is cleared, the sub-pool will be destroyed. The sub-pool may also be
cleared or destroyed at any time, by calling the functions
and ap_destroy_pool
, respectively.
(The difference is that ap_clear_pool
frees resources
associated with the pool, while ap_destroy_pool
deallocates the pool itself. In the former case, you can allocate new
resources within the pool, and clear it again, and so forth; in the
latter case, it is simply gone).
One final note -- sub-requests have their own resource pools, which are
sub-pools of the resource pool for the main request. The polite way to
reclaim the resources associated with a sub request which you have
allocated (using the ap_sub_req_...
functions) is
, which frees the resource pool. Before
calling this function, be sure to copy anything that you care about which
might be allocated in the sub-request's resource pool into someplace a
little less volatile (for instance, the filename in its
(Again, under most circumstances, you shouldn't feel obliged to call
this function; only 2K of memory or so are allocated for a typical sub
request, and it will be freed anyway when the main request pool is
cleared. It is only when you are allocating many, many sub-requests for a
single main request that you should seriously consider the
One of the design goals for this server was to maintain external compatibility with the NCSA 1.3 server --- that is, to read the same configuration files, to process all the directives therein correctly, and in general to be a drop-in replacement for NCSA. On the other hand, another design goal was to move as much of the server's functionality into modules which have as little as possible to do with the monolithic server core. The only way to reconcile these goals is to move the handling of most commands from the central server into the modules.
However, just giving the modules command tables is not enough to divorce
them completely from the server core. The server has to remember the
commands in order to act on them later. That involves maintaining data which
is private to the modules, and which can be either per-server, or
per-directory. Most things are per-directory, including in particular access
control and authorization information, but also information on how to
determine file types from suffixes, which can be modified by
and ForceType
directives, and so forth. In general,
the governing philosophy is that anything which can be made
configurable by directory should be; per-server information is generally
used in the standard set of modules for information like
es and Redirect
s which come into play before the
request is tied to a particular place in the underlying file system.
Another requirement for emulating the NCSA server is being able to handle
the per-directory configuration files, generally called
files, though even in the NCSA server they can
contain directives which have nothing at all to do with access control.
Accordingly, after URI -> filename translation, but before performing any
other phase, the server walks down the directory hierarchy of the underlying
filesystem, following the translated pathname, to read any
files which might be present. The information which
is read in then has to be merged with the applicable information
from the server's own config files (either from the <Directory>
sections in
, or from defaults in srm.conf
, which
actually behaves for most purposes almost exactly like <Directory
Finally, after having served a request which involved reading
files, we need to discard the storage allocated for
handling them. That is solved the same way it is solved wherever else
similar problems come up, by tying those structures to the per-transaction
resource pool.
Let's look out how all of this plays out in mod_mime.c
which defines the file typing handler which emulates the NCSA server's
behavior of determining file types from suffixes. What we'll be looking
at, here, is the code which implements the AddType
and AddEncoding
commands. These commands can appear in
files, so they must be handled in the module's
private per-directory data, which in fact, consists of two separate
tables for MIME types and encoding information, and is declared as
typedef struct { table *forced_types; /* Additional AddTyped stuff */ table *encoding_types; /* Added with AddEncoding... */ } mime_dir_config;
When the server is reading a configuration file, or <Directory>
section, which includes
one of the MIME module's commands, it needs to create a
structure, so those commands have something
to act on. It does this by invoking the function it finds in the module's
`create per-dir config slot', with two arguments: the name of the
directory to which this configuration information applies (or
for srm.conf
), and a pointer to a
resource pool in which the allocation should happen.
(If we are reading a .htaccess
file, that resource pool
is the per-request resource pool for the request; otherwise it is a
resource pool which is used for configuration data, and cleared on
restarts. Either way, it is important for the structure being created to
vanish when the pool is cleared, by registering a cleanup on the pool if
For the MIME module, the per-dir config creation function just
s the structure above, and a creates a couple of
tables to fill it. That looks like this:
void *create_mime_dir_config (pool *p, char *dummy)
mime_dir_config *new =
(mime_dir_config *) ap_palloc (p, sizeof(mime_dir_config));
new->forced_types = ap_make_table (p, 4);
new->encoding_types = ap_make_table (p, 4);
return new;
Now, suppose we've just read in a .htaccess
file. We
already have the per-directory configuration structure for the next
directory up in the hierarchy. If the .htaccess
file we just
read in didn't have any AddType
or AddEncoding
commands, its
per-directory config structure for the MIME module is still valid, and we
can just use it. Otherwise, we need to merge the two structures
To do that, the server invokes the module's per-directory config merge function, if one is present. That function takes three arguments: the two structures being merged, and a resource pool in which to allocate the result. For the MIME module, all that needs to be done is overlay the tables from the new per-directory config structure with those from the parent:
void *merge_mime_dir_configs (pool *p, void *parent_dirv, void *subdirv)
mime_dir_config *parent_dir = (mime_dir_config *)parent_dirv;
mime_dir_config *subdir = (mime_dir_config *)subdirv;
mime_dir_config *new =
(mime_dir_config *)ap_palloc (p, sizeof(mime_dir_config));
new->forced_types = ap_overlay_tables (p, subdir->forced_types,
new->encoding_types = ap_overlay_tables (p, subdir->encoding_types,
return new;
As a note -- if there is no per-directory merge function present, the
server will just use the subdirectory's configuration info, and ignore
the parent's. For some modules, that works just fine (e.g., for
the includes module, whose per-directory configuration information
consists solely of the state of the XBITHACK
), and for those
modules, you can just not declare one, and leave the corresponding
structure slot in the module itself NULL
Now that we have these structures, we need to be able to figure out how
to fill them. That involves processing the actual AddType
and AddEncoding
commands. To find commands, the server looks in
the module's command table. That table contains information on how many
arguments the commands take, and in what formats, where it is permitted,
and so forth. That information is sufficient to allow the server to invoke
most command-handling functions with pre-parsed arguments. Without further
ado, let's look at the AddType
command handler, which looks like this (the AddEncoding
command looks basically the same, and won't be
shown here):
char *add_type(cmd_parms *cmd, mime_dir_config *m, char *ct, char *ext)
if (*ext == '.') ++ext;
ap_table_set (m->forced_types, ext, ct);
return NULL;
This command handler is unusually simple. As you can see, it takes
four arguments, two of which are pre-parsed arguments, the third being the
per-directory configuration structure for the module in question, and the
fourth being a pointer to a cmd_parms
structure. That
structure contains a bunch of arguments which are frequently of use to
some, but not all, commands, including a resource pool (from which memory
can be allocated, and to which cleanups should be tied), and the (virtual)
server being configured, from which the module's per-server configuration
data can be obtained if required.
Another way in which this particular command handler is unusually
simple is that there are no error conditions which it can encounter. If
there were, it could return an error message instead of NULL
this causes an error to be printed out on the server's
, followed by a quick exit, if it is in the main config
files; for a .htaccess
file, the syntax error is logged in
the server error log (along with an indication of where it came from), and
the request is bounced with a server error response (HTTP error status,
code 500).
The MIME module's command table has entries for these commands, which look like this:
command_rec mime_cmds[] = {
{ "AddType", add_type, NULL, OR_FILEINFO, TAKE2,
"a mime type followed by a file extension" },
{ "AddEncoding", add_encoding, NULL, OR_FILEINFO, TAKE2,
"an encoding (e.g., gzip), followed by a file extension" },
The entries in these tables are:
(void *)
pointer, which is passed in the
structure to the command handler ---
this is useful in case many similar commands are handled by
the same function.AllowOverride
option, and an additional mask
bit, RSRC_CONF
, indicating that the command may
appear in the server's own config files, but not in
any .htaccess
indicates two pre-parsed arguments. Other
options are TAKE1
, which indicates one
pre-parsed argument, FLAG
, which indicates that
the argument should be On
or Off
and is passed in as a boolean flag, RAW_ARGS
which causes the server to give the command the raw, unparsed
arguments (everything but the command name itself). There is
also ITERATE
, which means that the handler looks
the same as TAKE1
, but that if multiple
arguments are present, it should be called multiple times,
and finally ITERATE2
, which indicates that the
command handler looks like a TAKE2
, but if more
arguments are present, then it should be called multiple
times, holding the first argument constant.NULL
).Finally, having set this all up, we have to use it. This is ultimately
done in the module's handlers, specifically for its file-typing handler,
which looks more or less like this; note that the per-directory
configuration structure is extracted from the request_rec
per-directory configuration vector by using the
int find_ct(request_rec *r)
int i;
char *fn = ap_pstrdup (r->pool, r->filename);
mime_dir_config *conf = (mime_dir_config *)
ap_get_module_config(r->per_dir_config, &mime_module);
char *type;
if (S_ISDIR(r->finfo.st_mode)) {
r->content_type = DIR_MAGIC_TYPE;
return OK;
if((i=ap_rind(fn,'.')) < 0) return DECLINED;
if ((type = ap_table_get (conf->encoding_types, &fn[i])))
r->content_encoding = type;
/* go back to previous extension to try to use it as a type */
fn[i-1] = '\0';
if((i=ap_rind(fn,'.')) < 0) return OK;
if ((type = ap_table_get (conf->forced_types, &fn[i])))
r->content_type = type;
return OK;
The basic ideas behind per-server module configuration are basically the same as those for per-directory configuration; there is a creation function and a merge function, the latter being invoked where a virtual server has partially overridden the base server configuration, and a combined structure must be computed. (As with per-directory configuration, the default if no merge function is specified, and a module is configured in some virtual server, is that the base configuration is simply ignored).
The only substantial difference is that when a command needs to
configure the per-server private module data, it needs to go to the
data to get at it. Here's an example, from the
alias module, which also indicates how a syntax error can be returned
(note that the per-directory configuration argument to the command
handler is declared as a dummy, since the module doesn't actually have
per-directory config data):
char *add_redirect(cmd_parms *cmd, void *dummy, char *f, char *url)
server_rec *s = cmd->server;
alias_server_conf *conf = (alias_server_conf *)
alias_entry *new = ap_push_array (conf->redirects);
if (!ap_is_url (url)) return "Redirect to non-URL";
new->fake = f; new->real = url;
return NULL;
Available Languages: en